1 #ifndef JLE_VECTOR__H___ 2 #define JLE_VECTOR__H___ 8 #include "core/alarm.h" 9 #include "container_support.h" 30 iterator() : registered_owner(0), last_updated_container(0) {}
33 bool operator==(
const iterator& it)
const;
34 bool operator!=(
const iterator& it)
const;
40 typename std::vector<T>::iterator iiterator;
41 typename std::vector<T>::iterator i_end_iterator;
43 int last_updated_container;
45 bool is_valid (
void)
const;
57 const_iterator() : registered_owner(0), last_updated_container(0) {}
59 iiterator (it.iiterator),
60 i_end_iterator (it.i_end_iterator),
61 registered_owner(it.registered_owner),
62 last_updated_container(it.last_updated_container)
65 const_iterator& operator=(
const iterator& it)
67 iiterator = it.iiterator;
68 i_end_iterator = it.i_end_iterator;
69 registered_owner = it.registered_owner;
70 last_updated_container = it.last_updated_container;
76 const_iterator& operator++();
77 const_iterator operator++(
int);
78 bool operator==(
const const_iterator& it)
const;
79 bool operator!=(
const const_iterator& it)
const;
81 const T* operator->(
void);
82 const T& operator* (
void);
85 typename std::vector<T>::const_iterator iiterator;
86 typename std::vector<T>::const_iterator i_end_iterator;
88 int last_updated_container;
90 bool is_valid (
void)
const;
114 typename std::vector<T>::reverse_iterator iiterator;
115 typename std::vector<T>::reverse_iterator i_rend_iterator;
116 int registered_owner;
117 int last_updated_container;
119 bool is_valid (
void)
const;
132 const_reverse_iterator(
const iterator& it) :
133 iiterator (it.iiterator),
134 i_rend_iterator (it.i_rend_iterator),
135 registered_owner(it.registered_owner),
136 last_updated_container(it.last_updated_container)
141 iiterator = it.iiterator;
142 i_rend_iterator = it.i_rend_iterator;
143 registered_owner = it.registered_owner;
144 last_updated_container = it.last_updated_container;
150 const_reverse_iterator& operator++();
151 const_reverse_iterator operator++(
int);
152 bool operator==(
const const_reverse_iterator& it)
const;
153 bool operator!=(
const const_reverse_iterator& it)
const;
155 const T* operator->(
void);
156 const T& operator* (
void);
159 typename std::vector<T>::const_reverse_iterator iiterator;
160 typename std::vector<T>::const_reverse_iterator i_rend_iterator;
161 int registered_owner;
162 int last_updated_container;
164 bool is_valid (
void)
const;
171 explicit vector() : registered_as(internal_for_containers::register_container(
true)) {};
172 explicit vector (std::size_t n,
const T& value= T()) : ivector{n, value}, registered_as(internal_for_containers::register_container(
true)) {};
173 template <
class InputIterator>
174 vector ( InputIterator first, InputIterator last) : ivector(first, last), registered_as(internal_for_containers::register_container(
true)) {};
179 internal_for_containers::unregister_container(registered_as);
180 } JLE_CATCH_CALLFUNCION(jle::alarm_msg,
"exception on destructor",
"catched exception on destructor")
183 vector(std::initializer_list<T> il) : ivector(il), registered_as(internal_for_containers::register_container(
true)) {};
190 bool operator==(
const vector<T>& rhs ) {
return ivector == rhs.ivector; }
191 bool operator!=(
const vector<T>& rhs ) {
return ivector != rhs.ivector; }
192 bool operator< ( const vector<T>& rhs ) {
return ivector < rhs.ivector; }
193 bool operator<=( const vector<T>& rhs ) {
return ivector <= rhs.ivector; }
194 bool operator> (
const vector<T>& rhs ) {
return ivector > rhs.ivector; }
195 bool operator>=(
const vector<T>& rhs ) {
return ivector >= rhs.ivector; }
210 T& operator[] (
unsigned n );
211 const T& operator[] (
unsigned n )
const;
213 unsigned long size ()
const;
215 const T& at (
unsigned n )
const;
216 T& at (
unsigned n );
218 const T& front (
void)
const;
220 const T& back (
void)
const;
221 void pop_back (
void);
222 void push_back (
const T& x);
224 void reserve (
size_t n);
235 std::vector<T> ivector;
238 void check_limits(
unsigned n,
const char* text)
const;
250 template <
typename T>
252 : registered_as (internal_for_containers::register_container( ivector.empty() ?
true :
false))
256 if (ivector.empty() ==
false)
257 internal_for_containers::register_container_size_change(registered_as);
261 template <
typename T>
263 : registered_as (internal_for_containers::register_container( ivector.empty() ?
true :
false))
265 ivector = std::move(l.ivector);
267 if (ivector.empty() ==
false)
268 internal_for_containers::register_container_size_change(registered_as);
272 template <
typename T>
276 registered_as = internal_for_containers::register_container( ivector.empty() ?
true :
false);
277 if (ivector.empty() ==
false)
278 internal_for_containers::register_container_size_change(registered_as);
283 template <
typename T>
286 ivector = std::move(v.ivector);
287 registered_as = internal_for_containers::register_container( ivector.empty() ?
true :
false);
288 if (ivector.empty() ==
false)
289 internal_for_containers::register_container_size_change(registered_as);
308 template <
typename T>
311 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
317 template <
typename T>
321 it.iiterator = ivector.begin();
323 it.registered_owner = registered_as;
324 it.i_end_iterator = ivector.end();
325 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
331 template <
typename T>
335 it.iiterator = ivector.end();
336 it.registered_owner = registered_as;
337 it.i_end_iterator = ivector.end();
345 template <
typename T>
348 if (is_valid() ==
false)
349 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
351 if (i_end_iterator == iiterator)
352 throw jle::alarm(JLE_HERE,
"vector",
"++ on end iterator", jle::al::priority::error);
358 template <
typename T>
362 if (is_valid() ==
false)
363 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
365 if (i_end_iterator == iiterator)
366 throw jle::alarm(JLE_HERE,
"vector",
"++ on end iterator", jle::al::priority::error);
374 template <
typename T>
377 if (registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
378 throw jle::alarm(JLE_HERE,
"vector",
"on different owners", jle::al::priority::error);
380 return it.iiterator == iiterator;
383 template <
typename T>
386 return !operator==(it);
390 template <
typename T>
393 if (is_valid() ==
false)
394 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
396 if (i_end_iterator == iiterator)
397 throw jle::alarm(JLE_HERE,
"vector",
"-> on end iterator", jle::al::priority::error);
399 return iiterator.operator->();
402 template <
typename T>
405 if (is_valid() ==
false)
406 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
408 if (i_end_iterator == iiterator)
409 throw jle::alarm(JLE_HERE,
"vector",
"* on end iterator", jle::al::priority::error);
420 template <
typename T>
423 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
429 template <
typename T>
433 it.iiterator = ivector.begin();
435 it.registered_owner = registered_as;
436 it.i_end_iterator = ivector.end();
438 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
444 template <
typename T>
448 it.registered_owner = registered_as;
449 it.i_end_iterator = ivector.end();
450 it.iiterator = ivector.end();
456 template <
typename T>
459 if (is_valid() ==
false)
460 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
462 if (i_end_iterator == iiterator)
463 throw jle::alarm(JLE_HERE,
"vector",
"++ on end iterator", jle::al::priority::error);
469 template <
typename T>
473 if (is_valid() ==
false)
474 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
476 if (i_end_iterator == iiterator)
477 throw jle::alarm(JLE_HERE,
"vector",
"++ on end iterator", jle::al::priority::error);
484 template <
typename T>
487 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
488 throw jle::alarm(JLE_HERE,
"vector",
"on different owners", jle::al::priority::error);
490 return it.iiterator == iiterator;
493 template <
typename T>
496 return !operator==(it);
500 template <
typename T>
503 if (is_valid() ==
false)
504 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
506 if (i_end_iterator == iiterator)
507 throw jle::alarm(JLE_HERE,
"vector",
"-> on end iterator", jle::al::priority::error);
509 return iiterator.operator->();
512 template <
typename T>
515 if (is_valid() ==
false)
516 throw jle::alarm(JLE_HERE,
"vector",
"iterator not valid", jle::al::priority::error);
518 if (i_end_iterator == iiterator)
519 throw jle::alarm(JLE_HERE,
"vector",
"* on end iterator", jle::al::priority::error);
529 template <
typename T>
532 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
538 template <
typename T>
542 it.iiterator = ivector.rbegin();
544 it.registered_owner = registered_as;
545 it.i_rend_iterator = ivector.rend();
546 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
552 template <
typename T>
556 it.iiterator = ivector.rend();
557 it.registered_owner = registered_as;
558 it.i_rend_iterator = ivector.rend();
566 template <
typename T>
569 if (is_valid() ==
false)
570 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
572 if (i_rend_iterator == iiterator)
573 throw jle::alarm(JLE_HERE,
"vector",
"++ on end reverse_", jle::al::priority::error);
579 template <
typename T>
583 if (is_valid() ==
false)
584 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
586 if (i_rend_iterator == iiterator)
587 throw jle::alarm(JLE_HERE,
"vector",
"++ on end reverse_iterator", jle::al::priority::error);
595 template <
typename T>
598 if (registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
599 throw jle::alarm(JLE_HERE,
"vector",
"on different owners", jle::al::priority::error);
601 return it.iiterator == iiterator;
604 template <
typename T>
607 return !operator==(it);
611 template <
typename T>
614 if (is_valid() ==
false)
615 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
617 if (i_rend_iterator == iiterator)
618 throw jle::alarm(JLE_HERE,
"vector",
"-> on rend reverse_iterator", jle::al::priority::error);
620 return iiterator.operator->();
623 template <
typename T>
626 if (is_valid() ==
false)
627 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
629 if (i_rend_iterator == iiterator)
630 throw jle::alarm(JLE_HERE,
"vector",
"* on end reverse_iterator", jle::al::priority::error);
641 template <
typename T>
644 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
650 template <
typename T>
654 it.iiterator = ivector.rbegin();
656 it.registered_owner = registered_as;
657 it.i_rend_iterator = ivector.rend();
659 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
665 template <
typename T>
669 it.registered_owner = registered_as;
670 it.i_rend_iterator = ivector.rend();
671 it.iiterator = ivector.rend();
677 template <
typename T>
680 if (is_valid() ==
false)
681 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
683 if (i_rend_iterator == iiterator)
684 throw jle::alarm(JLE_HERE,
"vector",
"++ on end reverse_iterator", jle::al::priority::error);
690 template <
typename T>
694 if (is_valid() ==
false)
695 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
697 if (i_rend_iterator == iiterator)
698 throw jle::alarm(JLE_HERE,
"vector",
"++ on end reverse_iterator", jle::al::priority::error);
705 template <
typename T>
708 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
709 throw jle::alarm(JLE_HERE,
"vector",
"on different owners", jle::al::priority::error);
711 return it.iiterator == iiterator;
714 template <
typename T>
717 return !operator==(it);
721 template <
typename T>
724 if (is_valid() ==
false)
725 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
727 if (i_rend_iterator == iiterator)
728 throw jle::alarm(JLE_HERE,
"vector",
"-> on rend reverse_iterator", jle::al::priority::error);
730 return iiterator.operator->();
733 template <
typename T>
736 if (is_valid() ==
false)
737 throw jle::alarm(JLE_HERE,
"vector",
"reverse_iterator not valid", jle::al::priority::error);
739 if (i_rend_iterator == iiterator)
740 throw jle::alarm(JLE_HERE,
"vector",
"* on end reverse_iterator", jle::al::priority::error);
752 template <
typename T>
755 if (n>=ivector.size())
757 std::ostringstream oss;
758 oss <<
"out of limits " <<
"ivector.size() " << ivector.size() <<
" < " << n <<
" on... " << text;
759 throw jle::alarm(JLE_HERE,
"vector", std::string(
"out of limits ") +
760 oss.str() , jle::al::priority::error);
766 template <
typename T>
769 check_limits(n,
"operator[]");
774 template <
typename T>
777 check_limits(n,
"const operator[]");
782 template <
typename T>
785 internal_for_containers::register_container_size_change(registered_as);
791 template <
typename T>
794 return ivector.size();
797 template <
typename T>
800 return ivector.empty();
803 template <
typename T>
806 check_limits(n ,
"at");
807 return ivector.at(n);
810 template <
typename T>
813 check_limits(n ,
"at");
814 return ivector.at(n);
817 template <
typename T>
820 check_limits(0 ,
"front");
821 return ivector.front();
824 template <
typename T>
827 check_limits(0 ,
"front");
828 return ivector.front();
831 template <
typename T>
834 check_limits(0 ,
"back");
835 return ivector.back();
838 template <
typename T>
841 check_limits(0 ,
"back");
842 return ivector.back();
846 template <
typename T>
849 check_limits(0 ,
"pop_back");
850 internal_for_containers::register_container_size_change(registered_as);
854 template <
typename T>
857 if (internal_for_containers::get_registered_container_last_size_change(registered_as) == 0)
858 internal_for_containers::register_container_size_change(registered_as);
859 ivector.push_back(x);
864 template <
typename T>
867 internal_for_containers::register_container_size_change(registered_as);
879 #endif // JLE_VECTOR__H___ Definition: vector.hpp:123
Definition: vector.hpp:21
Definition: vector.hpp:95
Definition: vector.hpp:17
generic namespace
Definition: alarm.cpp:12
Definition: vector.hpp:49