33 #include <initializer_list> 38 #include <agrum/agrum.h> 39 #include <agrum/tools/core/refPtr.h> 41 #define GUM_DEFAULT_ITERATOR_NUMBER 4
49 #ifndef DOXYGEN_SHOULD_SKIP_THIS 51 template <
typename Val >
53 template <
typename Val >
55 template <
typename Val >
56 class ListConstIterator;
57 template <
typename Val >
58 class ListIteratorSafe;
59 template <
typename Val >
60 class ListConstIteratorSafe;
61 template <
typename Val,
typename Alloc >
68 template <
typename Val,
typename Alloc >
69 std::ostream& operator<<(std::ostream& stream,
const List< Val, Alloc >& list);
72 #ifndef DOXYGEN_SHOULD_SKIP_THIS 81 extern const void*
const _list_end_safe_;
82 extern const void*
const _list_end_;
103 template <
typename Val >
123 ListBucket() =
delete;
129 explicit ListBucket(
const Val& v);
135 explicit ListBucket(Val&& v)
noexcept;
142 template <
typename... Args >
143 explicit ListBucket(Emplace, Args&&... args);
149 ListBucket(
const ListBucket< Val >& src);
155 ListBucket(ListBucket< Val >&& src) =
delete;
179 ListBucket< Val >& operator=(
const ListBucket< Val >& src);
186 ListBucket< Val >& operator=(ListBucket< Val >&& src) =
delete;
193 bool operator==(
const ListBucket< Val >& src)
const;
200 bool operator!=(
const ListBucket< Val >& src)
const;
212 Val& operator*()
noexcept;
218 const Val& operator*()
const noexcept;
224 const ListBucket< Val >* next()
const noexcept;
230 const ListBucket< Val >* previous()
const noexcept;
237 template <
typename T,
typename A >
239 friend class ListIterator< Val >;
240 friend class ListConstIterator< Val >;
241 friend class ListIteratorSafe< Val >;
242 friend class ListConstIteratorSafe< Val >;
246 ListBucket< Val >* _prev_{
nullptr};
247 ListBucket< Val >* _next_{
nullptr};
373 template <
typename Val,
typename Alloc = std::allocator< Val > >
378 using value_type = Val;
379 using reference = Val&;
380 using const_reference =
const Val&;
381 using pointer = Val*;
382 using const_pointer =
const Val*;
383 using size_type = Size;
384 using difference_type = std::ptrdiff_t;
385 using allocator_type = Alloc;
386 using iterator = ListIterator< Val >;
387 using const_iterator = ListConstIterator< Val >;
388 using iterator_safe = ListIteratorSafe< Val >;
389 using const_iterator_safe = ListConstIteratorSafe< Val >;
393 using BucketAllocator =
typename Alloc::
template rebind< ListBucket< Val > >::other;
423 List(
const List< Val, Alloc >& src);
436 template <
typename OtherAlloc >
437 List(
const List< Val, OtherAlloc >& src);
443 List(List< Val, Alloc >&& src);
449 List(std::initializer_list< Val > list);
472 const const_iterator_safe& cendSafe()
const noexcept;
484 const iterator_safe& endSafe()
noexcept;
498 const const_iterator_safe& crendSafe()
const noexcept;
512 const iterator_safe& rendSafe()
noexcept;
526 const_iterator_safe cbeginSafe()
const;
538 iterator_safe beginSafe();
552 const_iterator_safe crbeginSafe()
const;
565 iterator_safe rbeginSafe();
579 const const_iterator& cend()
const noexcept;
593 const iterator& end()
noexcept;
608 const const_iterator& end()
const noexcept;
624 const const_iterator& crend()
const noexcept;
640 const iterator& rend()
noexcept;
656 const const_iterator& rend()
const noexcept;
672 const_iterator cbegin()
const;
703 const_iterator begin()
const;
719 const_iterator crbegin()
const;
751 const_iterator rbegin()
const;
772 Val& pushFront(
const Val& val);
783 Val& pushFront(Val&& val);
794 template <
typename... Args >
795 Val& push_front(Args&&... args);
806 template <
typename... Args >
807 Val& emplaceFront(Args&&... args);
821 Val& pushBack(
const Val& val);
835 Val& pushBack(Val&& val);
845 template <
typename... Args >
846 Val& push_back(Args&&... args);
858 template <
typename... Args >
859 Val& emplaceBack(Args&&... args);
870 Val& insert(
const Val& val);
881 Val& insert(Val&& val);
896 Val& insert(Size pos,
const Val& val);
909 Val& insert(Size pos, Val&& val);
921 Val& insert(
const const_iterator_safe& iter,
const Val& val, location place = location::BEFORE);
933 Val& insert(
const const_iterator_safe& iter, Val&& val, location place = location::BEFORE);
945 Val& insert(
const const_iterator& iter,
const Val& val, location place = location::BEFORE);
957 Val& insert(
const const_iterator& iter, Val&& val, location place = location::BEFORE);
972 template <
typename... Args >
973 Val& emplace(
const const_iterator& iter, Args&&... args);
988 template <
typename... Args >
989 Val& emplace(
const const_iterator_safe& iter, Args&&... args);
1007 Size size()
const noexcept;
1019 bool exists(
const Val& val)
const;
1041 void erase(
const iterator_safe& iter);
1053 void erase(
const const_iterator_safe& iter);
1065 void eraseByVal(
const Val& val);
1077 void eraseAllVal(
const Val& val);
1106 bool empty()
const noexcept;
1112 void swap(List& other_list);
1118 std::string toString()
const;
1127 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1128 List< Mount, OtherAlloc > map(Mount (*f)(Val))
const;
1137 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1138 List< Mount, OtherAlloc > map(Mount (*f)(Val&))
const;
1147 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1148 List< Mount, OtherAlloc > map(Mount (*f)(
const Val&))
const;
1158 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1159 List< Mount, OtherAlloc > map(
const Mount& mount)
const;
1185 List< Val, Alloc >& operator=(
const List< Val, Alloc >& src);
1204 template <
typename OtherAlloc >
1205 List< Val, Alloc >& operator=(
const List< Val, OtherAlloc >& src);
1213 List< Val, Alloc >& operator=(List< Val, Alloc >&& src);
1227 Val& operator+=(
const Val& val);
1241 Val& operator+=(Val&& val);
1252 template <
typename OtherAlloc >
1253 bool operator==(
const List< Val, OtherAlloc >& src)
const;
1264 template <
typename OtherAlloc >
1265 bool operator!=(
const List< Val, OtherAlloc >& src)
const;
1279 Val& operator[](
const Size i);
1293 const Val& operator[](
const Size i)
const;
1299 ListBucket< Val >* _deb_list_{
nullptr};
1302 ListBucket< Val >* _end_list_{
nullptr};
1305 Size _nb_elements_{Size(0)};
1308 mutable std::vector< const_iterator_safe* > _safe_iterators_;
1311 mutable BucketAllocator _alloc_bucket_;
1322 template <
typename OtherAlloc >
1323 void _copy_elements_(
const List< Val, OtherAlloc >& src);
1334 ListBucket< Val >* _getIthBucket_(Size i)
const noexcept;
1349 ListBucket< Val >* _getBucket_(
const Val& val)
const noexcept;
1362 void _erase_(ListBucket< Val >* bucket);
1369 ListBucket< Val >* _createBucket_(
const Val& val)
const;
1376 ListBucket< Val >* _createBucket_(Val&& val)
const;
1384 template <
typename... Args >
1385 ListBucket< Val >* _createEmplaceBucket_(Args&&... args)
const;
1392 Val& _pushFront_(ListBucket< Val >* new_elt);
1399 Val& _pushBack_(ListBucket< Val >* new_elt);
1407 Val& _insertBefore_(ListBucket< Val >* new_elt, ListBucket< Val >* current_elt);
1415 Val& _insertAfter_(ListBucket< Val >* new_elt, ListBucket< Val >* current_elt);
1425 Val& _insert_(
const const_iterator_safe& iter, ListBucket< Val >* new_elt, location place);
1435 Val& _insert_(
const const_iterator& iter, ListBucket< Val >* new_elt, location place);
1439 friend class ListIterator< Val >;
1440 friend class ListConstIterator< Val >;
1441 friend class ListIteratorSafe< Val >;
1442 friend class ListConstIteratorSafe< Val >;
1499 template <
typename Val >
1500 class ListConstIterator {
1504 using iterator_category = std::bidirectional_iterator_tag;
1505 using value_type = Val;
1506 using reference = Val&;
1507 using const_reference =
const Val&;
1508 using pointer = Val*;
1509 using const_pointer =
const Val*;
1510 using difference_type = std::ptrdiff_t;
1523 ListConstIterator()
noexcept;
1529 template <
typename Alloc >
1530 ListConstIterator(
const List< Val, Alloc >& theList)
noexcept;
1536 ListConstIterator(
const ListConstIterator< Val >& src)
noexcept;
1542 ListConstIterator(ListConstIterator< Val >&& src)
noexcept;
1552 ListConstIterator(
const List< Val >& theList, Size ind_elt);
1557 ~ListConstIterator()
noexcept;
1572 void clear()
noexcept;
1577 void setToEnd()
noexcept;
1585 bool isEnd()
const noexcept;
1601 ListConstIterator< Val >& operator=(
const ListConstIterator< Val >& src)
noexcept;
1609 ListConstIterator< Val >& operator=(ListConstIterator< Val >&& src)
noexcept;
1624 ListConstIterator< Val >& operator++()
noexcept;
1631 ListConstIterator< Val >& operator+=(difference_type i)
noexcept;
1646 ListConstIterator< Val >& operator--()
noexcept;
1654 ListConstIterator< Val >& operator-=(difference_type i)
noexcept;
1662 ListConstIterator< Val > operator+(difference_type i)
noexcept;
1670 ListConstIterator< Val > operator-(difference_type i)
noexcept;
1681 bool operator!=(
const ListConstIterator< Val >& src)
const noexcept;
1692 bool operator==(
const ListConstIterator< Val >& src)
const noexcept;
1699 const Val& operator*()
const;
1706 const Val* operator->()
const;
1715 template <
typename T,
typename A >
1719 ListBucket< Val >* _bucket_{
nullptr};
1722 ListBucket< Val >* _getBucket_()
const noexcept;
1726 template <
typename Val >
1727 typename ListConstIterator< Val >::difference_type
1728 operator-(
const ListConstIterator< Val >& iter1,
const ListConstIterator< Val >& iter2);
1783 template <
typename Val >
1784 class ListIterator:
public ListConstIterator< Val > {
1788 using iterator_category = std::bidirectional_iterator_tag;
1789 using value_type = Val;
1790 using reference = Val&;
1791 using const_reference =
const Val&;
1792 using pointer = Val*;
1793 using const_pointer =
const Val*;
1794 using difference_type = std::ptrdiff_t;
1807 ListIterator()
noexcept;
1814 template <
typename Alloc >
1815 ListIterator(
const List< Val, Alloc >& theList)
noexcept;
1821 ListIterator(
const ListIterator< Val >& src)
noexcept;
1827 ListIterator(ListIterator< Val >&& src)
noexcept;
1837 ListIterator(
const List< Val >& theList, Size ind_elt);
1842 ~ListIterator()
noexcept;
1850 using ListConstIterator< Val >::clear;
1851 using ListConstIterator< Val >::setToEnd;
1852 using ListConstIterator< Val >::isEnd;
1869 ListIterator< Val >& operator=(
const ListIterator< Val >& src)
noexcept;
1880 ListIterator< Val >& operator=(ListIterator< Val >&& src)
noexcept;
1896 ListIterator< Val >& operator++()
noexcept;
1903 ListIterator< Val >& operator+=(difference_type i)
noexcept;
1918 ListIterator< Val >& operator--()
noexcept;
1926 ListIterator< Val >& operator-=(difference_type i)
noexcept;
1934 ListIterator< Val > operator+(difference_type i)
noexcept;
1942 ListIterator< Val > operator-(difference_type i)
noexcept;
1946 using ListConstIterator< Val >::operator==;
1947 using ListConstIterator< Val >::operator!=;
1948 using ListConstIterator< Val >::operator*;
1949 using ListConstIterator< Val >::operator->;
2019 template <
typename Val >
2020 class ListConstIteratorSafe {
2024 using iterator_category = std::bidirectional_iterator_tag;
2025 using value_type = Val;
2026 using reference = Val&;
2027 using const_reference =
const Val&;
2028 using pointer = Val*;
2029 using const_pointer =
const Val*;
2030 using difference_type = std::ptrdiff_t;
2043 ListConstIteratorSafe()
noexcept;
2049 template <
typename Alloc >
2050 ListConstIteratorSafe(
const List< Val, Alloc >& theList);
2056 ListConstIteratorSafe(
const ListConstIteratorSafe< Val >& src);
2066 template <
typename Alloc >
2067 ListConstIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2073 ListConstIteratorSafe(ListConstIteratorSafe< Val >&& src);
2078 ~ListConstIteratorSafe();
2123 ListConstIteratorSafe< Val >& operator=(
const ListConstIteratorSafe< Val >& src);
2131 ListConstIteratorSafe< Val >& operator=(ListConstIteratorSafe< Val >&& src);
2146 ListConstIteratorSafe< Val >& operator++()
noexcept;
2153 ListConstIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2168 ListConstIteratorSafe< Val >& operator--()
noexcept;
2176 ListConstIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2184 ListConstIteratorSafe< Val > operator+(difference_type i)
noexcept;
2192 ListConstIteratorSafe< Val > operator-(difference_type i)
noexcept;
2203 bool operator!=(
const ListConstIteratorSafe< Val >& src)
const;
2214 bool operator==(
const ListConstIteratorSafe< Val >& src)
const;
2221 const Val& operator*()
const;
2228 const Val* operator->()
const;
2236 template <
typename T,
typename A >
2238 friend class ListConstIterator< Val >;
2242 const List< Val, std::allocator< Val > >* _list_{
nullptr};
2245 ListBucket< Val >* _bucket_{
nullptr};
2249 ListBucket< Val >* _next_current_bucket_{
nullptr};
2253 ListBucket< Val >* _prev_current_bucket_{
nullptr};
2256 bool _null_pointing_{
false};
2259 ListBucket< Val >* _getBucket_()
const noexcept;
2262 void _removeFromSafeList_()
const;
2265 ListConstIteratorSafe< Val >& _opPlus_(Size i)
noexcept;
2268 ListConstIteratorSafe< Val >& _opMinus_(Size i)
noexcept;
2272 template <
typename Val >
2273 typename ListConstIteratorSafe< Val >::difference_type
2274 operator-(
const ListConstIteratorSafe< Val >& iter1,
2275 const ListConstIteratorSafe< Val >& iter2);
2330 template <
typename Val >
2331 class ListIteratorSafe:
public ListConstIteratorSafe< Val > {
2335 using iterator_category = std::bidirectional_iterator_tag;
2336 using value_type = Val;
2337 using reference = Val&;
2338 using const_reference =
const Val&;
2339 using pointer = Val*;
2340 using const_pointer =
const Val*;
2341 using difference_type = std::ptrdiff_t;
2354 ListIteratorSafe()
noexcept;
2360 template <
typename Alloc >
2361 ListIteratorSafe(
const List< Val, Alloc >& theList);
2367 ListIteratorSafe(
const ListIteratorSafe< Val >& src);
2377 template <
typename Alloc >
2378 ListIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2384 ListIteratorSafe(ListIteratorSafe< Val >&& src);
2389 ~ListIteratorSafe();
2397 using ListConstIteratorSafe< Val >::clear;
2398 using ListConstIteratorSafe< Val >::setToEnd;
2399 using ListConstIteratorSafe< Val >::isEnd;
2415 ListIteratorSafe< Val >& operator=(
const ListIteratorSafe< Val >& src);
2423 ListIteratorSafe< Val >& operator=(ListIteratorSafe< Val >&& src);
2438 ListIteratorSafe< Val >& operator++()
noexcept;
2445 ListIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2460 ListIteratorSafe< Val >& operator--()
noexcept;
2468 ListIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2476 ListIteratorSafe< Val > operator+(difference_type i)
noexcept;
2484 ListIteratorSafe< Val > operator-(difference_type i)
noexcept;
2502 using ListConstIteratorSafe< Val >::operator!=;
2503 using ListConstIteratorSafe< Val >::operator==;
2504 using ListConstIteratorSafe< Val >::operator*;
2505 using ListConstIteratorSafe< Val >::operator->;
2509 #ifndef DOXYGEN_SHOULD_SKIP_THIS 2512 ListConstIteratorSafe< Debug >::ListConstIteratorSafe()
noexcept;
2514 ListConstIteratorSafe< Debug >::~ListConstIteratorSafe();
2516 ListConstIterator< Debug >::ListConstIterator()
noexcept;
2518 ListConstIterator< Debug >::~ListConstIterator()
noexcept;
2524 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2525 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2526 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2527 extern template class gum::List<
bool >;
2531 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2532 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2533 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2534 extern template class gum::List<
int >;
2538 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2539 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2540 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2541 extern template class gum::List<
unsigned int >;
2548 #include <agrum/tools/core/list_tpl.h>