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 =
392 typename Alloc::
template rebind< ListBucket< Val > >::other;
422 List(
const List< Val, Alloc >& src);
435 template <
typename OtherAlloc >
436 List(
const List< Val, OtherAlloc >& src);
442 List(List< Val, Alloc >&& src);
448 List(std::initializer_list< Val > list);
471 const const_iterator_safe& cendSafe()
const noexcept;
483 const iterator_safe& endSafe()
noexcept;
497 const const_iterator_safe& crendSafe()
const noexcept;
511 const iterator_safe& rendSafe()
noexcept;
525 const_iterator_safe cbeginSafe()
const;
537 iterator_safe beginSafe();
551 const_iterator_safe crbeginSafe()
const;
564 iterator_safe rbeginSafe();
578 const const_iterator& cend()
const noexcept;
592 const iterator& end()
noexcept;
607 const const_iterator& end()
const noexcept;
623 const const_iterator& crend()
const noexcept;
639 const iterator& rend()
noexcept;
655 const const_iterator& rend()
const noexcept;
671 const_iterator cbegin()
const;
702 const_iterator begin()
const;
718 const_iterator crbegin()
const;
750 const_iterator rbegin()
const;
771 Val& pushFront(
const Val& val);
782 Val& pushFront(Val&& val);
793 template <
typename... Args >
794 Val& push_front(Args&&... args);
805 template <
typename... Args >
806 Val& emplaceFront(Args&&... args);
820 Val& pushBack(
const Val& val);
834 Val& pushBack(Val&& val);
844 template <
typename... Args >
845 Val& push_back(Args&&... args);
857 template <
typename... Args >
858 Val& emplaceBack(Args&&... args);
869 Val& insert(
const Val& val);
880 Val& insert(Val&& val);
895 Val& insert(Size pos,
const Val& val);
908 Val& insert(Size pos, Val&& val);
920 Val& insert(
const const_iterator_safe& iter,
922 location place = location::BEFORE);
934 Val& insert(
const const_iterator_safe& iter,
936 location place = location::BEFORE);
948 Val& insert(
const const_iterator& iter,
950 location place = location::BEFORE);
962 Val& insert(
const const_iterator& iter,
964 location place = location::BEFORE);
979 template <
typename... Args >
980 Val& emplace(
const const_iterator& iter, Args&&... args);
995 template <
typename... Args >
996 Val& emplace(
const const_iterator_safe& iter, Args&&... args);
1014 Size size()
const noexcept;
1026 bool exists(
const Val& val)
const;
1048 void erase(
const iterator_safe& iter);
1060 void erase(
const const_iterator_safe& iter);
1072 void eraseByVal(
const Val& val);
1084 void eraseAllVal(
const Val& val);
1113 bool empty()
const noexcept;
1119 void swap(List& other_list);
1125 std::string toString()
const;
1134 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1135 List< Mount, OtherAlloc > map(Mount (*f)(Val))
const;
1144 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1145 List< Mount, OtherAlloc > map(Mount (*f)(Val&))
const;
1154 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1155 List< Mount, OtherAlloc > map(Mount (*f)(
const Val&))
const;
1165 template <
typename Mount,
typename OtherAlloc = std::allocator< Mount > >
1166 List< Mount, OtherAlloc > map(
const Mount& mount)
const;
1192 List< Val, Alloc >& operator=(
const List< Val, Alloc >& src);
1211 template <
typename OtherAlloc >
1212 List< Val, Alloc >& operator=(
const List< Val, OtherAlloc >& src);
1220 List< Val, Alloc >& operator=(List< Val, Alloc >&& src);
1234 Val& operator+=(
const Val& val);
1248 Val& operator+=(Val&& val);
1259 template <
typename OtherAlloc >
1260 bool operator==(
const List< Val, OtherAlloc >& src)
const;
1271 template <
typename OtherAlloc >
1272 bool operator!=(
const List< Val, OtherAlloc >& src)
const;
1286 Val& operator[](
const Size i);
1300 const Val& operator[](
const Size i)
const;
1306 ListBucket< Val >* deb_list__{
nullptr};
1309 ListBucket< Val >* end_list__{
nullptr};
1312 Size nb_elements__{Size(0)};
1315 mutable std::vector< const_iterator_safe* > safe_iterators__;
1318 mutable BucketAllocator alloc_bucket__;
1329 template <
typename OtherAlloc >
1330 void copy_elements__(
const List< Val, OtherAlloc >& src);
1341 ListBucket< Val >* getIthBucket__(Size i)
const noexcept;
1356 ListBucket< Val >* getBucket__(
const Val& val)
const noexcept;
1369 void erase__(ListBucket< Val >* bucket);
1376 ListBucket< Val >* createBucket__(
const Val& val)
const;
1383 ListBucket< Val >* createBucket__(Val&& val)
const;
1391 template <
typename... Args >
1392 ListBucket< Val >* createEmplaceBucket__(Args&&... args)
const;
1399 Val& pushFront__(ListBucket< Val >* new_elt);
1406 Val& pushBack__(ListBucket< Val >* new_elt);
1414 Val& insertBefore__(ListBucket< Val >* new_elt,
1415 ListBucket< Val >* current_elt);
1423 Val& insertAfter__(ListBucket< Val >* new_elt, ListBucket< Val >* current_elt);
1433 Val& insert__(
const const_iterator_safe& iter,
1434 ListBucket< Val >* new_elt,
1445 Val& insert__(
const const_iterator& iter,
1446 ListBucket< Val >* new_elt,
1451 friend class ListIterator< Val >;
1452 friend class ListConstIterator< Val >;
1453 friend class ListIteratorSafe< Val >;
1454 friend class ListConstIteratorSafe< Val >;
1511 template <
typename Val >
1512 class ListConstIterator {
1516 using iterator_category = std::bidirectional_iterator_tag;
1517 using value_type = Val;
1518 using reference = Val&;
1519 using const_reference =
const Val&;
1520 using pointer = Val*;
1521 using const_pointer =
const Val*;
1522 using difference_type = std::ptrdiff_t;
1535 ListConstIterator()
noexcept;
1541 template <
typename Alloc >
1542 ListConstIterator(
const List< Val, Alloc >& theList)
noexcept;
1548 ListConstIterator(
const ListConstIterator< Val >& src)
noexcept;
1554 ListConstIterator(ListConstIterator< Val >&& src)
noexcept;
1564 ListConstIterator(
const List< Val >& theList, Size ind_elt);
1569 ~ListConstIterator()
noexcept;
1584 void clear()
noexcept;
1589 void setToEnd()
noexcept;
1597 bool isEnd()
const noexcept;
1613 ListConstIterator< Val >&
1614 operator=(
const ListConstIterator< Val >& src)
noexcept;
1622 ListConstIterator< Val >& operator=(ListConstIterator< Val >&& src)
noexcept;
1637 ListConstIterator< Val >& operator++()
noexcept;
1644 ListConstIterator< Val >& operator+=(difference_type i)
noexcept;
1659 ListConstIterator< Val >& operator--()
noexcept;
1667 ListConstIterator< Val >& operator-=(difference_type i)
noexcept;
1675 ListConstIterator< Val > operator+(difference_type i)
noexcept;
1683 ListConstIterator< Val > operator-(difference_type i)
noexcept;
1694 bool operator!=(
const ListConstIterator< Val >& src)
const noexcept;
1705 bool operator==(
const ListConstIterator< Val >& src)
const noexcept;
1712 const Val& operator*()
const;
1719 const Val* operator->()
const;
1728 template <
typename T,
typename A >
1732 ListBucket< Val >* bucket__{
nullptr};
1735 ListBucket< Val >* getBucket__()
const noexcept;
1739 template <
typename Val >
1740 typename ListConstIterator< Val >::difference_type
1741 operator-(
const ListConstIterator< Val >& iter1,
1742 const ListConstIterator< Val >& iter2);
1797 template <
typename Val >
1798 class ListIterator:
public ListConstIterator< Val > {
1802 using iterator_category = std::bidirectional_iterator_tag;
1803 using value_type = Val;
1804 using reference = Val&;
1805 using const_reference =
const Val&;
1806 using pointer = Val*;
1807 using const_pointer =
const Val*;
1808 using difference_type = std::ptrdiff_t;
1821 ListIterator()
noexcept;
1828 template <
typename Alloc >
1829 ListIterator(
const List< Val, Alloc >& theList)
noexcept;
1835 ListIterator(
const ListIterator< Val >& src)
noexcept;
1841 ListIterator(ListIterator< Val >&& src)
noexcept;
1851 ListIterator(
const List< Val >& theList, Size ind_elt);
1856 ~ListIterator()
noexcept;
1864 using ListConstIterator< Val >::clear;
1865 using ListConstIterator< Val >::setToEnd;
1866 using ListConstIterator< Val >::isEnd;
1883 ListIterator< Val >& operator=(
const ListIterator< Val >& src)
noexcept;
1894 ListIterator< Val >& operator=(ListIterator< Val >&& src)
noexcept;
1910 ListIterator< Val >& operator++()
noexcept;
1917 ListIterator< Val >& operator+=(difference_type i)
noexcept;
1932 ListIterator< Val >& operator--()
noexcept;
1940 ListIterator< Val >& operator-=(difference_type i)
noexcept;
1948 ListIterator< Val > operator+(difference_type i)
noexcept;
1956 ListIterator< Val > operator-(difference_type i)
noexcept;
1960 using ListConstIterator< Val >::operator==;
1961 using ListConstIterator< Val >::operator!=;
1962 using ListConstIterator< Val >::operator*;
1963 using ListConstIterator< Val >::operator->;
2033 template <
typename Val >
2034 class ListConstIteratorSafe {
2038 using iterator_category = std::bidirectional_iterator_tag;
2039 using value_type = Val;
2040 using reference = Val&;
2041 using const_reference =
const Val&;
2042 using pointer = Val*;
2043 using const_pointer =
const Val*;
2044 using difference_type = std::ptrdiff_t;
2057 ListConstIteratorSafe()
noexcept;
2063 template <
typename Alloc >
2064 ListConstIteratorSafe(
const List< Val, Alloc >& theList);
2070 ListConstIteratorSafe(
const ListConstIteratorSafe< Val >& src);
2080 template <
typename Alloc >
2081 ListConstIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2087 ListConstIteratorSafe(ListConstIteratorSafe< Val >&& src);
2092 ~ListConstIteratorSafe();
2137 ListConstIteratorSafe< Val >&
2138 operator=(
const ListConstIteratorSafe< Val >& src);
2146 ListConstIteratorSafe< Val >& operator=(ListConstIteratorSafe< Val >&& src);
2161 ListConstIteratorSafe< Val >& operator++()
noexcept;
2168 ListConstIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2183 ListConstIteratorSafe< Val >& operator--()
noexcept;
2191 ListConstIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2199 ListConstIteratorSafe< Val > operator+(difference_type i)
noexcept;
2207 ListConstIteratorSafe< Val > operator-(difference_type i)
noexcept;
2218 bool operator!=(
const ListConstIteratorSafe< Val >& src)
const;
2229 bool operator==(
const ListConstIteratorSafe< Val >& src)
const;
2236 const Val& operator*()
const;
2243 const Val* operator->()
const;
2251 template <
typename T,
typename A >
2253 friend class ListConstIterator< Val >;
2257 const List< Val, std::allocator< Val > >* list__{
nullptr};
2260 ListBucket< Val >* bucket__{
nullptr};
2264 ListBucket< Val >* next_current_bucket__{
nullptr};
2268 ListBucket< Val >* prev_current_bucket__{
nullptr};
2271 bool null_pointing__{
false};
2274 ListBucket< Val >* getBucket__()
const noexcept;
2277 void removeFromSafeList__()
const;
2280 ListConstIteratorSafe< Val >& opPlus__(Size i)
noexcept;
2283 ListConstIteratorSafe< Val >& opMinus__(Size i)
noexcept;
2287 template <
typename Val >
2288 typename ListConstIteratorSafe< Val >::difference_type
2289 operator-(
const ListConstIteratorSafe< Val >& iter1,
2290 const ListConstIteratorSafe< Val >& iter2);
2345 template <
typename Val >
2346 class ListIteratorSafe:
public ListConstIteratorSafe< Val > {
2350 using iterator_category = std::bidirectional_iterator_tag;
2351 using value_type = Val;
2352 using reference = Val&;
2353 using const_reference =
const Val&;
2354 using pointer = Val*;
2355 using const_pointer =
const Val*;
2356 using difference_type = std::ptrdiff_t;
2369 ListIteratorSafe()
noexcept;
2375 template <
typename Alloc >
2376 ListIteratorSafe(
const List< Val, Alloc >& theList);
2382 ListIteratorSafe(
const ListIteratorSafe< Val >& src);
2392 template <
typename Alloc >
2393 ListIteratorSafe(
const List< Val, Alloc >& theList, Size ind_elt);
2399 ListIteratorSafe(ListIteratorSafe< Val >&& src);
2404 ~ListIteratorSafe();
2412 using ListConstIteratorSafe< Val >::clear;
2413 using ListConstIteratorSafe< Val >::setToEnd;
2414 using ListConstIteratorSafe< Val >::isEnd;
2430 ListIteratorSafe< Val >& operator=(
const ListIteratorSafe< Val >& src);
2438 ListIteratorSafe< Val >& operator=(ListIteratorSafe< Val >&& src);
2453 ListIteratorSafe< Val >& operator++()
noexcept;
2460 ListIteratorSafe< Val >& operator+=(difference_type i)
noexcept;
2475 ListIteratorSafe< Val >& operator--()
noexcept;
2483 ListIteratorSafe< Val >& operator-=(difference_type i)
noexcept;
2491 ListIteratorSafe< Val > operator+(difference_type i)
noexcept;
2499 ListIteratorSafe< Val > operator-(difference_type i)
noexcept;
2517 using ListConstIteratorSafe< Val >::operator!=;
2518 using ListConstIteratorSafe< Val >::operator==;
2519 using ListConstIteratorSafe< Val >::operator*;
2520 using ListConstIteratorSafe< Val >::operator->;
2524 #ifndef DOXYGEN_SHOULD_SKIP_THIS 2527 ListConstIteratorSafe< Debug >::ListConstIteratorSafe()
noexcept;
2529 ListConstIteratorSafe< Debug >::~ListConstIteratorSafe();
2531 ListConstIterator< Debug >::ListConstIterator()
noexcept;
2533 ListConstIterator< Debug >::~ListConstIterator()
noexcept;
2539 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2540 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2541 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2542 extern template class gum::List<
bool >;
2546 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2547 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2548 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2549 extern template class gum::List<
int >;
2553 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2554 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2555 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS 2556 extern template class gum::List<
unsigned int >;
2563 #include <agrum/tools/core/list_tpl.h>