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 >
121 ListBucket() =
delete;
127 explicit ListBucket(
const Val& v);
133 explicit ListBucket(Val&& v)
noexcept;
140 template <
typename... Args >
141 explicit ListBucket(Emplace, Args&&... args);
147 ListBucket(
const ListBucket< Val >& src);
153 ListBucket(ListBucket< Val >&& src) =
delete;
177 ListBucket< Val >& operator=(
const ListBucket< Val >& src);
184 ListBucket< Val >& operator=(ListBucket< Val >&& src) =
delete;
191 bool operator==(
const ListBucket< Val >& src)
const;
198 bool operator!=(
const ListBucket< Val >& src)
const;
210 Val& operator*()
noexcept;
216 const Val& operator*()
const noexcept;
222 const ListBucket< Val >* next()
const noexcept;
228 const ListBucket< Val >* previous()
const noexcept;
235 template <
typename T,
typename A >
237 friend class ListIterator< Val >;
238 friend class ListConstIterator< Val >;
239 friend class ListIteratorSafe< Val >;
240 friend class ListConstIteratorSafe< Val >;
244 ListBucket< Val >* _prev_{
nullptr};
245 ListBucket< Val >* _next_{
nullptr};
371 template <
typename Val,
typename Alloc = std::allocator< Val > >
376 using value_type = Val;
377 using reference = Val&;
378 using const_reference =
const Val&;
379 using pointer = Val*;
380 using const_pointer =
const Val*;
381 using size_type = Size;
382 using difference_type = std::ptrdiff_t;
383 using allocator_type = Alloc;
384 using iterator = ListIterator< Val >;
385 using const_iterator = ListConstIterator< Val >;
386 using iterator_safe = ListIteratorSafe< Val >;
387 using const_iterator_safe = ListConstIteratorSafe< Val >;
391 using BucketAllocator =
typename Alloc::
template rebind< ListBucket< Val > >::other;
421 List(
const List< Val, Alloc >& src);
434 template <
typename OtherAlloc >
435 List(
const List< Val, OtherAlloc >& src);
441 List(List< Val, Alloc >&& src);
447 List(std::initializer_list< Val > list);
470 const const_iterator_safe& cendSafe()
const noexcept;
482 const iterator_safe& endSafe()
noexcept;
496 const const_iterator_safe& crendSafe()
const noexcept;
510 const iterator_safe& rendSafe()
noexcept;
524 const_iterator_safe cbeginSafe()
const;
536 iterator_safe beginSafe();
550 const_iterator_safe crbeginSafe()
const;
563 iterator_safe rbeginSafe();
577 const const_iterator& cend()
const noexcept;
591 const iterator& end()
noexcept;
606 const const_iterator& end()
const noexcept;
622 const const_iterator& crend()
const noexcept;
638 const iterator& rend()
noexcept;
654 const const_iterator& rend()
const noexcept;
670 const_iterator cbegin()
const;
701 const_iterator begin()
const;
717 const_iterator crbegin()
const;
749 const_iterator rbegin()
const;
770 Val& pushFront(
const Val& val);
781 Val& pushFront(Val&& val);
792 template <
typename... Args >
793 Val& push_front(Args&&... args);
804 template <
typename... Args >
805 Val& emplaceFront(Args&&... args);
819 Val& pushBack(
const Val& val);
833 Val& pushBack(Val&& val);
843 template <
typename... Args >
844 Val& push_back(Args&&... args);
856 template <
typename... Args >
857 Val& emplaceBack(Args&&... args);
868 Val& insert(
const Val& val);
879 Val& insert(Val&& val);
894 Val& insert(Size pos,
const Val& val);
907 Val& insert(Size pos, Val&& val);
919 Val& insert(
const const_iterator_safe& iter,
const Val& val, location place = location::BEFORE);
931 Val& insert(
const const_iterator_safe& iter, Val&& val, location place = location::BEFORE);
943 Val& insert(
const const_iterator& iter,
const Val& val, location place = location::BEFORE);
955 Val& insert(
const const_iterator& iter, Val&& val, location place = location::BEFORE);
970 template <
typename... Args >
971 Val& emplace(
const const_iterator& iter, Args&&... args);
986 template <
typename... Args >
987 Val& emplace(
const const_iterator_safe& iter, Args&&... args);
1005 Size size()
const noexcept;
1017 bool exists(
const Val& val)
const;
1039 void erase(
const iterator_safe& iter);
1051 void erase(
const const_iterator_safe& iter);
1063 void eraseByVal(
const Val& val);
1075 void eraseAllVal(
const Val& val);
1104 bool empty()
const noexcept;
1110 void swap(List& other_list);
1116 std::string toString()
const;
1125 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1126 List< Mount, OtherAlloc > map(Mount (*f)(Val))
const;
1135 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1136 List< Mount, OtherAlloc > map(Mount (*f)(Val&))
const;
1145 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1146 List< Mount, OtherAlloc > map(Mount (*f)(
const Val&))
const;
1156 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1157 List< Mount, OtherAlloc > map(
const Mount& mount)
const;
1183 List< Val, Alloc >& operator=(
const List< Val, Alloc >& src);
1202 template <
typename OtherAlloc >
1203 List< Val, Alloc >& operator=(
const List< Val, OtherAlloc >& src);
1211 List< Val, Alloc >& operator=(List< Val, Alloc >&& src);
1225 Val& operator+=(
const Val& val);
1239 Val& operator+=(Val&& val);
1250 template <
typename OtherAlloc >
1251 bool operator==(
const List< Val, OtherAlloc >& src)
const;
1262 template <
typename OtherAlloc >
1263 bool operator!=(
const List< Val, OtherAlloc >& src)
const;
1277 Val& operator[](
const Size i);
1291 const Val& operator[](
const Size i)
const;
1297 ListBucket< Val >* _deb_list_{
nullptr};
1300 ListBucket< Val >* _end_list_{
nullptr};
1303 Size _nb_elements_{Size(0)};
1306 mutable std::vector< const_iterator_safe* > _safe_iterators_;
1309 mutable BucketAllocator _alloc_bucket_;
1320 template <
typename OtherAlloc >
1321 void _copy_elements_(
const List< Val, OtherAlloc >& src);
1332 ListBucket< Val >* _getIthBucket_(Size i)
const noexcept;
1347 ListBucket< Val >* _getBucket_(
const Val& val)
const noexcept;
1360 void _erase_(ListBucket< Val >* bucket);
1367 ListBucket< Val >* _createBucket_(
const Val& val)
const;
1374 ListBucket< Val >* _createBucket_(Val&& val)
const;
1382 template <
typename... Args >
1383 ListBucket< Val >* _createEmplaceBucket_(Args&&... args)
const;
1390 Val& _pushFront_(ListBucket< Val >* new_elt);
1397 Val& _pushBack_(ListBucket< Val >* new_elt);
1405 Val& _insertBefore_(ListBucket< Val >* new_elt, ListBucket< Val >* current_elt);
1413 Val& _insertAfter_(ListBucket< Val >* new_elt, ListBucket< Val >* current_elt);
1423 Val& _insert_(
const const_iterator_safe& iter, ListBucket< Val >* new_elt, location place);
1433 Val& _insert_(
const const_iterator& iter, ListBucket< Val >* new_elt, location place);
1437 friend class ListIterator< Val >;
1438 friend class ListConstIterator< Val >;
1439 friend class ListIteratorSafe< Val >;
1440 friend class ListConstIteratorSafe< Val >;
1497 template <
typename Val >
1498 class ListConstIterator {
1502 using iterator_category = std::bidirectional_iterator_tag;
1503 using value_type = Val;
1504 using reference = Val&;
1505 using const_reference =
const Val&;
1506 using pointer = Val*;
1507 using const_pointer =
const Val*;
1508 using difference_type = std::ptrdiff_t;
1521 ListConstIterator()
noexcept;
1527 template <
typename Alloc >
1528 ListConstIterator(
const List< Val, Alloc >& theList)
noexcept;
1534 ListConstIterator(
const ListConstIterator< Val >& src)
noexcept;
1540 ListConstIterator(ListConstIterator< Val >&& src)
noexcept;
1550 ListConstIterator(
const List< Val >& theList, Size ind_elt);
1555 ~ListConstIterator()
noexcept;
1570 void clear()
noexcept;
1575 void setToEnd()
noexcept;
1583 bool isEnd()
const noexcept;
1599 ListConstIterator< Val >& operator=(
const ListConstIterator< Val >& src)
noexcept;
1607 ListConstIterator< Val >& operator=(ListConstIterator< Val >&& src)
noexcept;
1622 ListConstIterator< Val >& operator++()
noexcept;
1629 ListConstIterator< Val >& operator+=(difference_type i)
noexcept;
1644 ListConstIterator< Val >& operator--()
noexcept;
1652 ListConstIterator< Val >& operator-=(difference_type i)
noexcept;
1660 ListConstIterator< Val > operator+(difference_type i)
noexcept;
1668 ListConstIterator< Val > operator-(difference_type i)
noexcept;
1679 bool operator!=(
const ListConstIterator< Val >& src)
const noexcept;
1690 bool operator==(
const ListConstIterator< Val >& src)
const noexcept;
1697 const Val& operator*()
const;
1704 const Val* operator->()
const;
1713 template <
typename T,
typename A >
1717 ListBucket< Val >* _bucket_{
nullptr};
1720 ListBucket< Val >* _getBucket_()
const noexcept;
1724 template <
typename Val >
1725 typename ListConstIterator< Val >::difference_type
1726 operator-(
const ListConstIterator< Val >& iter1,
const ListConstIterator< Val >& iter2);
1781 template <
typename Val >
1782 class ListIterator:
public ListConstIterator< Val > {
1786 using iterator_category = std::bidirectional_iterator_tag;
1787 using value_type = Val;
1788 using reference = Val&;
1789 using const_reference =
const Val&;
1790 using pointer = Val*;
1791 using const_pointer =
const Val*;
1792 using difference_type = std::ptrdiff_t;
1805 ListIterator()
noexcept;
1812 template <
typename Alloc >
1813 ListIterator(
const List< Val, Alloc >& theList)
noexcept;
1819 ListIterator(
const ListIterator< Val >& src)
noexcept;
1825 ListIterator(ListIterator< Val >&& src)
noexcept;
1835 ListIterator(
const List< Val >& theList, Size ind_elt);
1840 ~ListIterator()
noexcept;
1848 using ListConstIterator< Val >::clear;
1849 using ListConstIterator< Val >::setToEnd;
1850 using ListConstIterator< Val >::isEnd;
1867 ListIterator< Val >& operator=(
const ListIterator< Val >& src)
noexcept;
1878 ListIterator< Val >& operator=(ListIterator< Val >&& src)
noexcept;
1894 ListIterator< Val >& operator++()
noexcept;
1901 ListIterator< Val >& operator+=(difference_type i)
noexcept;
1916 ListIterator< Val >& operator--()
noexcept;
1924 ListIterator< Val >& operator-=(difference_type i)
noexcept;
1932 ListIterator< Val > operator+(difference_type i)
noexcept;
1940 ListIterator< Val > operator-(difference_type i)
noexcept;
1944 using ListConstIterator< Val >::operator==;
1945 using ListConstIterator< Val >::operator!=;
1946 using ListConstIterator< Val >::operator*;
1947 using ListConstIterator< Val >::operator->;
2017 template <
typename Val >
2018 class ListConstIteratorSafe {
2022 using iterator_category = std::bidirectional_iterator_tag;
2023 using value_type = Val;
2024 using reference = Val&;
2025 using const_reference =
const Val&;
2026 using pointer = Val*;
2027 using const_pointer =
const Val*;
2028 using difference_type = std::ptrdiff_t;
2041 ListConstIteratorSafe()
noexcept;
2047 template <
typename Alloc >
2048 ListConstIteratorSafe(
const List< Val, Alloc >& theList);
2054 ListConstIteratorSafe(
const ListConstIteratorSafe< Val >& src);
2064 template <
typename Alloc >
2065 ListConstIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2071 ListConstIteratorSafe(ListConstIteratorSafe< Val >&& src);
2076 ~ListConstIteratorSafe();
2121 ListConstIteratorSafe< Val >& operator=(
const ListConstIteratorSafe< Val >& src);
2129 ListConstIteratorSafe< Val >& operator=(ListConstIteratorSafe< Val >&& src);
2144 ListConstIteratorSafe< Val >& operator++()
noexcept;
2151 ListConstIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2166 ListConstIteratorSafe< Val >& operator--()
noexcept;
2174 ListConstIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2182 ListConstIteratorSafe< Val > operator+(difference_type i)
noexcept;
2190 ListConstIteratorSafe< Val > operator-(difference_type i)
noexcept;
2201 bool operator!=(
const ListConstIteratorSafe< Val >& src)
const;
2212 bool operator==(
const ListConstIteratorSafe< Val >& src)
const;
2219 const Val& operator*()
const;
2226 const Val* operator->()
const;
2234 template <
typename T,
typename A >
2236 friend class ListConstIterator< Val >;
2240 const List< Val, std::allocator< Val > >* _list_{
nullptr};
2243 ListBucket< Val >* _bucket_{
nullptr};
2247 ListBucket< Val >* _next_current_bucket_{
nullptr};
2251 ListBucket< Val >* _prev_current_bucket_{
nullptr};
2254 bool _null_pointing_{
false};
2257 ListBucket< Val >* _getBucket_()
const noexcept;
2260 void _removeFromSafeList_()
const;
2263 ListConstIteratorSafe< Val >& _opPlus_(Size i)
noexcept;
2266 ListConstIteratorSafe< Val >& _opMinus_(Size i)
noexcept;
2270 template <
typename Val >
2271 typename ListConstIteratorSafe< Val >::difference_type
2272 operator-(
const ListConstIteratorSafe< Val >& iter1,
2273 const ListConstIteratorSafe< Val >& iter2);
2328 template <
typename Val >
2329 class ListIteratorSafe:
public ListConstIteratorSafe< Val > {
2333 using iterator_category = std::bidirectional_iterator_tag;
2334 using value_type = Val;
2335 using reference = Val&;
2336 using const_reference =
const Val&;
2337 using pointer = Val*;
2338 using const_pointer =
const Val*;
2339 using difference_type = std::ptrdiff_t;
2352 ListIteratorSafe()
noexcept;
2358 template <
typename Alloc >
2359 ListIteratorSafe(
const List< Val, Alloc >& theList);
2365 ListIteratorSafe(
const ListIteratorSafe< Val >& src);
2375 template <
typename Alloc >
2376 ListIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2382 ListIteratorSafe(ListIteratorSafe< Val >&& src);
2387 ~ListIteratorSafe();
2395 using ListConstIteratorSafe< Val >::clear;
2396 using ListConstIteratorSafe< Val >::setToEnd;
2397 using ListConstIteratorSafe< Val >::isEnd;
2413 ListIteratorSafe< Val >& operator=(
const ListIteratorSafe< Val >& src);
2421 ListIteratorSafe< Val >& operator=(ListIteratorSafe< Val >&& src);
2436 ListIteratorSafe< Val >& operator++()
noexcept;
2443 ListIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2458 ListIteratorSafe< Val >& operator--()
noexcept;
2466 ListIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2474 ListIteratorSafe< Val > operator+(difference_type i)
noexcept;
2482 ListIteratorSafe< Val > operator-(difference_type i)
noexcept;
2500 using ListConstIteratorSafe< Val >::operator!=;
2501 using ListConstIteratorSafe< Val >::operator==;
2502 using ListConstIteratorSafe< Val >::operator*;
2503 using ListConstIteratorSafe< Val >::operator->;
2507 #ifndef DOXYGEN_SHOULD_SKIP_THIS 2510 ListConstIteratorSafe< Debug >::ListConstIteratorSafe()
noexcept;
2512 ListConstIteratorSafe< Debug >::~ListConstIteratorSafe();
2514 ListConstIterator< Debug >::ListConstIterator()
noexcept;
2516 ListConstIterator< Debug >::~ListConstIterator()
noexcept;
2522 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2523 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2524 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2525 extern template class gum::List<
bool >;
2529 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2530 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2531 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2532 extern template class gum::List<
int >;
2536 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2537 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2538 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2539 extern template class gum::List<
unsigned int >;
2546 #include <agrum/tools/core/list_tpl.h>