1 #ifndef __JTOOLS__JMULTIMAP__
2 #define __JTOOLS__JMULTIMAP__
24 namespace JPP {
using namespace JTOOLS; }
48 template<
class JAbscissa_t,
58 template<
class JAbscissa_t,
60 template<
class,
class,
class>
class JHead_t,
64 public JHead_t<JAbscissa_t, JMultiMap<JAbscissa_t, JOrdinate_t, JTail_t, JDistance_t>, JDistance_t>,
65 public JMath< JMultiMap<JAbscissa_t, JOrdinate_t, JMapList<JHead_t, JTail_t>, JDistance_t> >
71 typedef JHead_t<JAbscissa_t,
87 using map_type::insert;
107 static_cast<map_type&
>(*this).add(static_cast<const map_type&>(map));
121 static_cast<map_type&
>(*this).sub(static_cast<const map_type&>(map));
135 static_cast<map_type&
>(*this).mul(value);
148 static_cast<map_type&
>(*this).div(value);
160 template<
class JFunction_t>
165 for (
iterator i = this->begin(); i != this->end(); ++i) {
166 i->getY().for_each(
function);
188 template<
unsigned int N,
unsigned int M>
193 for (
iterator i = this->begin(); i != this->end(); ++i) {
203 template<
class first_iterator,
class second_iterator>
204 struct iterator_base :
205 public JEquals< iterator_base<first_iterator, second_iterator> >
216 struct pointer_type :
217 private JPair<const key_type, second_iterator&>
249 return pointer_type(i->getX(), second);
270 bool equals(
const iterator_base& cursor)
const
272 return i == cursor.i && (i ==
range.second || second.equals(cursor.second));
294 return this->second.getValue();
308 template<
class first_iterator,
class second_iterator>
309 struct iterator_helper :
310 public iterator_base<first_iterator, second_iterator>,
327 first_iterator __end)
329 this->
range = std::make_pair(__begin, __end);
333 this->second = this->i->getY().super_begin();
335 if (this->second != this->i->getY().super_end()) {
349 if (!this->second.increment()) {
351 while (++(this->i) != this->
range.second) {
353 this->second = this->i->getY().super_begin();
355 if (this->second != this->i->getY().super_end()) {
361 return this->i != this->
range.second;
369 template<
class first_iterator,
class second_iterator>
370 struct reverse_iterator_helper :
371 public iterator_base<first_iterator, second_iterator>,
372 public JForwardIterator< reverse_iterator_helper<first_iterator, second_iterator> >
388 first_iterator __end)
390 this->
range = std::make_pair(__begin, __end);
394 this->second = this->i->getY().super_rbegin();
396 if (this->second != this->i->getY().super_rend()) {
410 if (!this->second.increment()) {
412 while (++(this->i) != this->
range.second) {
414 this->second = this->i->getY().super_rbegin();
416 if (this->second != this->i->getY().super_rend()) {
422 return this->i != this->
range.second;
428 class super_const_iterator;
434 struct super_iterator :
435 public iterator_helper<iterator, typename mapped_type::super_iterator>
439 friend class super_const_iterator;
464 struct super_const_iterator :
465 public iterator_helper<const_iterator, typename mapped_type::super_const_iterator>,
466 public JEquals<super_const_iterator, super_iterator>
485 this->
range = cursor.range;
487 this->second = cursor.second;
497 bool equals(
const super_const_iterator& cursor)
const
499 return static_cast<const iterator_base<const_iterator, typename mapped_type::super_const_iterator>&
>(*this).equals(cursor);
509 bool equals(
const super_iterator& cursor)
const
511 return equals(super_const_iterator(cursor));
528 class super_const_reverse_iterator;
534 struct super_reverse_iterator :
535 public reverse_iterator_helper<reverse_iterator, typename mapped_type::super_reverse_iterator>
539 friend class super_const_reverse_iterator;
564 struct super_const_reverse_iterator :
565 public reverse_iterator_helper<const_reverse_iterator, typename mapped_type::super_const_reverse_iterator>,
566 public JEquals<super_const_reverse_iterator, super_reverse_iterator>
585 this->
range = cursor.range;
587 this->second = cursor.second;
597 bool equals(
const super_const_reverse_iterator& cursor)
const
599 return static_cast<const iterator_base<const_reverse_iterator, typename mapped_type::super_const_reverse_iterator>&
>(*this).equals(cursor);
609 bool equals(
const super_reverse_iterator& cursor)
const
611 return equals(super_const_reverse_iterator(cursor));
635 return super_const_iterator(this->begin(), this->end());
646 return super_const_reverse_iterator(this->rbegin(), this->rend());
657 return super_const_iterator(this->end(), this->end());
668 return super_const_reverse_iterator(this->rend(), this->rend());
679 return super_iterator(this->begin(), this->end());
690 return super_reverse_iterator(this->rbegin(), this->rend());
701 return super_iterator(this->end(), this->end());
712 return super_reverse_iterator(this->rend(), this->rend());
724 return this->
get(key.first).
get(key.second);
736 (*this)[key.first].insert(key.second, value);
766 template<
class JAbscissa_t,
768 template<
class,
class,
class>
class JHead_t,
771 public JHead_t<JAbscissa_t, JOrdinate_t, JDistance_t>,
772 public JMath< JMultiMap<JAbscissa_t, JOrdinate_t, JMapList<JHead_t, JLANG::JNullType>, JDistance_t> >
776 enum { NUMBER_OF_DIMENSIONS = 1 };
778 typedef JHead_t<JAbscissa_t, JOrdinate_t, JDistance_t>
map_type;
792 using map_type::insert;
812 static_cast<map_type&
>(*this).add(static_cast<const map_type&>(map));
826 static_cast<map_type&
>(*this).sub(static_cast<const map_type&>(map));
840 static_cast<map_type&
>(*this).mul(value);
853 static_cast<map_type&
>(*this).div(value);
865 template<
class JFunction_t>
889 template<
unsigned int N,
unsigned int M>
900 template<
class iterator_type,
class ordinate_type>
901 struct iterator_helper :
902 public JEquals < iterator_helper<iterator_type, ordinate_type> >,
914 struct pointer_type :
915 private JPair<const key_type, value_type>
954 iterator_type __end) :
955 range(__begin, __end),
967 return pointer_type(i->getX(), i->getY());
988 bool equals(
const iterator_helper& cursor)
const
990 return i == cursor.i;
1001 return ++i !=
range.second;
1033 class super_const_iterator;
1039 struct super_iterator :
1040 public iterator_helper<iterator, ordinate_type&>
1044 friend class super_const_iterator;
1069 struct super_const_iterator :
1070 public iterator_helper<const_iterator, const ordinate_type&>,
1071 public JEquals<super_const_iterator, super_iterator>
1090 this->
range = cursor.range;
1101 bool equals(
const super_const_iterator& cursor)
const
1103 return this->i == cursor.i;
1113 bool equals(
const super_iterator& cursor)
const
1115 return this->i == cursor.i;
1132 class super_const_reverse_iterator;
1138 struct super_reverse_iterator :
1139 public iterator_helper<reverse_iterator, ordinate_type&>
1143 friend class super_const_reverse_iterator;
1168 struct super_const_reverse_iterator :
1169 public iterator_helper<const_reverse_iterator, const ordinate_type&>,
1170 public JEquals<super_const_reverse_iterator, super_reverse_iterator>
1189 this->
range = cursor.range;
1200 bool equals(
const super_const_reverse_iterator& cursor)
const
1202 return this->i == cursor.i;
1212 bool equals(
const super_reverse_iterator& cursor)
const
1214 return this->i == cursor.i;
1238 return super_const_iterator(this->begin(), this->end());
1249 return super_const_reverse_iterator(this->rbegin(), this->rend());
1260 return super_const_iterator(this->end(), this->end());
1271 return super_const_reverse_iterator(this->rend(), this->rend());
1282 return super_iterator(this->begin(), this->end());
1293 return super_reverse_iterator(this->rbegin(), this->rend());
1304 return super_iterator(this->end(), this->end());
1315 return super_reverse_iterator(this->rend(), this->rend());
1327 return get(key.first);
Template interface for method bool increment().
Auxiliary base class for aritmetic operations of derived class types.
T get(const JHead &header)
Get object from header.
then usage $script< detector file >< detectorfile > nIf the range of floors is the first detector file is aligned to the second before the comparison nIn this
Template definition of auxiliary base class for comparison of data structures.
Auxiliary class for no type definition.
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
Base class for data structures with artithmetic capabilities.
bool equals(const JFirst_t &first, const JSecond_t &second, const double precision=std::numeric_limits< double >::min())
Check equality.