17template<
typename Self>
22template<
typename T,
typename Tag,
typename Self>
31 constexpr auto down_cast_self() ->
decltype(
auto) {
35 return static_cast<Self&
>(*this);
39 struct Iterator : IteratorBase<Iterator, BidirectionalIteratorTag, T, isize> {
41 friend class IntrusiveList;
46 constexpr Iterator(Node* node) : m_node(node) {}
47 constexpr Iterator(Node& node) : m_node(util::addressof(node)) {}
49 constexpr auto operator*() const -> T& {
50 return Tag::down_cast(
in_place_type<T>,
static_cast<ConcreteNode&
>(*m_node));
52 constexpr auto operator->() const -> T* {
return util::addressof(**
this); }
54 constexpr void advance_one() { m_node = m_node->next; }
55 constexpr void back_one() { m_node = m_node->prev; }
58 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool {
return a.m_node == b.m_node; }
60 constexpr auto node() const -> Node* {
return m_node; }
62 Node* m_node {
nullptr };
65 using ConstIterator = container::ConstIteratorImpl<Iterator>;
79 m_head.value().next = other.m_head.value().next;
80 m_head.value().prev = other.m_head.value().prev;
83 m_head.value().next->prev = util::addressof(m_head.value());
84 m_head.value().prev->next = util::addressof(m_head.value());
86 if constexpr (is_sized) {
87 m_size.value = other.size();
97 constexpr auto empty() const ->
bool {
return head() == util::addressof(m_head.value()); }
105 constexpr auto begin() -> Iterator {
return Iterator(head()); }
106 constexpr auto end() -> Iterator {
return Iterator(util::addressof(m_head.value())); }
108 constexpr auto begin() const -> Iterator {
return Iterator(head()); }
109 constexpr auto end() const -> Iterator {
return Iterator(
const_cast<Node*
>(util::addressof(m_head.value()))); }
154 constexpr auto insert(ConstIterator position, Node& node_ref) -> Iterator {
155 auto* node = util::addressof(node_ref);
156 auto*
next = position.base().node();
165 if constexpr (is_sized) {
169 Tag::did_insert(down_cast_self(),
static_cast<ConcreteNode&
>(node_ref));
171 return Iterator(node);
175 constexpr auto erase(ConstIterator first, ConstIterator last) -> Iterator {
180 auto*
prev = first.base().node()->prev;
181 auto*
end = last.base().node();
185 for (
auto it = first; it != last;) {
187 Tag::did_remove(down_cast_self(),
static_cast<ConcreteNode&
>(*save.base().node()));
189 if constexpr (is_sized) {
199 splice(position, other, other.begin(), other.end());
203 splice(position, util::move(other), it);
209 constexpr void splice(ConstIterator position,
IntrusiveList& other, ConstIterator first, ConstIterator last) {
210 splice(position, util::move(other), first, last);
212 constexpr void splice(ConstIterator position,
IntrusiveList&& other, ConstIterator first, ConstIterator last) {
213 auto* first_node = first.base().node();
214 auto* last_node = last.base().node();
215 if (first_node == last_node) {
220 auto* inclusive_last_node = last_node->prev;
222 auto* prev_node = first_node->prev;
223 prev_node->next = last_node;
224 last_node->prev = prev_node;
229 auto* position_node = position.
base().node();
230 auto* prev_node = position_node->prev;
232 prev_node->next = first_node;
233 first_node->prev = prev_node;
235 position_node->prev = inclusive_last_node;
236 inclusive_last_node->next = position_node;
240 if constexpr (is_sized) {
241 if (
this != &other) {
243 this->m_size.value +=
size;
244 other.m_size.value -=
size;
265 auto it = self.begin();
267 while (it != self.end()) {
278 constexpr auto head() const -> Node* {
return m_head.value().next; }
279 constexpr void set_head(Node* head) { m_head.value().next = head; }
281 constexpr void reset_head() {
282 m_head.value().next = m_head.value().prev = util::addressof(m_head.value());
283 if constexpr (is_sized) {
288 util::MovableBox<Node> m_head;
289 [[no_unique_address]] util::StoreIf<usize, is_sized> m_size { 0 };
constexpr auto base() const &-> Iter const &
Definition const_iterator_impl.h:37
Definition list_forward_declaration.h:12
constexpr auto end() const -> Iterator
Definition list.h:109
constexpr auto erase(ConstIterator first, ConstIterator last) -> Iterator
Definition list.h:175
constexpr auto back()
Definition list.h:122
constexpr auto front()
Definition list.h:111
constexpr auto end() -> Iterator
Definition list.h:106
constexpr auto begin() const -> Iterator
Definition list.h:108
constexpr auto front() const
Definition list.h:116
constexpr auto pop_front()
Definition list.h:136
constexpr auto insert(ConstIterator position, Node &node_ref) -> Iterator
Definition list.h:154
constexpr void push_front(Node &node)
Definition list.h:134
constexpr friend auto operator==(IntrusiveList const &a, IntrusiveList const &b) -> bool requires(concepts::EqualityComparable< T >)
Definition list.h:250
constexpr auto operator=(IntrusiveList &&other) -> IntrusiveList &
Definition list.h:76
constexpr auto max_size() const -> usize
Definition list.h:103
constexpr auto erase(ConstIterator position) -> Iterator
Definition list.h:174
constexpr auto empty() const -> bool
Definition list.h:97
constexpr auto size() const -> usize requires(is_sized)
Definition list.h:98
constexpr auto begin() -> Iterator
Definition list.h:105
constexpr void splice(ConstIterator position, IntrusiveList &&other, ConstIterator first, ConstIterator last)
Definition list.h:212
constexpr void splice(ConstIterator position, IntrusiveList &other)
Definition list.h:197
constexpr void splice(ConstIterator position, IntrusiveList &other, ConstIterator first, ConstIterator last)
Definition list.h:209
constexpr void clear()
Definition list.h:152
IntrusiveList(IntrusiveList const &)=delete
constexpr auto pop_back()
Definition list.h:144
constexpr IntrusiveList()
Definition list.h:68
constexpr void splice(ConstIterator position, IntrusiveList &other, ConstIterator it)
Definition list.h:202
auto operator=(IntrusiveList const &) -> IntrusiveList &=delete
constexpr void splice(ConstIterator position, IntrusiveList &&other, ConstIterator it)
Definition list.h:205
constexpr void push_back(Node &node)
Definition list.h:133
constexpr friend auto operator<=>(IntrusiveList const &a, IntrusiveList const &b)
Definition list.h:256
constexpr auto back() const
Definition list.h:127
constexpr void splice(ConstIterator position, IntrusiveList &&other)
Definition list.h:198
constexpr IntrusiveList(IntrusiveList &&other)
Definition list.h:72
constexpr friend auto tag_invoke(di::Tag< erase_if >, ConcreteSelf &self, F &&function) -> usize
Definition list.h:264
constexpr ~IntrusiveList()
Definition list.h:95
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
constexpr auto distance
Definition distance.h:44
constexpr auto equal
Definition equal.h:46
constexpr auto erase
Definition erase.h:76
constexpr auto compare
Definition compare.h:40
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto ref
Definition reference_wrapper.h:98
constexpr auto cref
Definition reference_wrapper.h:99
Definition zstring_parser.h:9
constexpr auto in_place_type
Definition in_place_type.h:12
constexpr auto lift_bool
Definition lift_bool.h:13
Definition intrusive_tag_base.h:8
Definition numeric_limits.h:7
T value
Definition store_if.h:8