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"
51 forward_list.list().push_back(item);
101 using ItemBase = ::pw::containers::internal::IntrusiveForwardListItem;
104 using element_type = T;
105 using value_type = std::remove_cv_t<element_type>;
106 using size_type = std::size_t;
107 using difference_type = std::ptrdiff_t;
108 using reference = value_type&;
109 using const_reference =
const value_type&;
110 using pointer = element_type*;
111 using const_pointer =
const element_type*;
119 constexpr explicit Item() =
default;
124 template <
typename,
typename,
bool>
125 friend struct containers::internal::IntrusiveItem;
130 typename ::pw::containers::internal::ForwardIterator<T, ItemBase>;
131 using const_iterator =
132 typename ::pw::containers::internal::ForwardIterator<std::add_const_t<T>,
154 template <
typename Iterator>
156 list().assign(first, last);
163 template <
typename Iterator>
164 void assign(Iterator first, Iterator last) {
165 list().assign(first, last);
168 void assign(std::initializer_list<T*> items) {
169 list().assign(items.begin(), items.end());
175 reference
front() {
return *
static_cast<T*
>(list().begin()); }
176 const_reference
front()
const {
177 return *
static_cast<const T*
>(list().begin());
182 iterator before_begin() noexcept {
return iterator(list().before_begin()); }
183 const_iterator before_begin() const noexcept {
184 return const_iterator(list().before_begin());
186 const_iterator cbefore_begin() const noexcept {
return before_begin(); }
188 iterator begin() noexcept {
return iterator(list().begin()); }
189 const_iterator begin() const noexcept {
190 return const_iterator(list().begin());
192 const_iterator cbegin() const noexcept {
return begin(); }
194 iterator end() noexcept {
return iterator(list().end()); }
195 const_iterator end() const noexcept {
return const_iterator(list().end()); }
196 const_iterator cend() const noexcept {
return end(); }
201 [[nodiscard]]
bool empty() const noexcept {
return list().empty(); }
205 return std::numeric_limits<difference_type>::max();
220 template <
typename Iterator>
222 return iterator(list().
insert_after(pos.item_, first, last));
238 return iterator(list().
erase_after(first.item_, last.item_));
251 list().swap(other.list());
260 list().merge(other.list(),
261 [](
const ItemBase& a,
const ItemBase& b) ->
bool {
262 return static_cast<const T&>(a) < static_cast<const T&>(b);
267 template <
typename Compare>
269 list().merge(other.list(), [comp](
const ItemBase& a,
const ItemBase& b) {
270 return comp(static_cast<const T&>(a), static_cast<const T&>(b));
277 splice_after(pos, other, other.before_begin(), other.end());
292 list().splice_after(pos.item_, other.list(), first.item_, last.item_);
296 bool remove(
const T& item) {
return list().remove(item); }
299 template <
typename UnaryPredicate>
301 return list().remove_if([pred](
const ItemBase& item) ->
bool {
302 return pred(
static_cast<const T&
>(item));
313 return list().unique([](
const ItemBase& a,
const ItemBase& b) ->
bool {
314 return static_cast<const T&
>(a) ==
static_cast<const T&
>(b);
319 template <
typename BinaryPredicate>
321 return list().unique([pred](
const ItemBase& a,
const ItemBase& b) {
322 return pred(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
330 list().sort([](
const ItemBase& a,
const ItemBase& b) ->
bool {
331 return static_cast<const T&
>(a) <
static_cast<const T&
>(b);
336 template <
typename Compare>
338 list().sort([comp](
const ItemBase& a,
const ItemBase& b) {
339 return comp(
static_cast<const T&
>(a),
static_cast<const T&
>(b));
351 static constexpr void CheckItemType() {
352 using IntrusiveItemType =
353 typename containers::internal::IntrusiveItem<ItemBase, T>::Type;
355 std::is_base_of<IntrusiveItemType, T>(),
356 "IntrusiveForwardList items must be derived from "
357 "IntrusiveForwardList<T>::Item, where T is the item or one of its "
364 constexpr auto& list() {
366 return generic_list_;
369 constexpr const auto& list()
const {
371 return generic_list_;
374 containers::internal::GenericIntrusiveList<ItemBase> generic_list_;
384 using element_type = T;
385 using value_type = std::remove_cv_t<element_type>;
386 using reference = value_type&;
387 using const_reference =
const value_type&;
389 template <
typename... Args>
391 : item_(std::forward<Args>(args)...) {}
393 reference item() {
return item_; }
394 const_reference item()
const {
return item_; }
Definition: intrusive_forward_list.h:113
Definition: intrusive_forward_list.h:99
Definition: intrusive_forward_list.h:382
Definition: intrusive_forward_list.h:44
void merge(IntrusiveForwardList< T > &other, Compare comp)
Definition: intrusive_forward_list.h:268
void pop_front()
Definition: intrusive_forward_list.h:245
size_type unique(BinaryPredicate pred)
Definition: intrusive_forward_list.h:320
void merge(IntrusiveForwardList< T > &other)
Definition: intrusive_forward_list.h:259
iterator erase_after(iterator pos)
Removes the item following pos from the list. The item is not destructed.
Definition: intrusive_forward_list.h:232
void swap(IntrusiveForwardList< T > &other) noexcept
Definition: intrusive_forward_list.h:250
iterator erase_after(iterator first, iterator last)
Removes the range of items from first (inclusive) to last (exclusive).
Definition: intrusive_forward_list.h:237
size_type unique()
Definition: intrusive_forward_list.h:312
void reverse()
Definition: intrusive_forward_list.h:307
void splice_after(iterator pos, IntrusiveForwardList< T > &other, iterator first, iterator last)
Definition: intrusive_forward_list.h:288
void clear()
Definition: intrusive_forward_list.h:211
bool empty() const noexcept
Definition: intrusive_forward_list.h:201
iterator insert_after(iterator pos, T &item)
Inserts the given item after the given position, pos.
Definition: intrusive_forward_list.h:214
void PushBackSlow(IntrusiveForwardList< T > &forward_list, T &item)
Inserts an element at the end of the forward list. Runs in O(n) time.
Definition: intrusive_forward_list.h:50
void sort()
Definition: intrusive_forward_list.h:329
void sort(Compare comp)
Definition: intrusive_forward_list.h:337
void splice_after(iterator pos, IntrusiveForwardList< T > &other)
Definition: intrusive_forward_list.h:276
constexpr size_type max_size() const noexcept
Definition: intrusive_forward_list.h:204
iterator insert_after(iterator pos, Iterator first, Iterator last)
Definition: intrusive_forward_list.h:221
IntrusiveForwardList(IntrusiveForwardList &&)=default
reference front()
Reference to the first element in the list. Undefined behavior if empty().
Definition: intrusive_forward_list.h:175
size_type remove_if(UnaryPredicate pred)
Definition: intrusive_forward_list.h:300
iterator insert_after(iterator pos, std::initializer_list< T * > items)
Definition: intrusive_forward_list.h:227
IntrusiveForwardList & operator=(IntrusiveForwardList &&)=default
bool remove(const T &item)
Definition: intrusive_forward_list.h:296
void push_front(T &item)
Definition: intrusive_forward_list.h:242
IntrusiveForwardList(std::initializer_list< Item * > items)
Constructs a list from a std::initializer_list of pointers to items.
Definition: intrusive_forward_list.h:160
IntrusiveForwardList(Iterator first, Iterator last)
Definition: intrusive_forward_list.h:155
void splice_after(iterator pos, IntrusiveForwardList< T > &other, iterator it)
Definition: intrusive_forward_list.h:282
The Pigweed namespace.
Definition: alignment.h:27