7template <
class TYPE,
class ARG_TYPE = const TYPE&,
class LIST_BASE = ::list_base < TYPE, ARG_TYPE > >
14 using BASE_LIST = LIST_BASE;
15 using node =
typename BASE_LIST::NODE;
16 using iterator =
typename BASE_LIST::iterator;
17 using const_iterator =
typename BASE_LIST::const_iterator;
20 using BASE_LIST::BASE_LIST;
21 using BASE_LIST::operator =;
26 iterator find_first_item(
const TYPE &t, iterator start =
nullptr, iterator end =
nullptr)
const;
27 iterator find_last_item(
const TYPE &t, iterator start =
nullptr, iterator end =
nullptr)
const;
28 ::collection::count get_count()
const;
29 ::collection::count get_count(
const TYPE & t, iterator start =
nullptr, iterator end =
nullptr, ::collection::count countMax = -1)
const;
30 bool contains(
const TYPE & t, iterator start =
nullptr, iterator end =
nullptr, ::collection::count countMin = 1, ::collection::count countMax = -1)
const;
31 bool rear_contains(
const TYPE & t, iterator start =
nullptr, iterator end =
nullptr, ::collection::count countMin = 1, ::collection::count countMax = -1)
const;
32 bool erase_first(
const TYPE & t);
33 bool erase_last(
const TYPE & t);
34 bool erase_first(
const TYPE & t, iterator & p, iterator end =
nullptr);
35 bool erase_last(
const TYPE & t, iterator & p, iterator end =
nullptr);
37 using BASE_LIST::erase;
39 ::collection::count erase(
const TYPE & t, iterator start =
nullptr, iterator end =
nullptr);
41 template < prototype_container CONTAINER >
42 ::collection::count erase(
const CONTAINER & container);
45 bool add_tail_unique(ARG_TYPE t);
46 bool add_head_unique(ARG_TYPE t);
49 bool add_unique(ARG_TYPE t)
52 auto pFind = this->find_first_item(t);
68 void change(ARG_TYPE t,
bool bAdd)
71 auto pFind = this->find_first_item(t);
99 void toggle(ARG_TYPE t)
102 auto pFind = this->find_first_item(t);
120 template < prototype_container CONTAINER >
121 void merge_tail(
const CONTAINER & container);
122 template < prototype_container CONTAINER >
123 void merge_head(
const CONTAINER & container);
124 template < prototype_container CONTAINER >
125 void intersect(
const CONTAINER & container);
129 template < prototype_container CONTAINER >
131 template < prototype_container CONTAINER >
133 template < prototype_container CONTAINER >
136 template < prototype_container CONTAINER >
160template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
161typename comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::iterator comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
172 while(!::iterator_is_end(p, end))
191template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
192typename comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::iterator comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
203 while(p && p != start)
221template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
222inline ::collection::count comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
226 return LIST_BASE::get_count();
231template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
232::collection::count comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
233get_count(
const TYPE & t,
iterator start,
iterator end, ::collection::count countMax)
const
236 ::collection::count count = 0;
238 while((countMax >= 0 && count <= countMax) && (start = find_first_item(t, start, end)))
250template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
251bool comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
252contains(
const TYPE & t,
iterator p,
iterator end, ::collection::count countMin, ::collection::count countMax)
const
255 ::collection::count count = 0;
257 while((count < countMin || (countMax >= 0 && count <= countMax)) && (p = find_first_item(t, p, end)))
264 return count >= countMin && conditional(countMax >= 0, count <= countMax);
269template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
270bool comparable_eq_list_base < TYPE, ARG_TYPE, LIST_BASE >::
271rear_contains(
const TYPE & t,
iterator p,
iterator end, ::collection::count countMin, ::collection::count countMax)
const
274 ::collection::count count = 0;
276 while((count < countMin || (countMax >= 0 && count <= countMax)) && (p = find_last_item(t, p, end)))
283 return count >= countMin && conditional(countMax >= 0, count <= countMax);
288template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
289bool comparable_eq_list_base<TYPE, ARG_TYPE, LIST_BASE>::add_tail_unique(ARG_TYPE t)
306template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
307bool comparable_eq_list_base<TYPE, ARG_TYPE, LIST_BASE>::add_head_unique(ARG_TYPE t)
324template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
325template < prototype_container CONTAINER >
330 auto p = this->begin();
335 if (!::contains(container, *p))
338 this->erase_defer_next(p);
353template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
354template < prototype_container CONTAINER >
359 for (
auto&
item : container)
362 this->add_tail_unique(
item);
369template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
370template < prototype_container CONTAINER >
375 for (
auto&
item : container)
378 this->add_head_unique(
item);
386template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
387template < prototype_container CONTAINER >
392 this->intersect(container);
399template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
411template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
412template < prototype_container CONTAINER >
417 this->erase(container);
424template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
425template < prototype_container CONTAINER >
432 list.erase(container);
434 return ::transfer(list);
439template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
440template < prototype_container CONTAINER >
445 this->merge_tail(container);
452template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
453bool comparable_eq_list_base < TYPE, ARG_TYPE , LIST_BASE >::
454erase_first(
const TYPE & t)
457 iterator p = this->find_first_item(t);
473template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
474bool comparable_eq_list_base < TYPE, ARG_TYPE , LIST_BASE >::erase_first(
const TYPE & t,
iterator & p,
iterator end)
477 if((p = this->find_first_item(t, p, end)))
520template<
class TYPE,
class ARG_TYPE,
class LIST_BASE>
521::collection::count comparable_eq_list_base<TYPE, ARG_TYPE, LIST_BASE>::erase(
const TYPE &t,
iterator start,
iterator end)
526 auto begin = this->m_begin;
535 ::collection::count count = 0;
537 while (!::iterator_is_end(p, end))
566template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
567bool comparable_eq_list_base < TYPE, ARG_TYPE , LIST_BASE >::
568erase_last(
const TYPE & t)
571 auto p = find_last_item(t);
587template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
588bool comparable_eq_list_base < TYPE, ARG_TYPE , LIST_BASE >::
592 if((p = find_last_item(t, p, end)))
634template <
class TYPE,
class ARG_TYPE,
class LIST_BASE>
635template < prototype_container CONTAINER >
636::collection::count comparable_eq_list_base < TYPE, ARG_TYPE , LIST_BASE >::erase(
const CONTAINER & container)
639 ::collection::count count = 0;
641 for(
auto &
item : container)
644 count += this->erase_item(
item);
Definition comparable_eq_list.h:10
Definition std_iterator.h:49