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);
159 template<
class JFunction_t>
164 for (
iterator i = this->begin();
i != this->end(); ++
i) {
165 i->getY().for_each(
function);
187 template<
unsigned int N,
unsigned int M>
192 for (
iterator i = this->begin();
i != this->end(); ++
i) {
202 template<
class first_iterator,
class second_iterator>
203 struct iterator_base :
204 public JEquals< iterator_base<first_iterator, second_iterator> >
215 struct pointer_type :
216 private JPair<const key_type, second_iterator&>
248 return pointer_type(
i->getX(), second);
269 bool equals(
const iterator_base& cursor)
const
271 return i == cursor.i && (
i ==
range.second || second.equals(cursor.second));
293 return this->second.getValue();
307 template<
class first_iterator,
class second_iterator>
308 struct iterator_helper :
309 public iterator_base<first_iterator, second_iterator>,
326 first_iterator __end)
328 this->
range = std::make_pair(__begin, __end);
332 this->second = this->
i->getY().super_begin();
334 if (this->second != this->
i->getY().super_end()) {
348 if (!this->second.increment()) {
350 while (++(this->
i) != this->
range.second) {
352 this->second = this->
i->getY().super_begin();
354 if (this->second != this->
i->getY().super_end()) {
360 return this->
i != this->
range.second;
368 template<
class first_iterator,
class second_iterator>
369 struct reverse_iterator_helper :
370 public iterator_base<first_iterator, second_iterator>,
371 public JForwardIterator< reverse_iterator_helper<first_iterator, second_iterator> >
387 first_iterator __end)
389 this->
range = std::make_pair(__begin, __end);
393 this->second = this->
i->getY().super_rbegin();
395 if (this->second != this->
i->getY().super_rend()) {
409 if (!this->second.increment()) {
411 while (++(this->
i) != this->
range.second) {
413 this->second = this->
i->getY().super_rbegin();
415 if (this->second != this->
i->getY().super_rend()) {
421 return this->
i != this->
range.second;
427 class super_const_iterator;
433 class super_iterator :
434 public iterator_helper<iterator, typename mapped_type::super_iterator>
438 friend class super_const_iterator;
463 class super_const_iterator :
464 public iterator_helper<const_iterator, typename mapped_type::super_const_iterator>,
465 public JEquals<super_const_iterator, super_iterator>
484 this->
range = cursor.range;
486 this->second = cursor.second;
496 bool equals(
const super_const_iterator& cursor)
const
498 return static_cast<const iterator_base<const_iterator, typename mapped_type::super_const_iterator>&
>(*this).equals(cursor);
508 bool equals(
const super_iterator& cursor)
const
510 return equals(super_const_iterator(cursor));
527 class super_const_reverse_iterator;
533 class super_reverse_iterator :
534 public reverse_iterator_helper<reverse_iterator, typename mapped_type::super_reverse_iterator>
538 friend class super_const_reverse_iterator;
563 class super_const_reverse_iterator :
564 public reverse_iterator_helper<const_reverse_iterator, typename mapped_type::super_const_reverse_iterator>,
565 public JEquals<super_const_reverse_iterator, super_reverse_iterator>
584 this->
range = cursor.range;
586 this->second = cursor.second;
596 bool equals(
const super_const_reverse_iterator& cursor)
const
598 return static_cast<const iterator_base<const_reverse_iterator, typename mapped_type::super_const_reverse_iterator>&
>(*this).equals(cursor);
608 bool equals(
const super_reverse_iterator& cursor)
const
610 return equals(super_const_reverse_iterator(cursor));
634 return super_const_iterator(this->begin(), this->end());
645 return super_const_reverse_iterator(this->rbegin(), this->rend());
656 return super_const_iterator(this->end(), this->end());
667 return super_const_reverse_iterator(this->rend(), this->rend());
678 return super_iterator(this->begin(), this->end());
689 return super_reverse_iterator(this->rbegin(), this->rend());
700 return super_iterator(this->end(), this->end());
711 return super_reverse_iterator(this->rend(), this->rend());
723 return this->
get(key.first).
get(key.second);
735 (*this)[key.first].insert(key.second, value);
765 template<
class JAbscissa_t,
767 template<
class,
class,
class>
class JHead_t,
770 public JHead_t<JAbscissa_t, JOrdinate_t, JDistance_t>,
771 public JMath< JMultiMap<JAbscissa_t, JOrdinate_t, JMapList<JHead_t, JLANG::JNullType>, JDistance_t> >
775 enum { NUMBER_OF_DIMENSIONS = 1 };
777 typedef JHead_t<JAbscissa_t, JOrdinate_t, JDistance_t>
map_type;
791 using map_type::insert;
811 static_cast<map_type&
>(*this).add(static_cast<const map_type&>(map));
825 static_cast<map_type&
>(*this).sub(static_cast<const map_type&>(map));
839 static_cast<map_type&
>(*this).mul(value);
852 static_cast<map_type&
>(*this).div(value);
863 template<
class JFunction_t>
887 template<
unsigned int N,
unsigned int M>
898 template<
class iterator_type,
class ordinate_type>
899 struct iterator_helper :
900 public JEquals < iterator_helper<iterator_type, ordinate_type> >,
912 struct pointer_type :
913 private JPair<const key_type, value_type>
952 iterator_type __end) :
953 range(__begin, __end),
965 return pointer_type(
i->getX(),
i->getY());
986 bool equals(
const iterator_helper& cursor)
const
988 return i == cursor.i;
999 return ++
i !=
range.second;
1031 class super_const_iterator;
1037 class super_iterator :
1038 public iterator_helper<iterator, ordinate_type&>
1042 friend class super_const_iterator;
1067 class super_const_iterator :
1068 public iterator_helper<const_iterator, const ordinate_type&>,
1069 public JEquals<super_const_iterator, super_iterator>
1088 this->
range = cursor.range;
1099 bool equals(
const super_const_iterator& cursor)
const
1101 return this->
i == cursor.i;
1111 bool equals(
const super_iterator& cursor)
const
1113 return this->
i == cursor.i;
1130 class super_const_reverse_iterator;
1136 class super_reverse_iterator :
1137 public iterator_helper<reverse_iterator, ordinate_type&>
1141 friend class super_const_reverse_iterator;
1166 class super_const_reverse_iterator :
1167 public iterator_helper<const_reverse_iterator, const ordinate_type&>,
1168 public JEquals<super_const_reverse_iterator, super_reverse_iterator>
1187 this->
range = cursor.range;
1198 bool equals(
const super_const_reverse_iterator& cursor)
const
1200 return this->
i == cursor.i;
1210 bool equals(
const super_reverse_iterator& cursor)
const
1212 return this->
i == cursor.i;
1236 return super_const_iterator(this->begin(), this->end());
1247 return super_const_reverse_iterator(this->rbegin(), this->rend());
1258 return super_const_iterator(this->end(), this->end());
1269 return super_const_reverse_iterator(this->rend(), this->rend());
1280 return super_iterator(this->begin(), this->end());
1291 return super_reverse_iterator(this->rbegin(), this->rend());
1302 return super_iterator(this->end(), this->end());
1313 return super_reverse_iterator(this->rend(), this->rend());
1325 return get(key.first);
Template interface for method bool increment().
Auxiliary base class for aritmetic operations of derived class types.
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.