1 #ifndef JLE_CONTAINERS_SET_GUARD 2 #define JLE_CONTAINERS_SET_GUARD 9 #include "container_support.h" 19 template<
typename key_type>
33 iterator() : registered_owner(0), last_updated_container(0) {};
36 bool operator==(
const iterator& it)
const;
37 bool operator!=(
const iterator& it)
const;
39 key_type* operator->(
void);
40 key_type& operator* (
void);
43 typename std::set<key_type>::iterator iiterator;
44 typename std::set<key_type>::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=(const_iterator&& it)=
default;
79 const_iterator& operator++();
80 const_iterator operator++(
int);
81 bool operator==(
const const_iterator& it)
const;
82 bool operator!=(
const const_iterator& it)
const;
84 const key_type* operator->(
void);
85 const key_type& operator*(
void);
88 typename std::set<key_type>::const_iterator iiterator;
89 typename std::set<key_type>::const_iterator i_end_iterator;
91 int last_updated_container;
93 bool is_valid (
void)
const;
100 set() : registered_as(internal_for_containers::register_container(
true)) {};
104 internal_for_containers::unregister_container(registered_as);
105 } JLE_CATCH_CALLFUNCION(jle::alarm_msg,
"exception on destructor",
"catched exception on destructor")
108 set(std::initializer_list<T> il) : iset(il), registered_as(internal_for_containers::register_container(
true)) {};
115 bool operator==(
const set<T>& rhs ) {
return iset == rhs.iset; }
116 bool operator!=(
const set<T>& rhs ) {
return iset != rhs.iset; }
117 bool operator< ( const set<T>& rhs ) {
return iset < rhs.iset; }
118 bool operator<=( const set<T>& rhs ) {
return iset <= rhs.iset; }
119 bool operator> (
const set<T>& rhs ) {
return iset > rhs.iset; }
120 bool operator>=(
const set<T>& rhs ) {
return iset >= rhs.iset; }
127 unsigned size ()
const;
133 unsigned count (
const key_type& x)
const;
136 iterator lower_bound (
const key_type& x);
138 iterator upper_bound (
const key_type& x);
150 unsigned erase (
const key_type& x);
153 std::pair<iterator, bool> insert (
const key_type& x );
156 std::set<key_type> iset;
169 template <
typename key_type>
171 : registered_as (internal_for_containers::register_container( iset.empty() ?
true :
false))
174 if(iset.empty() ==
false)
175 internal_for_containers::register_container_size_change(registered_as);
178 template <
typename T>
180 : registered_as (internal_for_containers::register_container( iset.empty() ?
true :
false))
182 iset = std::move(l.iset);
184 if (iset.empty() ==
false)
185 internal_for_containers::register_container_size_change(registered_as);
189 template <
typename key_type>
193 registered_as = internal_for_containers::register_container( iset.empty() ?
true :
false);
194 if(iset.empty() ==
false)
195 internal_for_containers::register_container_size_change(registered_as);
199 template <
typename T>
202 iset = std::move(v.iset);
203 registered_as = internal_for_containers::register_container( iset.empty() ?
true :
false);
204 if (iset.empty() ==
false)
205 internal_for_containers::register_container_size_change(registered_as);
213 template <
typename key_type>
216 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
222 template <
typename key_type>
226 it.iiterator = iset.begin();
228 it.registered_owner = registered_as;
229 it.i_end_iterator = iset.end();
231 if (iset.empty()==
false)
232 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
234 it.last_updated_container = 0;
240 template <
typename key_type>
244 it.iiterator = iset.end();
245 it.registered_owner = registered_as;
246 it.i_end_iterator = iset.end();
247 it.last_updated_container = 0;
254 template <
typename key_type>
257 if (is_valid() ==
false)
258 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
260 if (i_end_iterator == iiterator)
261 throw jle::alarm(JLE_HERE,
"set",
"++ on end iterator", jle::al::priority::error);
267 template <
typename key_type>
272 if (is_valid() ==
false)
273 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
275 if (i_end_iterator == iiterator)
276 throw jle::alarm(JLE_HERE,
"set",
"++ on end iterator", jle::al::priority::error);
282 template <
typename key_type>
285 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
286 throw jle::alarm(JLE_HERE,
"set",
"on different owners", jle::al::priority::error);
288 return it.iiterator == iiterator;
291 template <
typename key_type>
294 return !operator==(it);
298 template <
typename key_type>
301 if (last_updated_container==0
302 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container
303 || internal_for_containers::get_registered_container_last_size_change(registered_owner) == 0)
304 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
306 if (i_end_iterator == iiterator)
307 throw jle::alarm(JLE_HERE,
"set",
"-> on end iterator", jle::al::priority::error);
309 return iiterator.operator->();
312 template <
typename key_type>
315 if (last_updated_container==0
316 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container
317 || internal_for_containers::get_registered_container_last_size_change(registered_owner) == 0)
318 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
320 if (i_end_iterator == iiterator)
321 throw jle::alarm(JLE_HERE,
"set",
"* on end iterator", jle::al::priority::error);
338 template <
typename key_type>
341 if (last_updated_container==0 || internal_for_containers::get_registered_container_last_size_change(registered_owner) != last_updated_container)
348 template <
typename key_type>
352 it.iiterator = iset.begin();
354 it.registered_owner = registered_as;
355 it.i_end_iterator = iset.end();
357 if (iset.empty() ==
false)
358 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
360 it.last_updated_container = 0;
366 template <
typename key_type>
370 it.registered_owner = registered_as;
371 it.i_end_iterator = iset.end();
372 it.iiterator = iset.end();
373 it.last_updated_container = 0;
380 template <
typename key_type>
383 if (is_valid() ==
false)
384 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
386 if (i_end_iterator == iiterator)
387 throw jle::alarm(JLE_HERE,
"set",
"++ on end iterator", jle::al::priority::error);
393 template <
typename key_type>
398 if (is_valid() ==
false)
399 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
401 if (i_end_iterator == iiterator)
402 throw jle::alarm(JLE_HERE,
"set",
"++ on end iterator", jle::al::priority::error);
408 template <
typename key_type>
411 if(registered_owner!=0 && it.registered_owner != 0 && registered_owner != it.registered_owner)
412 throw jle::alarm(JLE_HERE,
"set",
"on different owners", jle::al::priority::error);
414 return it.iiterator == iiterator;
417 template <
typename key_type>
420 return !operator==(it);
424 template <
typename key_type>
427 if (is_valid() ==
false)
428 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
430 if (i_end_iterator == iiterator)
431 throw jle::alarm(JLE_HERE,
"set",
"-> on end iterator", jle::al::priority::error);
433 return iiterator.operator->();
436 template <
typename key_type>
439 if (is_valid() ==
false)
440 throw jle::alarm(JLE_HERE,
"set",
"iterator not valid", jle::al::priority::error);
442 if (i_end_iterator == iiterator)
443 throw jle::alarm(JLE_HERE,
"set",
"* on end iterator", jle::al::priority::error);
450 template <
typename key_type>
456 template <
typename key_type>
459 return unsigned(iset.size());
465 template <
typename key_type>
468 internal_for_containers::register_container_size_change(registered_as);
472 template <
typename key_type>
475 return iset.count(x);
486 template <
typename key_type>
491 it.iiterator = iset.find(x);
492 if (it.iiterator != iset.end())
494 it.registered_owner = registered_as;
495 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
496 it.i_end_iterator = iset.end();
500 it.registered_owner = 0;
501 it.last_updated_container = 0;
507 template <
typename key_type>
512 it.iiterator = iset.find(x);
513 if (it.iiterator != iset.end())
515 it.registered_owner = registered_as;
516 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
517 it.i_end_iterator = iset.end();
521 it.registered_owner = 0;
522 it.last_updated_container = 0;
529 template <
typename key_type>
534 it.iiterator = iset.lower_bound(x);
535 if (it.iiterator != iset.end())
537 it.registered_owner = registered_as;
538 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
539 it.i_end_iterator = iset.end();
543 it.registered_owner = 0;
544 it.last_updated_container = 0;
550 template <
typename key_type>
555 it.iiterator = iset.lower_bound(x);
556 if (it.iiterator != iset.end())
558 it.registered_owner = registered_as;
559 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
560 it.i_end_iterator = iset.end();
564 it.registered_owner = 0;
565 it.last_updated_container = 0;
571 template <
typename key_type>
576 it.iiterator = iset.upper_bound(x);
577 if (it.iiterator != iset.end())
579 it.registered_owner = registered_as;
580 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
581 it.i_end_iterator = iset.end();
585 it.registered_owner = 0;
586 it.last_updated_container = 0;
593 template <
typename key_type>
598 it.iiterator = iset.upper_bound(x);
599 if (it.iiterator != iset.end())
601 it.registered_owner = registered_as;
602 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
603 it.i_end_iterator = iset.end();
607 it.registered_owner = 0;
608 it.last_updated_container = 0;
618 template <
typename key_type>
621 internal_for_containers::register_container_size_change(registered_as);
622 return unsigned(iset.erase(x));
626 template <
typename key_type>
629 if (position.registered_owner != registered_as)
630 throw jle::alarm(JLE_HERE,
"set",
"erase with extrange iterator", jle::al::priority::error);
631 if (position.iiterator == iset.end())
632 throw jle::alarm(JLE_HERE,
"set",
"erase over end iterator", jle::al::priority::error);
633 if (position.is_valid() ==
false)
634 throw jle::alarm(JLE_HERE,
"set",
"erase over iterator invalid", jle::al::priority::error);
638 internal_for_containers::register_container_size_change(registered_as);
641 result.iiterator = ++(position.iiterator);
642 --(position.iiterator);
643 iset.erase(position.iiterator);
645 result.registered_owner = registered_as;
646 result.i_end_iterator = iset.end();
647 if (iset.empty() ==
false)
648 result.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
650 result.last_updated_container = 0;
655 template <
typename key_type>
658 if (first.registered_owner != registered_as || last.registered_owner != registered_as)
659 throw jle::alarm(JLE_HERE,
"set",
"erase with extrange iterator (first or second)", jle::al::priority::error);
660 if (first.iiterator == iset.end())
661 throw jle::alarm(JLE_HERE,
"set",
"erase over end iterator (first)", jle::al::priority::error);
662 if (first.is_valid() ==
false)
663 throw jle::alarm(JLE_HERE,
"set",
"erase over iterator invalid (first)", jle::al::priority::error);
667 internal_for_containers::register_container_size_change(registered_as);
671 iset.erase(first.iiterator);
679 if ((iset.value_comp() (*first.iiterator, *last.iiterator)) == true )
682 iset.erase(first.iiterator, last.iiterator);
687 throw jle::alarm(JLE_HERE,
"set",
"erase over iterators with invalid order (first > last)", jle::al::priority::error);
692 template <
typename key_type>
695 internal_for_containers::register_container_size_change(registered_as);
696 std::pair<typename std::set<key_type>::iterator,
bool> presult = iset.insert(x);
699 it.registered_owner = registered_as;
700 it.iiterator = presult.first;
701 it.last_updated_container = internal_for_containers::get_registered_container_last_size_change(registered_as);
702 it.i_end_iterator = iset.end();
704 return std::make_pair(it, presult.second);
generic namespace
Definition: alarm.cpp:12