1 #ifndef JLE_CONTAINERS_MAP_GUARD 2 #define JLE_CONTAINERS_MAP_GUARD 9 #include "container_support.h" 10 #include "core/alarm.h" 19 template<
typename key_type,
typename T>
33 iterator() : registered_owner(0), last_updated_container(0) {};
36 bool operator==(
const iterator& it)
const;
37 bool operator!=(
const iterator& it)
const;
39 std::pair<const key_type, T>* operator->(
void);
40 std::pair<const key_type, T>& operator*(
void);
43 typename std::map<key_type, T>::iterator iiterator;
44 typename std::map<key_type, T>::iterator i_end_iterator;
46 int last_updated_container;
48 bool is_valid (
void)
const;
60 const_iterator() : registered_owner(0), last_updated_container(0) {};
62 iiterator (it.iiterator),
63 i_end_iterator (it.i_end_iterator),
64 registered_owner(it.registered_owner),
65 last_updated_container(it.last_updated_container)
68 const_iterator& operator=(
const iterator& it)
70 registered_owner = it.registered_owner;
71 last_updated_container = it.last_updated_container;
72 iiterator = it.iiterator;
73 i_end_iterator = it.i_end_iterator;
77 const_iterator& operator++();
78 const_iterator operator++(
int);
79 bool operator==(
const const_iterator& it)
const;
80 bool operator!=(
const const_iterator& it)
const;
82 const std::pair<const key_type, T>* operator->(
void);
83 const std::pair<const key_type, T>& operator*(
void);
86 typename std::map<key_type, T>::const_iterator iiterator;
87 typename std::map<key_type, T>::const_iterator i_end_iterator;
89 int last_updated_container;
91 bool is_valid (
void)
const;
98 map() : registered_as(internal_for_containers::register_container(
true)) {};
102 internal_for_containers::unregister_container(registered_as);
103 } JLE_CATCH_CALLFUNCION(jle::alarm_msg,
"exception on destructor",
"catched exception on destructor")
106 map(std::initializer_list<T> il) : imap(il), registered_as(internal_for_containers::register_container(
true)) {};
115 bool operator< ( const map<key_type, T>& rhs ) {
return imap < rhs.imap; }
116 bool operator<=( const map<key_type, T>& rhs ) {
return imap <= rhs.imap; }
126 unsigned size ()
const;
130 T& operator[] (
const key_type& x);
135 unsigned count (
const key_type& x)
const;
138 iterator lower_bound (
const key_type& x);
140 iterator upper_bound (
const key_type& x);
152 unsigned erase (
const key_type& x);
155 std::pair<iterator, bool> insert (
const std::pair<key_type, T>& x );
158 std::map<key_type, T> imap;
171 template <
typename key_type,
typename T>
173 : registered_as (internal_for_containers::register_container( imap.empty() ?
true :
false))
176 if(imap.empty() ==
false)
177 internal_for_containers::register_container_size_change(registered_as);
180 template <
typename key_type,
typename T>
182 : registered_as (internal_for_containers::register_container( imap.empty() ?
true :
false))
184 imap = std::move(l.imap);
186 if (imap.empty() ==
false)
187 internal_for_containers::register_container_size_change(registered_as);
191 template <
typename key_type,
typename T>
195 registered_as = internal_for_containers::register_container( imap.empty() ?
true :
false);
196 if(imap.empty() ==
false)
197 internal_for_containers::register_container_size_change(registered_as);
201 template <
typename key_type,
typename T>
204 imap = std::move(v.imap);
205 registered_as = internal_for_containers::register_container( imap.empty() ?
true :
false);
206 if (imap.empty() ==
false)
207 internal_for_containers::register_container_size_change(registered_as);
214 template <
typename key_type,
typename T>
217 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
223 template <
typename key_type,
typename T>
227 it.iiterator = imap.begin();
229 it.registered_owner = registered_as;
230 it.i_end_iterator = imap.end();
232 if (imap.empty()==
false)
233 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
235 it.last_updated_container = 0;
241 template <
typename key_type,
typename T>
245 it.iiterator = imap.end();
246 it.registered_owner = registered_as;
247 it.i_end_iterator = imap.end();
248 it.last_updated_container = 0;
255 template <
typename key_type,
typename T>
258 if (is_valid() ==
false)
259 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
261 if (i_end_iterator == iiterator)
262 throw jle::alarm(JLE_HERE,
"map",
"++ on end iterator", jle::al::priority::error);
268 template <
typename key_type,
typename T>
273 if (is_valid() ==
false)
274 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
276 if (i_end_iterator == iiterator)
277 throw jle::alarm(JLE_HERE,
"map",
"++ on end iterator", jle::al::priority::error);
283 template <
typename key_type,
typename T>
286 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
287 throw jle::alarm(JLE_HERE,
"map",
"on different owners", jle::al::priority::error);
289 return it.iiterator == iiterator;
292 template <
typename key_type,
typename T>
295 return !operator==(it);
299 template <
typename key_type,
typename T>
302 if (last_updated_container==0
303 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container
304 || internal_for_containers::get_registered_container_last_size_change(registered_owner) == 0)
305 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
307 if (i_end_iterator == iiterator)
308 throw jle::alarm(JLE_HERE,
"map",
"-> on end iterator", jle::al::priority::error);
310 return iiterator.operator->();
313 template <
typename key_type,
typename T>
316 if (last_updated_container==0
317 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container
318 || internal_for_containers::get_registered_container_last_size_change(registered_owner) == 0)
319 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
321 if (i_end_iterator == iiterator)
322 throw jle::alarm(JLE_HERE,
"map",
"* on end iterator", jle::al::priority::error);
339 template <
typename key_type,
typename T>
342 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
349 template <
typename key_type,
typename T>
353 it.iiterator = imap.begin();
355 it.registered_owner = registered_as;
356 it.i_end_iterator = imap.end();
358 if (imap.empty()==
false)
359 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
361 it.last_updated_container = 0;
367 template <
typename key_type,
typename T>
371 it.registered_owner = registered_as;
372 it.i_end_iterator = imap.end();
373 it.iiterator = imap.end();
374 it.last_updated_container = 0;
381 template <
typename key_type,
typename T>
384 if (is_valid() ==
false)
385 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
387 if (i_end_iterator == iiterator)
388 throw jle::alarm(JLE_HERE,
"map",
"++ on end iterator", jle::al::priority::error);
394 template <
typename key_type,
typename T>
399 if (is_valid() ==
false)
400 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
402 if (i_end_iterator == iiterator)
403 throw jle::alarm(JLE_HERE,
"map",
"++ on end iterator", jle::al::priority::error);
409 template <
typename key_type,
typename T>
412 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
413 throw jle::alarm(JLE_HERE,
"map",
"on different owners", jle::al::priority::error);
415 return it.iiterator == iiterator;
418 template <
typename key_type,
typename T>
421 return !operator==(it);
425 template <
typename key_type,
typename T>
428 if (is_valid() ==
false)
429 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
431 if (i_end_iterator == iiterator)
432 throw jle::alarm(JLE_HERE,
"map",
"-> on end iterator", jle::al::priority::error);
434 return iiterator.operator->();
437 template <
typename key_type,
typename T>
440 if (is_valid() ==
false)
441 throw jle::alarm(JLE_HERE,
"map",
"iterator not valid", jle::al::priority::error);
443 if (i_end_iterator == iiterator)
444 throw jle::alarm(JLE_HERE,
"map",
"* on end iterator", jle::al::priority::error);
451 template <
typename key_type,
typename T>
457 template <
typename key_type,
typename T>
460 return unsigned(imap.size());
464 template <
typename key_type,
typename T>
467 if (find(x) == end())
468 internal_for_containers::register_container_size_change(registered_as);
473 template <
typename key_type,
typename T>
476 internal_for_containers::register_container_size_change(registered_as);
480 template <
typename key_type,
typename T>
483 return imap.count(x);
494 template <
typename key_type,
typename T>
499 it.iiterator = imap.find(x);
500 if (it.iiterator != imap.end())
502 it.registered_owner = registered_as;
503 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
504 it.i_end_iterator = imap.end();
508 it.registered_owner = 0;
509 it.last_updated_container = 0;
515 template <
typename key_type,
typename T>
520 it.iiterator = imap.find(x);
521 if (it.iiterator != imap.end())
523 it.registered_owner = registered_as;
524 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
525 it.i_end_iterator = imap.end();
529 it.registered_owner = 0;
530 it.last_updated_container = 0;
537 template <
typename key_type,
typename T>
542 it.iiterator = imap.lower_bound(x);
543 if (it.iiterator != imap.end())
545 it.registered_owner = registered_as;
546 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
547 it.i_end_iterator = imap.end();
551 it.registered_owner = 0;
552 it.last_updated_container = 0;
558 template <
typename key_type,
typename T>
563 it.iiterator = imap.lower_bound(x);
564 if (it.iiterator != imap.end())
566 it.registered_owner = registered_as;
567 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
568 it.i_end_iterator = imap.end();
572 it.registered_owner = 0;
573 it.last_updated_container = 0;
579 template <
typename key_type,
typename T>
584 it.iiterator = imap.upper_bound(x);
585 if (it.iiterator != imap.end())
587 it.registered_owner = registered_as;
588 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
589 it.i_end_iterator = imap.end();
593 it.registered_owner = 0;
594 it.last_updated_container = 0;
601 template <
typename key_type,
typename T>
606 it.iiterator = imap.upper_bound(x);
607 if (it.iiterator != imap.end())
609 it.registered_owner = registered_as;
610 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
611 it.i_end_iterator = imap.end();
615 it.registered_owner = 0;
616 it.last_updated_container = 0;
626 template <
typename key_type,
typename T>
629 internal_for_containers::register_container_size_change(registered_as);
630 return unsigned(imap.erase(x));
634 template <
typename key_type,
typename T>
637 if (position.registered_owner != registered_as)
638 throw jle::alarm(JLE_HERE,
"map",
"erase with extrange iterator", jle::al::priority::error);
639 if (position.iiterator == imap.end())
640 throw jle::alarm(JLE_HERE,
"map",
"erase over end iterator", jle::al::priority::error);
641 if (position.is_valid() ==
false)
642 throw jle::alarm(JLE_HERE,
"map",
"erase over iterator invalid", jle::al::priority::error);
646 internal_for_containers::register_container_size_change(registered_as);
649 result.iiterator = ++(position.iiterator);
650 --(position.iiterator);
651 imap.erase(position.iiterator);
653 result.registered_owner = registered_as;
654 result.i_end_iterator = imap.end();
655 if (imap.empty()==
false)
656 result.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
658 result.last_updated_container = 0;
663 template <
typename key_type,
typename T>
666 if (first.registered_owner != registered_as || last.registered_owner != registered_as)
667 throw jle::alarm(JLE_HERE,
"map",
"erase with extrange iterator (first or second)", jle::al::priority::error);
668 if (first.iiterator == imap.end())
669 throw jle::alarm(JLE_HERE,
"map",
"erase over end iterator (first)", jle::al::priority::error);
670 if (first.is_valid() ==
false)
671 throw jle::alarm(JLE_HERE,
"map",
"erase over iterator invalid (first)", jle::al::priority::error);
675 internal_for_containers::register_container_size_change(registered_as);
679 imap.erase(first.iiterator);
687 if ((imap.value_comp() (*first.iiterator, *last.iiterator)) == true )
690 imap.erase(first.iiterator, last.iiterator);
695 throw jle::alarm(JLE_HERE,
"map",
"erase over iterators with invalid order (first > last)", jle::al::priority::error);
700 template <
typename key_type,
typename T>
703 internal_for_containers::register_container_size_change(registered_as);
704 std::pair<typename std::map<key_type, T>::iterator,
bool> presult = imap.insert(x);
707 it.registered_owner = registered_as;
708 it.iiterator = presult.first;
709 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
710 it.i_end_iterator = imap.end();
712 return std::make_pair(it, presult.second);
generic namespace
Definition: alarm.cpp:12