19#include <initializer_list>
24#include "pw_containers/config.h"
25#include "pw_containers/internal/intrusive_item.h"
26#include "pw_containers/internal/intrusive_list.h"
27#include "pw_containers/internal/intrusive_list_item.h"
28#include "pw_containers/internal/intrusive_list_iterator.h"
29#include "pw_containers/internal/legacy_intrusive_list.h"
30#include "pw_containers/intrusive_forward_list.h"
33namespace containers::future {
84 using ItemBase = ::pw::containers::internal::IntrusiveListItem;
87 using element_type = T;
88 using value_type = std::remove_cv_t<element_type>;
89 using size_type = std::size_t;
90 using difference_type = std::ptrdiff_t;
91 using reference = value_type&;
92 using const_reference =
const value_type&;
93 using pointer = element_type*;
94 using const_pointer =
const element_type*;
96 class Item :
public ItemBase {
103 constexpr explicit Item() =
default;
108 template <
typename,
typename,
bool>
109 friend struct containers::internal::IntrusiveItem;
114 typename ::pw::containers::internal::BidirectionalIterator<T, ItemBase>;
115 using const_iterator = typename ::pw::containers::internal::
116 BidirectionalIterator<std::add_const_t<T>,
const ItemBase>;
117 using reverse_iterator = std::reverse_iterator<iterator>;
118 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
139 template <
typename Iterator>
141 list_.assign(first, last);
149 template <
typename Iterator>
150 void assign(Iterator first, Iterator last) {
151 list_.assign(first, last);
154 void assign(std::initializer_list<T*> items) {
155 list_.assign(items.begin(), items.end());
168 iterator begin() noexcept {
169 return iterator(
static_cast<Item*
>(list_.
begin()));
171 const_iterator begin() const noexcept {
172 return const_iterator(
static_cast<const Item*
>(list_.
begin()));
174 const_iterator cbegin() const noexcept {
return begin(); }
176 iterator end() noexcept {
return iterator(
static_cast<Item*
>(list_.
end())); }
177 const_iterator end() const noexcept {
178 return const_iterator(
static_cast<const Item*
>(list_.
end()));
180 const_iterator cend() const noexcept {
return end(); }
182 reverse_iterator rbegin() {
return reverse_iterator(end()); }
183 const_reverse_iterator rbegin()
const {
184 return const_reverse_iterator(end());
186 const_reverse_iterator crbegin()
const {
187 return const_reverse_iterator(end());
190 reverse_iterator rend() {
return reverse_iterator(begin()); }
191 const_reverse_iterator rend()
const {
192 return const_reverse_iterator(begin());
194 const_reverse_iterator crend()
const {
195 return const_reverse_iterator(begin());
201 [[nodiscard]]
bool empty() const noexcept {
return list_.empty(); }
205 return static_cast<size_type
>(std::distance(begin(), end()));
218 return iterator(list_.
insert_after((--pos).item_, item));
223 template <
typename Iterator>
224 iterator
insert(iterator pos, Iterator first, Iterator last) {
225 return iterator(list_.
insert_after((--pos).item_, first, last));
230 iterator
insert(iterator pos, std::initializer_list<T*> items) {
231 return insert(pos, items.begin(), items.end());
244 iterator
erase(iterator first, iterator last) {
245 return iterator(list_.
erase_after((--first).item_, last.item_));
271 list_.
merge(other.list_, [](
const ItemBase& a,
const ItemBase& b) {
272 return static_cast<const T&>(a) < static_cast<const T&>(b);
277 template <
typename Compare>
279 list_.
merge(other.list_, [comp](
const ItemBase& a,
const ItemBase& b) {
280 return comp(static_cast<const T&>(a), static_cast<const T&>(b));
287 splice(pos, other, other.begin(), other.end());
293 splice(pos, other, it, std::next(it));
302 list_.
splice_after((--pos).item_, other.list_, (--first).item_, last.item_);
306 bool remove(
const T& item) {
return list_.remove(item); }
309 template <
typename UnaryPredicate>
311 return list_.
remove_if([pred](
const ItemBase& item) ->
bool {
312 return pred(
static_cast<const T&
>(item));
317 void reverse() { std::reverse(begin(), end()); }
323 return list_.
unique([](
const ItemBase& a,
const ItemBase& b) ->
bool {
324 return static_cast<const T&
>(a) ==
static_cast<const T&
>(b);
329 template <
typename BinaryPredicate>
331 return list_.
unique([pred](
const ItemBase& a,
const ItemBase& b) ->
bool {
332 return pred(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
340 list_.
sort([](
const ItemBase& a,
const ItemBase& b) ->
bool {
341 return static_cast<const T&
>(a) <
static_cast<const T&
>(b);
346 template <
typename Compare>
348 list_.
sort([comp](
const ItemBase& a,
const ItemBase& b) ->
bool {
349 return comp(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
356 static constexpr void CheckItemType() {
357 using IntrusiveItemType =
358 typename containers::internal::IntrusiveItem<ItemBase, T>::Type;
360 std::is_base_of<IntrusiveItemType, T>(),
361 "IntrusiveList items must be derived from IntrusiveList<T>::Item, "
362 "where T is the item or one of its bases.");
372#if PW_CONTAINERS_USE_LEGACY_INTRUSIVE_LIST
373#if PW_CONTAINERS_INTRUSIVE_LIST_SUPPRESS_DEPRECATION_WARNING
374#define PW_CONTAINERS_INTRUSIVE_LIST_DEPRECATED
376#define PW_CONTAINERS_INTRUSIVE_LIST_DEPRECATED \
377 [[deprecated("See b/362348318 for background and workarounds.")]]
383 containers::internal::LegacyIntrusiveList<T>;
Definition: intrusive_list.h:96
Definition: intrusive_list.h:82
iterator erase(iterator pos)
Definition: intrusive_list.h:239
void swap(IntrusiveList< T > &other) noexcept
Definition: intrusive_list.h:263
void merge(IntrusiveList< T > &other)
Definition: intrusive_list.h:270
iterator erase(T &item)
Removes the given item from the list. The item is not destructed.
Definition: intrusive_list.h:235
iterator insert(iterator pos, T &item)
Inserts the given item before the given position, pos.
Definition: intrusive_list.h:217
IntrusiveList(IntrusiveList &&)=default
void push_front(T &item)
Inserts an element at the beginning of the list.
Definition: intrusive_list.h:255
void push_back(T &item)
Inserts an element at the end of the list.
Definition: intrusive_list.h:249
size_t size() const
Definition: intrusive_list.h:204
void splice(iterator pos, IntrusiveList< T > &other)
Definition: intrusive_list.h:286
size_type remove_if(UnaryPredicate pred)
Definition: intrusive_list.h:310
void clear()
Removes all items from the list.
Definition: intrusive_list.h:214
bool remove(const T &item)
Definition: intrusive_list.h:306
void pop_back()
Removes the last item in the list. The list must not be empty.
Definition: intrusive_list.h:252
void splice(iterator pos, IntrusiveList< T > &other, iterator first, iterator last)
Definition: intrusive_list.h:298
void sort(Compare comp)
Definition: intrusive_list.h:347
iterator erase(iterator first, iterator last)
Removes the range of items from first (inclusive) to last (exclusive).
Definition: intrusive_list.h:244
IntrusiveList & operator=(IntrusiveList &&)=default
void reverse()
Reverses the order of items in the list.
Definition: intrusive_list.h:317
iterator insert(iterator pos, std::initializer_list< T * > items)
Definition: intrusive_list.h:230
iterator insert(iterator pos, Iterator first, Iterator last)
Definition: intrusive_list.h:224
T & back()
Reference to the last element in the list. Undefined behavior if empty().
Definition: intrusive_list.h:164
void sort()
Definition: intrusive_list.h:339
bool empty() const noexcept
Definition: intrusive_list.h:201
constexpr size_type max_size() const noexcept
Definition: intrusive_list.h:209
size_type unique(BinaryPredicate pred)
Definition: intrusive_list.h:330
size_type unique()
Definition: intrusive_list.h:322
void splice(iterator pos, IntrusiveList< T > &other, iterator it)
Definition: intrusive_list.h:292
void merge(IntrusiveList< T > &other, Compare comp)
Definition: intrusive_list.h:278
void pop_front()
Removes the first item in the list. The list must not be empty.
Definition: intrusive_list.h:258
T & front()
Reference to the first element in the list. Undefined behavior if empty().
Definition: intrusive_list.h:161
Definition: intrusive_list.h:33
size_t unique(BinaryPredicate pred)
Definition: intrusive_list.h:273
Item * before_end() noexcept
Returns a pointer to the last item.
Definition: intrusive_list.h:80
void sort(Compare comp)
Definition: intrusive_list.h:300
constexpr size_t max_size() const noexcept
Definition: intrusive_list.h:93
size_t remove_if(UnaryPredicate pred, size_t max=std::numeric_limits< size_t >::max())
Definition: intrusive_list.h:234
constexpr Item * before_begin() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:72
constexpr Item * begin() noexcept
Returns a pointer to the first item.
Definition: intrusive_list.h:76
void merge(GenericIntrusiveList< Item > &other, Compare comp)
Definition: intrusive_list.h:173
static Item * insert_after(Item *prev, Item &item)
Definition: intrusive_list.h:115
static void splice_after(Item *pos, GenericIntrusiveList< Item > &other, Item *first, Item *last)
Definition: intrusive_list.h:191
void clear()
Removes all items from the list.
Definition: intrusive_list.h:100
constexpr Item * end() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:83
static Item * erase_after(Item *item)
Definition: intrusive_list.h:143
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
containers::future::IntrusiveList< T > IntrusiveList
Definition: intrusive_list.h:389