14struct SingleLinkEntry {
15 SingleLinkEntry *next =
nullptr;
18struct DoubleLinkEntry {
19 DoubleLinkEntry *next =
nullptr;
20 DoubleLinkEntry *prev =
nullptr;
22 void *owner =
nullptr;
26template <
typename T, SingleLinkEntry T::*Member>
class IntrusiveSingleList {
28 IntrusiveSingleList() =
default;
29 IntrusiveSingleList(IntrusiveSingleList &&other) noexcept
30 : head_(std::exchange(other.head_,
nullptr)),
31 tail_(std::exchange(other.tail_,
nullptr)) {}
32 IntrusiveSingleList &operator=(IntrusiveSingleList &&other)
noexcept {
34 head_ = std::exchange(other.head_,
nullptr);
35 tail_ = std::exchange(other.tail_,
nullptr);
40 IntrusiveSingleList(
const IntrusiveSingleList &) =
delete;
41 IntrusiveSingleList &operator=(
const IntrusiveSingleList &) =
delete;
43 void push_back(T *item)
noexcept {
44 assert(item !=
nullptr);
45 SingleLinkEntry *entry = &(item->*Member);
46 assert(entry->next ==
nullptr);
47 entry->next =
nullptr;
57 void push_back(IntrusiveSingleList other)
noexcept {
65 tail_->next = other.head_;
70 bool empty() const noexcept {
return head_ ==
nullptr; }
72 T *pop_front() noexcept {
76 SingleLinkEntry *entry = head_;
81 entry->next =
nullptr;
82 return container_of(Member, entry);
86 SingleLinkEntry *head_ =
nullptr;
87 SingleLinkEntry *tail_ =
nullptr;
90template <
typename T, DoubleLinkEntry T::*Member>
class IntrusiveDoubleList {
92 IntrusiveDoubleList() =
default;
94 void push_back(T *item)
noexcept {
95 assert(item !=
nullptr);
96 DoubleLinkEntry *entry = &(item->*Member);
97 assert(entry->next ==
nullptr && entry->prev ==
nullptr);
98 entry->next =
nullptr;
108 assert(entry->owner ==
nullptr);
113 bool empty() const noexcept {
return head_ ==
nullptr; }
115 T *pop_front() noexcept {
119 DoubleLinkEntry *entry = head_;
122 head_->prev =
nullptr;
126 entry->next =
nullptr;
127 entry->prev =
nullptr;
129 assert(entry->owner ==
this);
130 entry->owner =
nullptr;
132 return container_of(Member, entry);
135 bool remove(T *item)
noexcept {
136 assert(item !=
nullptr);
137 DoubleLinkEntry *entry = &(item->*Member);
139 assert(entry->owner ==
this);
140 entry->owner =
nullptr;
142 if (entry->prev ==
nullptr && entry->next ==
nullptr &&
147 entry->prev->next = entry->next;
149 assert(head_ == entry);
153 entry->next->prev = entry->prev;
155 assert(tail_ == entry);
158 entry->next =
nullptr;
159 entry->prev =
nullptr;
164 DoubleLinkEntry *head_ =
nullptr;
165 DoubleLinkEntry *tail_ =
nullptr;
The main namespace for the Condy library.
Definition condy.hpp:28
Internal utility classes and functions used by Condy.