17#include <initializer_list>
22#include "pw_containers/config.h"
23#include "pw_containers/internal/intrusive_item.h"
24#include "pw_containers/internal/intrusive_list.h"
25#include "pw_containers/internal/intrusive_list_item.h"
26#include "pw_containers/internal/intrusive_list_iterator.h"
29namespace containers::internal {
93 using ItemBase = ::pw::containers::internal::IntrusiveForwardListItem;
96 using element_type = T;
97 using value_type = std::remove_cv_t<element_type>;
98 using size_type = std::size_t;
99 using difference_type = std::ptrdiff_t;
100 using reference = value_type&;
101 using const_reference =
const value_type&;
102 using pointer = element_type*;
103 using const_pointer =
const element_type*;
111 constexpr explicit Item() =
default;
116 template <
typename,
typename,
bool>
117 friend struct containers::internal::IntrusiveItem;
122 typename ::pw::containers::internal::ForwardIterator<T, ItemBase>;
123 using const_iterator =
124 typename ::pw::containers::internal::ForwardIterator<std::add_const_t<T>,
146 template <
typename Iterator>
148 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());
167 reference
front() {
return *
static_cast<T*
>(list_.
begin()); }
168 const_reference
front()
const {
169 return *
static_cast<const T*
>(list_.
begin());
174 iterator before_begin() noexcept {
return iterator(list_.
before_begin()); }
175 const_iterator before_begin() const noexcept {
178 const_iterator cbefore_begin() const noexcept {
return before_begin(); }
180 iterator begin() noexcept {
return iterator(list_.
begin()); }
181 const_iterator begin() const noexcept {
182 return const_iterator(list_.
begin());
184 const_iterator cbegin() const noexcept {
return begin(); }
186 iterator end() noexcept {
return iterator(list_.
end()); }
187 const_iterator end() const noexcept {
return const_iterator(list_.
end()); }
188 const_iterator cend() const noexcept {
return end(); }
193 [[nodiscard]]
bool empty() const noexcept {
return list_.empty(); }
197 return std::numeric_limits<difference_type>::max();
212 template <
typename Iterator>
214 return iterator(list_.
insert_after(pos.item_, first, last));
230 return iterator(list_.
erase_after(first.item_, last.item_));
243 list_.swap(other.list_);
252 list_.
merge(other.list_, [](
const ItemBase& a,
const ItemBase& b) ->
bool {
253 return static_cast<const T&>(a) < static_cast<const T&>(b);
258 template <
typename Compare>
260 list_.
merge(other.list_, [comp](
const ItemBase& a,
const ItemBase& b) {
261 return comp(static_cast<const T&>(a), static_cast<const T&>(b));
268 splice_after(pos, other, other.before_begin(), other.end());
283 list_.
splice_after(pos.item_, other.list_, first.item_, last.item_);
287 bool remove(
const T& item) {
return list_.remove(item); }
290 template <
typename UnaryPredicate>
292 return list_.
remove_if([pred](
const ItemBase& item) ->
bool {
293 return pred(
static_cast<const T&
>(item));
304 return list_.
unique([](
const ItemBase& a,
const ItemBase& b) ->
bool {
305 return static_cast<const T&
>(a) ==
static_cast<const T&
>(b);
310 template <
typename BinaryPredicate>
312 return list_.
unique([pred](
const ItemBase& a,
const ItemBase& b) {
313 return pred(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
321 list_.
sort([](
const ItemBase& a,
const ItemBase& b) ->
bool {
322 return static_cast<const T&
>(a) <
static_cast<const T&
>(b);
327 template <
typename Compare>
329 list_.
sort([comp](
const ItemBase& a,
const ItemBase& b) {
330 return comp(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
337 static constexpr void CheckItemType() {
338 using IntrusiveItemType =
339 typename containers::internal::IntrusiveItem<ItemBase, T>::Type;
341 std::is_base_of<IntrusiveItemType, T>(),
342 "IntrusiveForwardList items must be derived from "
343 "IntrusiveForwardList<T>::Item, where T is the item or one of its "
348 friend class containers::internal::LegacyIntrusiveList;
Definition: intrusive_forward_list.h:105
Definition: intrusive_forward_list.h:91
Definition: intrusive_list.h:38
Definition: intrusive_forward_list.h:39
void merge(IntrusiveForwardList< T > &other, Compare comp)
Definition: intrusive_forward_list.h:259
void pop_front()
Removes the first item in the list. The list must not be empty.
Definition: intrusive_forward_list.h:237
size_t unique(BinaryPredicate pred)
Definition: intrusive_list.h:278
size_type unique(BinaryPredicate pred)
Definition: intrusive_forward_list.h:311
void merge(IntrusiveForwardList< T > &other)
Definition: intrusive_forward_list.h:251
iterator erase_after(iterator pos)
Removes the item following pos from the list. The item is not destructed.
Definition: intrusive_forward_list.h:224
void swap(IntrusiveForwardList< T > &other) noexcept
Definition: intrusive_forward_list.h:242
iterator erase_after(iterator first, iterator last)
Removes the range of items from first (inclusive) to last (exclusive).
Definition: intrusive_forward_list.h:229
void sort(Compare comp)
Definition: intrusive_list.h:305
size_type unique()
Definition: intrusive_forward_list.h:303
void reverse()
Definition: intrusive_forward_list.h:298
size_t remove_if(UnaryPredicate pred, size_t max=std::numeric_limits< size_t >::max())
Definition: intrusive_list.h:239
void splice_after(iterator pos, IntrusiveForwardList< T > &other, iterator first, iterator last)
Definition: intrusive_forward_list.h:279
void reverse()
Reverses the order of items in the list.
Definition: intrusive_list.h:262
void clear()
Definition: intrusive_forward_list.h:203
bool empty() const noexcept
Definition: intrusive_forward_list.h:193
iterator insert_after(iterator pos, T &item)
Inserts the given item after the given position, pos.
Definition: intrusive_forward_list.h:206
void sort()
Definition: intrusive_forward_list.h:320
constexpr Item * before_begin() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:77
void sort(Compare comp)
Definition: intrusive_forward_list.h:328
constexpr Item * begin() noexcept
Returns a pointer to the first item.
Definition: intrusive_list.h:81
void splice_after(iterator pos, IntrusiveForwardList< T > &other)
Definition: intrusive_forward_list.h:267
void merge(GenericIntrusiveList< Item > &other, Compare comp)
Definition: intrusive_list.h:178
constexpr size_type max_size() const noexcept
Definition: intrusive_forward_list.h:196
iterator insert_after(iterator pos, Iterator first, Iterator last)
Definition: intrusive_forward_list.h:213
static Item * insert_after(Item *prev, Item &item)
Definition: intrusive_list.h:120
static void splice_after(Item *pos, GenericIntrusiveList< Item > &other, Item *first, Item *last)
Definition: intrusive_list.h:196
void clear()
Removes all items from the list.
Definition: intrusive_list.h:105
IntrusiveForwardList(IntrusiveForwardList &&)=default
reference front()
Reference to the first element in the list. Undefined behavior if empty().
Definition: intrusive_forward_list.h:167
size_type remove_if(UnaryPredicate pred)
Definition: intrusive_forward_list.h:291
iterator insert_after(iterator pos, std::initializer_list< T * > items)
Definition: intrusive_forward_list.h:219
IntrusiveForwardList & operator=(IntrusiveForwardList &&)=default
bool remove(const T &item)
Definition: intrusive_forward_list.h:287
constexpr Item * end() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:88
void push_front(T &item)
Inserts the item at the start of the list.
Definition: intrusive_forward_list.h:234
IntrusiveForwardList(std::initializer_list< Item * > items)
Constructs a list from a std::initializer_list of pointers to items.
Definition: intrusive_forward_list.h:152
IntrusiveForwardList(Iterator first, Iterator last)
Definition: intrusive_forward_list.h:147
static Item * erase_after(Item *item)
Definition: intrusive_list.h:148
void splice_after(iterator pos, IntrusiveForwardList< T > &other, iterator it)
Definition: intrusive_forward_list.h:273
The Pigweed namespace.
Definition: alignment.h:27