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"
36namespace containers::future {
90 using ItemBase = ::pw::containers::internal::IntrusiveListItem;
93 using element_type = T;
94 using value_type = std::remove_cv_t<element_type>;
95 using size_type = std::size_t;
96 using difference_type = std::ptrdiff_t;
97 using reference = value_type&;
98 using const_reference =
const value_type&;
99 using pointer = element_type*;
100 using const_pointer =
const element_type*;
109 constexpr explicit Item() =
default;
114 template <
typename,
typename,
bool>
115 friend struct containers::internal::IntrusiveItem;
120 typename ::pw::containers::internal::BidirectionalIterator<T, ItemBase>;
121 using const_iterator = typename ::pw::containers::internal::
122 BidirectionalIterator<std::add_const_t<T>,
const ItemBase>;
123 using reverse_iterator = std::reverse_iterator<iterator>;
124 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
145 template <
typename Iterator>
147 list_.assign(first, last);
155 template <
typename Iterator>
156 void assign(Iterator first, Iterator last) {
157 list_.assign(first, last);
160 void assign(std::initializer_list<T*> items) {
161 list_.assign(items.begin(), items.end());
174 iterator begin() noexcept {
175 return iterator(
static_cast<Item*
>(list_.
begin()));
177 const_iterator begin() const noexcept {
178 return const_iterator(
static_cast<const Item*
>(list_.
begin()));
180 const_iterator cbegin() const noexcept {
return begin(); }
182 iterator end() noexcept {
return iterator(
static_cast<Item*
>(list_.
end())); }
183 const_iterator end() const noexcept {
184 return const_iterator(
static_cast<const Item*
>(list_.
end()));
186 const_iterator cend() const noexcept {
return end(); }
188 reverse_iterator rbegin() {
return reverse_iterator(end()); }
189 const_reverse_iterator rbegin()
const {
190 return const_reverse_iterator(end());
192 const_reverse_iterator crbegin()
const {
193 return const_reverse_iterator(end());
196 reverse_iterator rend() {
return reverse_iterator(begin()); }
197 const_reverse_iterator rend()
const {
198 return const_reverse_iterator(begin());
200 const_reverse_iterator crend()
const {
201 return const_reverse_iterator(begin());
207 [[nodiscard]]
bool empty() const noexcept {
return list_.empty(); }
214 return static_cast<size_type
>(std::distance(begin(), end()));
227 return iterator(list_.
insert_after((--pos).item_, item));
232 template <
typename Iterator>
233 iterator
insert(iterator pos, Iterator first, Iterator last) {
234 return iterator(list_.
insert_after((--pos).item_, first, last));
239 iterator
insert(iterator pos, std::initializer_list<T*> items) {
240 return insert(pos, items.begin(), items.end());
253 iterator
erase(iterator first, iterator last) {
254 return iterator(list_.
erase_after((--first).item_, last.item_));
280 list_.
merge(other.list_, [](
const ItemBase& a,
const ItemBase& b) {
281 return static_cast<const T&>(a) < static_cast<const T&>(b);
286 template <
typename Compare>
288 list_.
merge(other.list_, [comp](
const ItemBase& a,
const ItemBase& b) {
289 return comp(static_cast<const T&>(a), static_cast<const T&>(b));
296 splice(pos, other, other.begin(), other.end());
302 splice(pos, other, it, std::next(it));
311 list_.
splice_after((--pos).item_, other.list_, (--first).item_, last.item_);
315 bool remove(
const T& item) {
return list_.remove(item); }
318 template <
typename UnaryPredicate>
320 return list_.
remove_if([pred](
const ItemBase& item) ->
bool {
321 return pred(
static_cast<const T&
>(item));
326 void reverse() { std::reverse(begin(), end()); }
332 return list_.
unique([](
const ItemBase& a,
const ItemBase& b) ->
bool {
333 return static_cast<const T&
>(a) ==
static_cast<const T&
>(b);
338 template <
typename BinaryPredicate>
340 return list_.
unique([pred](
const ItemBase& a,
const ItemBase& b) ->
bool {
341 return pred(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
349 list_.
sort([](
const ItemBase& a,
const ItemBase& b) ->
bool {
350 return static_cast<const T&
>(a) <
static_cast<const T&
>(b);
355 template <
typename Compare>
357 list_.
sort([comp](
const ItemBase& a,
const ItemBase& b) ->
bool {
358 return comp(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
365 static constexpr void CheckItemType() {
366 using IntrusiveItemType =
367 typename containers::internal::IntrusiveItem<ItemBase, T>::Type;
369 std::is_base_of<IntrusiveItemType, T>(),
370 "IntrusiveList items must be derived from IntrusiveList<T>::Item, "
371 "where T is the item or one of its bases.");
381#if PW_CONTAINERS_USE_LEGACY_INTRUSIVE_LIST
382#if PW_CONTAINERS_INTRUSIVE_LIST_SUPPRESS_DEPRECATION_WARNING
383#define PW_CONTAINERS_INTRUSIVE_LIST_DEPRECATED
385#define PW_CONTAINERS_INTRUSIVE_LIST_DEPRECATED \
386 [[deprecated("See b/362348318 for background and workarounds.")]]
392 containers::internal::LegacyIntrusiveList<T>;
Definition: intrusive_list.h:102
Definition: intrusive_list.h:88
Definition: intrusive_list.h:38
iterator erase(iterator pos)
Definition: intrusive_list.h:248
void swap(IntrusiveList< T > &other) noexcept
Definition: intrusive_list.h:272
size_t unique(BinaryPredicate pred)
Definition: intrusive_list.h:290
void push_front(Item &item)
Inserts an element at the beginning of the list.
Definition: intrusive_list.h:118
void merge(IntrusiveList< T > &other)
Definition: intrusive_list.h:279
Item * before_end() noexcept
Returns a pointer to the last item.
Definition: intrusive_list.h:85
iterator erase(T &item)
Removes the given item from the list. The item is not destructed.
Definition: intrusive_list.h:244
iterator insert(iterator pos, T &item)
Inserts the given item before the given position, pos.
Definition: intrusive_list.h:226
void sort(Compare comp)
Definition: intrusive_list.h:317
IntrusiveList(IntrusiveList &&)=default
constexpr size_t max_size() const noexcept
Definition: intrusive_list.h:98
size_t remove_if(UnaryPredicate pred, size_t max=std::numeric_limits< size_t >::max())
Definition: intrusive_list.h:251
void push_front(T &item)
Inserts an element at the beginning of the list.
Definition: intrusive_list.h:264
void push_back(T &item)
Inserts an element at the end of the list.
Definition: intrusive_list.h:258
size_t size() const
Definition: intrusive_list.h:213
void splice(iterator pos, IntrusiveList< T > &other)
Definition: intrusive_list.h:295
size_type remove_if(UnaryPredicate pred)
Definition: intrusive_list.h:319
void clear()
Removes all items from the list.
Definition: intrusive_list.h:223
bool remove(const T &item)
Definition: intrusive_list.h:315
void pop_back()
Removes the last item in the list. The list must not be empty.
Definition: intrusive_list.h:261
void pop_front()
Removes the first item in the list. The list must not be empty.
Definition: intrusive_list.h:121
void splice(iterator pos, IntrusiveList< T > &other, iterator first, iterator last)
Definition: intrusive_list.h:307
void sort(Compare comp)
Definition: intrusive_list.h:356
constexpr Item * begin() noexcept
Returns a pointer to the first item.
Definition: intrusive_list.h:81
iterator erase(iterator first, iterator last)
Removes the range of items from first (inclusive) to last (exclusive).
Definition: intrusive_list.h:253
IntrusiveList & operator=(IntrusiveList &&)=default
void reverse()
Reverses the order of items in the list.
Definition: intrusive_list.h:326
iterator insert(iterator pos, std::initializer_list< T * > items)
Definition: intrusive_list.h:239
void merge(GenericIntrusiveList< Item > &other, Compare comp)
Definition: intrusive_list.h:190
iterator insert(iterator pos, Iterator first, Iterator last)
Definition: intrusive_list.h:233
T & back()
Reference to the last element in the list. Undefined behavior if empty().
Definition: intrusive_list.h:170
void pop_back()
Removes the last item in the list. The list must not be empty.
Definition: intrusive_list.h:115
void sort()
Definition: intrusive_list.h:348
bool empty() const noexcept
Definition: intrusive_list.h:207
static Item * insert_after(Item *prev, Item &item)
Definition: intrusive_list.h:132
constexpr size_type max_size() const noexcept
Definition: intrusive_list.h:218
static void splice_after(Item *pos, GenericIntrusiveList< Item > &other, Item *first, Item *last)
Definition: intrusive_list.h:208
void clear()
Removes all items from the list.
Definition: intrusive_list.h:105
size_type unique(BinaryPredicate pred)
Definition: intrusive_list.h:339
size_type unique()
Definition: intrusive_list.h:331
void splice(iterator pos, IntrusiveList< T > &other, iterator it)
Definition: intrusive_list.h:301
void merge(IntrusiveList< T > &other, Compare comp)
Definition: intrusive_list.h:287
void push_back(Item &item)
Inserts an element at the end of the list.
Definition: intrusive_list.h:112
constexpr Item * end() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:88
void pop_front()
Removes the first item in the list. The list must not be empty.
Definition: intrusive_list.h:267
static Item * erase_after(Item *item)
Definition: intrusive_list.h:160
T & front()
Reference to the first element in the list. Undefined behavior if empty().
Definition: intrusive_list.h:167
containers::future::IntrusiveList< T > IntrusiveList
Definition: intrusive_list.h:398
The Pigweed namespace.
Definition: alignment.h:27