9 #include "container_support.h" 10 #include "core/alarm.h" 35 iterator() : registered_owner(0), last_updated_container(0) {}
38 bool operator==(
const iterator& it)
const;
39 bool operator!=(
const iterator& it)
const;
45 typename std::list<T>::iterator iiterator;
46 typename std::list<T>::iterator i_end_iterator;
48 int last_updated_container;
50 bool is_valid (
void)
const;
62 const_iterator() : registered_owner(0), last_updated_container(0) {}
64 iiterator (it.iiterator),
65 i_end_iterator (it.i_end_iterator),
66 registered_owner(it.registered_owner),
67 last_updated_container(it.last_updated_container)
70 const_iterator& operator=(
const iterator& it)
72 iiterator = it.iiterator;
73 i_end_iterator = it.i_end_iterator;
74 registered_owner = it.registered_owner;
75 last_updated_container = it.last_updated_container;
80 const_iterator& operator++();
81 const_iterator operator++(
int);
82 bool operator==(
const const_iterator& it)
const;
83 bool operator!=(
const const_iterator& it)
const;
85 const T* operator->(
void);
86 const T& operator* (
void);
89 typename std::list<T>::const_iterator iiterator;
90 typename std::list<T>::const_iterator i_end_iterator;
92 int last_updated_container;
94 bool is_valid (
void)
const;
118 typename std::list<T>::reverse_iterator iiterator;
119 typename std::list<T>::reverse_iterator i_rend_iterator;
120 int registered_owner;
121 int last_updated_container;
123 bool is_valid (
void)
const;
136 const_reverse_iterator(
const iterator& it) :
137 iiterator (it.iiterator),
138 i_rend_iterator (it.i_rend_iterator),
139 registered_owner(it.registered_owner),
140 last_updated_container(it.last_updated_container)
145 iiterator = it.iiterator;
146 i_rend_iterator = it.i_rend_iterator;
147 registered_owner = it.registered_owner;
148 last_updated_container = it.last_updated_container;
153 const_reverse_iterator& operator++();
154 const_reverse_iterator operator++(
int);
155 bool operator==(
const const_reverse_iterator& it)
const;
156 bool operator!=(
const const_reverse_iterator& it)
const;
158 const T* operator->(
void);
159 const T& operator* (
void);
162 typename std::list<T>::const_reverse_iterator iiterator;
163 typename std::list<T>::const_reverse_iterator i_rend_iterator;
164 int registered_owner;
165 int last_updated_container;
167 bool is_valid (
void)
const;
174 list() : registered_as(internal_for_containers::register_container(
true)) {};
178 internal_for_containers::unregister_container(registered_as);
179 } JLE_CATCH_CALLFUNCION(jle::alarm_msg,
"exception on destructor",
"catched exception on destructor")
182 list(std::initializer_list<T> il) : ilist(il), registered_as(internal_for_containers::register_container(
true)) {};
189 bool operator==(
const list<T>& rhs )
const {
return ilist == rhs.ilist; }
190 bool operator!=(
const list<T>& rhs )
const {
return ilist != rhs.ilist; }
191 bool operator< ( const list<T>& rhs )
const {
return ilist < rhs.ilist; }
192 bool operator<=( const list<T>& rhs )
const {
return ilist <= rhs.ilist; }
193 bool operator> (
const list<T>& rhs )
const {
return ilist > rhs.ilist; }
194 bool operator>=(
const list<T>& rhs )
const {
return ilist >= rhs.ilist; }
212 unsigned size ()
const;
213 unsigned max_size()
const;
214 void resize (
unsigned sz, T c = T());
218 const T& front ( )
const;
220 const T& back ( )
const;
224 void assign (
unsigned n,
const T& u );
225 void push_front (
const T& x );
227 void push_back (
const T& x );
230 void insert (
const iterator& position,
unsigned n,
const T& x );
240 void remove (
const T& value );
266 template <
typename T>
268 : registered_as (internal_for_containers::register_container( ilist.empty() ?
true :
false))
272 if (ilist.empty() ==
false)
273 internal_for_containers::register_container_size_change(registered_as);
276 template <
typename T>
278 : registered_as (internal_for_containers::register_container( ilist.empty() ?
true :
false))
280 ilist = std::move(l.ilist);
282 if (ilist.empty() ==
false)
283 internal_for_containers::register_container_size_change(registered_as);
286 template <
typename T>
290 registered_as = internal_for_containers::register_container( ilist.empty() ?
true :
false);
291 if (ilist.empty() ==
false)
292 internal_for_containers::register_container_size_change(registered_as);
296 template <
typename T>
299 ilist = std::move(v.ilist);
300 registered_as = internal_for_containers::register_container( ilist.empty() ?
true :
false);
301 if (ilist.empty() ==
false)
302 internal_for_containers::register_container_size_change(registered_as);
311 template <
typename T>
314 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
320 template <
typename T>
324 it.iiterator = ilist.begin();
326 it.registered_owner = registered_as;
327 it.i_end_iterator = ilist.end();
328 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
334 template <
typename T>
338 it.iiterator = ilist.end();
339 it.registered_owner = registered_as;
340 it.i_end_iterator = ilist.end();
348 template <
typename T>
351 if (is_valid() ==
false)
352 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
354 if (i_end_iterator == iiterator)
355 throw jle::alarm(JLE_HERE,
"list",
"++ on end iterator", jle::al::priority::error);
361 template <
typename T>
365 if (is_valid() ==
false)
366 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
368 if (i_end_iterator == iiterator)
369 throw jle::alarm(JLE_HERE,
"list",
"++ on end iterator", jle::al::priority::error);
377 template <
typename T>
380 if (registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
381 throw jle::alarm(JLE_HERE,
"list",
"on different owners", jle::al::priority::error);
383 return it.iiterator == iiterator;
386 template <
typename T>
389 return !operator==(it);
393 template <
typename T>
396 if (is_valid() ==
false)
397 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
399 if (i_end_iterator == iiterator)
400 throw jle::alarm(JLE_HERE,
"list",
"-> on end iterator", jle::al::priority::error);
402 return iiterator.operator->();
405 template <
typename T>
408 if (is_valid() ==
false)
409 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
411 if (i_end_iterator == iiterator)
412 throw jle::alarm(JLE_HERE,
"list",
"* on end iterator", jle::al::priority::error);
423 template <
typename T>
426 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
432 template <
typename T>
436 it.iiterator = ilist.begin();
438 it.registered_owner = registered_as;
439 it.i_end_iterator = ilist.end();
441 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
447 template <
typename T>
451 it.registered_owner = registered_as;
452 it.i_end_iterator = ilist.end();
453 it.iiterator = ilist.end();
459 template <
typename T>
462 if (is_valid() ==
false)
463 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
465 if (i_end_iterator == iiterator)
466 throw jle::alarm(JLE_HERE,
"list",
"++ on end iterator", jle::al::priority::error);
472 template <
typename T>
476 if (is_valid() ==
false)
477 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
479 if (i_end_iterator == iiterator)
480 throw jle::alarm(JLE_HERE,
"list",
"++ on end iterator", jle::al::priority::error);
487 template <
typename T>
490 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
491 throw jle::alarm(JLE_HERE,
"list",
"on different owners", jle::al::priority::error);
493 return it.iiterator == iiterator;
496 template <
typename T>
499 return !operator==(it);
503 template <
typename T>
506 if (is_valid() ==
false)
507 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
509 if (i_end_iterator == iiterator)
510 throw jle::alarm(JLE_HERE,
"list",
"-> on end iterator", jle::al::priority::error);
512 return iiterator.operator->();
515 template <
typename T>
518 if (is_valid() ==
false)
519 throw jle::alarm(JLE_HERE,
"list",
"iterator not valid", jle::al::priority::error);
521 if (i_end_iterator == iiterator)
522 throw jle::alarm(JLE_HERE,
"list",
"* on end iterator", jle::al::priority::error);
532 template <
typename T>
535 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
541 template <
typename T>
545 it.iiterator = ilist.rbegin();
547 it.registered_owner = registered_as;
548 it.i_rend_iterator = ilist.rend();
549 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
555 template <
typename T>
559 it.iiterator = ilist.rend();
560 it.registered_owner = registered_as;
561 it.i_rend_iterator = ilist.rend();
569 template <
typename T>
572 if (is_valid() ==
false)
573 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
575 if (i_rend_iterator == iiterator)
576 throw jle::alarm(JLE_HERE,
"list",
"++ on end reverse_", jle::al::priority::error);
582 template <
typename T>
586 if (is_valid() ==
false)
587 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
589 if (i_rend_iterator == iiterator)
590 throw jle::alarm(JLE_HERE,
"list",
"++ on end reverse_iterator", jle::al::priority::error);
598 template <
typename T>
601 if (registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
602 throw jle::alarm(JLE_HERE,
"list",
"on different owners", jle::al::priority::error);
604 return it.iiterator == iiterator;
607 template <
typename T>
610 return !operator==(it);
614 template <
typename T>
617 if (is_valid() ==
false)
618 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
620 if (i_rend_iterator == iiterator)
621 throw jle::alarm(JLE_HERE,
"list",
"-> on rend reverse_iterator", jle::al::priority::error);
623 return iiterator.operator->();
626 template <
typename T>
629 if (is_valid() ==
false)
630 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
632 if (i_rend_iterator == iiterator)
633 throw jle::alarm(JLE_HERE,
"list",
"* on end reverse_iterator", jle::al::priority::error);
644 template <
typename T>
647 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
653 template <
typename T>
657 it.iiterator = ilist.rbegin();
659 it.registered_owner = registered_as;
660 it.i_rend_iterator = ilist.rend();
662 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
668 template <
typename T>
672 it.registered_owner = registered_as;
673 it.i_rend_iterator = ilist.rend();
674 it.iiterator = ilist.rend();
680 template <
typename T>
683 if (is_valid() ==
false)
684 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
686 if (i_rend_iterator == iiterator)
687 throw jle::alarm(JLE_HERE,
"list",
"++ on end reverse_iterator", jle::al::priority::error);
693 template <
typename T>
697 if (is_valid() ==
false)
698 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
700 if (i_rend_iterator == iiterator)
701 throw jle::alarm(JLE_HERE,
"list",
"++ on end reverse_iterator", jle::al::priority::error);
708 template <
typename T>
711 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
712 throw jle::alarm(JLE_HERE,
"list",
"on different owners", jle::al::priority::error);
714 return it.iiterator == iiterator;
717 template <
typename T>
720 return !operator==(it);
724 template <
typename T>
727 if (is_valid() ==
false)
728 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
730 if (i_rend_iterator == iiterator)
731 throw jle::alarm(JLE_HERE,
"list",
"-> on rend reverse_iterator", jle::al::priority::error);
733 return iiterator.operator->();
736 template <
typename T>
739 if (is_valid() ==
false)
740 throw jle::alarm(JLE_HERE,
"list",
"reverse_iterator not valid", jle::al::priority::error);
742 if (i_rend_iterator == iiterator)
743 throw jle::alarm(JLE_HERE,
"list",
"* on end reverse_iterator", jle::al::priority::error);
752 template <
typename T>
755 return ilist.empty();
758 template <
typename T>
761 return unsigned(ilist.size());
765 template <
typename T>
768 return unsigned(ilist.max_size());
772 template <
typename T>
775 internal_for_containers::register_container_size_change(registered_as);
789 throw jle::alarm(JLE_HERE,
"list",
"front on empty list", jle::al::priority::error);
791 return ilist.front();
798 throw jle::alarm(JLE_HERE,
"list",
"front on empty list", jle::al::priority::error);
800 return ilist.front();
807 throw jle::alarm(JLE_HERE,
"list",
"back on empty list", jle::al::priority::error);
816 throw jle::alarm(JLE_HERE,
"list",
"back on empty list", jle::al::priority::error);
827 internal_for_containers::register_container_size_change(registered_as);
834 internal_for_containers::register_container_size_change(registered_as);
842 throw jle::alarm(JLE_HERE,
"list",
"pop_front on empty list", jle::al::priority::error);
843 internal_for_containers::register_container_size_change(registered_as);
850 if (internal_for_containers::get_registered_container_last_size_change(registered_as) == 0)
851 internal_for_containers::register_container_size_change(registered_as);
859 throw jle::alarm(JLE_HERE,
"list",
"pop_back on empty list", jle::al::priority::error);
860 internal_for_containers::register_container_size_change(registered_as);
867 if (position.registered_owner != registered_as)
868 throw jle::alarm(JLE_HERE,
"list",
"insert with extrange iterator", jle::al::priority::error);
870 if (position.iiterator != position.i_end_iterator)
871 if (internal_for_containers::get_registered_container_last_size_change(position.registered_owner) != position.last_updated_container)
872 throw jle::alarm(JLE_HERE,
"list",
"insert with invalid iterator", jle::al::priority::error);
874 internal_for_containers::register_container_size_change(registered_as);
876 result.iiterator = ilist.insert(position.iiterator, x);
878 result.registered_owner = registered_as;
879 result.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
880 result.i_end_iterator = ilist.end();
888 if (position.registered_owner != registered_as)
889 throw jle::alarm(JLE_HERE,
"list",
"insert with extrange iterator", jle::al::priority::error);
891 if (position.iiterator != position.i_end_iterator)
892 if (internal_for_containers::get_registered_container_last_size_change(position.registered_owner) != position.last_updated_container)
893 throw jle::alarm(JLE_HERE,
"list",
"insert with invalid iterator", jle::al::priority::error);
895 internal_for_containers::register_container_size_change(registered_as);
896 ilist.insert(position.iiterator, n, x);
902 if (position.registered_owner != registered_as)
903 throw jle::alarm(JLE_HERE,
"list",
"erase with extrange iterator", jle::al::priority::error);
904 if (position.iiterator == ilist.end())
905 throw jle::alarm(JLE_HERE,
"list",
"erase over end iterator", jle::al::priority::error);
906 if (position.is_valid() ==
false)
907 throw jle::alarm(JLE_HERE,
"list",
"erase over iterator invalid", jle::al::priority::error);
909 internal_for_containers::register_container_size_change(registered_as);
912 result.iiterator = ilist.erase(position.iiterator);
914 result.registered_owner = registered_as;
915 result.i_end_iterator = ilist.end();
916 if (ilist.empty() ==
false)
917 result.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
919 result.last_updated_container = 0;
928 if (first.registered_owner != registered_as || last.registered_owner != registered_as)
929 throw jle::alarm(JLE_HERE,
"list",
"erase with extrange iterator (first or second)", jle::al::priority::error);
930 if (first.iiterator == ilist.end())
931 throw jle::alarm(JLE_HERE,
"list",
"erase over end iterator (first)", jle::al::priority::error);
932 if (first.is_valid() ==
false)
933 throw jle::alarm(JLE_HERE,
"list",
"erase over iterator invalid (first)", jle::al::priority::error);
939 result = erase (first);
943 internal_for_containers::register_container_size_change(registered_as);
946 bool bFindLastIterator =
false;
952 if (next.iiterator == last.iiterator)
953 bFindLastIterator =
true;
955 result.iiterator = ilist.erase(next.iiterator);
956 result.registered_owner = registered_as;
957 result.i_end_iterator = ilist.end();
958 if (ilist.empty() ==
false)
959 result.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
961 result.last_updated_container = 0;
966 while ((bFindLastIterator ==
false) && (result.iiterator != ilist.end()));
969 if ((last.iiterator != ilist.end()) && (bFindLastIterator ==
false))
970 throw jle::alarm(JLE_HERE,
"list",
"erase from first iterator to end of container (last iterator not found)", jle::al::priority::error);
979 internal_for_containers::register_container_size_change(registered_as);
992 internal_for_containers::register_container_size_change(registered_as);
999 internal_for_containers::register_container_size_change(registered_as);
1004 template<
typename T>
1007 internal_for_containers::register_container_size_change(registered_as);
1011 template<
typename T>
1014 internal_for_containers::register_container_size_change(registered_as);
1021 template<
typename T>
1022 std::ostream& operator<< (std::ostream& os, const jle::list<T>& l)
1027 for(
auto it=l.cbegin(); it!=l.cend(); ++it) {
1048 #endif // JLE_LIST__HPP
generic namespace
Definition: alarm.cpp:12