20#include "pw_containers/internal/intrusive_item.h"
21#include "pw_containers/internal/intrusive_list_item.h"
23namespace pw::containers::internal {
32template <
typename Item>
35 static_assert(std::is_same_v<Item, IntrusiveForwardListItem> ||
36 std::is_same_v<Item, IntrusiveListItem>);
40 template <
typename Iterator>
51 head_.replace(other.head_);
57 head_.replace(other.head_);
63 template <
typename Iterator>
64 void assign(Iterator first, Iterator last) {
73 constexpr const Item*
before_begin() const noexcept {
return &head_; }
76 constexpr Item*
begin() noexcept {
return head_.next_; }
77 constexpr const Item*
begin() const noexcept {
return head_.next_; }
83 constexpr Item*
end() noexcept {
return &head_; }
84 constexpr const Item*
end() const noexcept {
return &head_; }
88 bool empty() const noexcept {
return begin() ==
end(); }
94 return std::numeric_limits<ptrdiff_t>::max();
116 CheckIntrusiveItemIsUncontained(item.unlisted());
117 item.next_ = prev->next_;
118 item.set_previous(prev);
120 item.next_->set_previous(&item);
129 template <
typename Iterator>
131 for (Iterator it = first; it != last; ++it) {
144 item->next_->unlist(item);
150 while (first->next_ != last) {
161 head_.replace(other.head_);
162 other.head_.replace(tmp);
172 template <
typename Compare>
175 Item* item =
begin();
176 Item* other_item = other.
begin();
177 while (!other.empty()) {
178 if (item ==
end() || !comp(*item, *other_item)) {
179 Item* tmp = other_item;
196 if (first == last && first != &other.head_) {
199 Item* first_next = first->next_;
200 if (first_next == last) {
203 Item* last_prev = last->previous();
204 Item* pos_next = pos->next_;
207 last->set_previous(first);
209 pos->next_ = first_next;
210 first_next->set_previous(pos);
212 pos_next->set_previous(last_prev);
213 last_prev->next_ = pos_next;
219 bool remove(
const Item& item_to_remove) {
221 [&item_to_remove](
const Item& item) ->
bool {
222 return &item_to_remove == &item;
233 template <
typename UnaryPredicate>
235 size_t max = std::numeric_limits<size_t>::max()) {
239 Item* item = prev->next_;
246 if (removed == max) {
260 Item* item =
begin();
272 template <
typename BinaryPredicate>
278 Item* prev =
begin();
280 Item* item = prev->next_;
284 if (pred(*prev, *item)) {
299 template <
typename Compare>
303 for (Item* item =
begin(); item !=
end(); item = item->next_) {
328 template <
typename Iterator>
329 static Item* FromIterator(Iterator& it) {
330 if constexpr (std::is_pointer<std::remove_reference_t<
decltype(*it)>>()) {
Definition: intrusive_list.h:33
static Item * erase_after(Item *first, Item *last)
Removes the range of items exclusively between first and last.
Definition: intrusive_list.h:149
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
static Item * insert_after(Item *prev, Iterator first, Iterator last)
Definition: intrusive_list.h:130
void reverse()
Reverses the order of items in the list.
Definition: intrusive_list.h:257
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