20#include "pw_containers/internal/intrusive_item.h"
21#include "pw_containers/internal/intrusive_list_item.h"
23namespace pw::containers::internal {
37template <
typename Item>
40 static_assert(std::is_same_v<Item, IntrusiveForwardListItem> ||
41 std::is_same_v<Item, IntrusiveListItem>);
45 template <
typename Iterator>
56 head_.replace(other.head_);
62 head_.replace(other.head_);
68 template <
typename Iterator>
69 void assign(Iterator first, Iterator last) {
78 constexpr const Item*
before_begin() const noexcept {
return &head_; }
81 constexpr Item*
begin() noexcept {
return head_.next_; }
82 constexpr const Item*
begin() const noexcept {
return head_.next_; }
88 constexpr Item*
end() noexcept {
return &head_; }
89 constexpr const Item*
end() const noexcept {
return &head_; }
93 bool empty() const noexcept {
return begin() ==
end(); }
99 return std::numeric_limits<ptrdiff_t>::max();
121 CheckIntrusiveItemIsUncontained(item.unlisted());
122 item.next_ = prev->next_;
123 item.set_previous(prev);
125 item.next_->set_previous(&item);
134 template <
typename Iterator>
136 for (Iterator it = first; it != last; ++it) {
149 item->next_->unlist(item);
155 while (first->next_ != last) {
166 head_.replace(other.head_);
167 other.head_.replace(tmp);
177 template <
typename Compare>
180 Item* item =
begin();
181 Item* other_item = other.
begin();
182 while (!other.empty()) {
183 if (item ==
end() || !comp(*item, *other_item)) {
184 Item* tmp = other_item;
201 if (first == last && first != &other.head_) {
204 Item* first_next = first->next_;
205 if (first_next == last) {
208 Item* last_prev = last->previous();
209 Item* pos_next = pos->next_;
212 last->set_previous(first);
214 pos->next_ = first_next;
215 first_next->set_previous(pos);
217 pos_next->set_previous(last_prev);
218 last_prev->next_ = pos_next;
224 bool remove(
const Item& item_to_remove) {
226 [&item_to_remove](
const Item& item) ->
bool {
227 return &item_to_remove == &item;
238 template <
typename UnaryPredicate>
240 size_t max = std::numeric_limits<size_t>::max()) {
244 Item* item = prev->next_;
251 if (removed == max) {
265 Item* item =
begin();
277 template <
typename BinaryPredicate>
283 Item* prev =
begin();
285 Item* item = prev->next_;
289 if (pred(*prev, *item)) {
304 template <
typename Compare>
308 for (Item* item =
begin(); item !=
end(); item = item->next_) {
333 template <
typename Iterator>
334 static Item* FromIterator(Iterator& it) {
335 if constexpr (std::is_pointer<std::remove_reference_t<
decltype(*it)>>()) {
Definition: intrusive_list.h:38
static Item * erase_after(Item *first, Item *last)
Removes the range of items exclusively between first and last.
Definition: intrusive_list.h:154
size_t unique(BinaryPredicate pred)
Definition: intrusive_list.h:278
Item * before_end() noexcept
Returns a pointer to the last item.
Definition: intrusive_list.h:85
void sort(Compare comp)
Definition: intrusive_list.h:305
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:239
static Item * insert_after(Item *prev, Iterator first, Iterator last)
Definition: intrusive_list.h:135
void reverse()
Reverses the order of items in the list.
Definition: intrusive_list.h:262
constexpr Item * before_begin() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:77
constexpr Item * begin() noexcept
Returns a pointer to the first item.
Definition: intrusive_list.h:81
void merge(GenericIntrusiveList< Item > &other, Compare comp)
Definition: intrusive_list.h:178
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
constexpr Item * end() noexcept
Returns a pointer to the sentinel item.
Definition: intrusive_list.h:88
static Item * erase_after(Item *item)
Definition: intrusive_list.h:148