16template<
typename Self>
21template<
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, ForwardIteratorTag, T, ssize_t> {
41 friend class IntrusiveForwardList;
46 constexpr explicit Iterator(Node* node) : m_node(node) {}
47 constexpr explicit 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; }
56 constexpr auto node() const -> Node* {
return m_node; }
59 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool {
return a.m_node == b.m_node; }
61 Node* m_node {
nullptr };
64 using ConstIterator = container::ConstIteratorImpl<Iterator>;
76 m_head.value().next =
util::exchange(other.m_head.value().next,
nullptr);
78 if constexpr (is_sized) {
82 if constexpr (store_tail) {
84 m_tail.value = other.m_tail.value;
93 constexpr auto empty() const ->
bool {
return !head(); }
101 constexpr auto before_begin() -> Iterator {
return Iterator(util::addressof(m_head.value())); }
103 return Iterator(
const_cast<Node*
>(util::addressof(m_head.value())));
106 constexpr auto begin() {
return Iterator(head()); }
107 constexpr auto end() -> Iterator {
return Iterator(); }
109 constexpr auto begin()
const {
return Iterator(head()); }
110 constexpr auto end() const -> ConstIterator {
return Iterator(); }
115 return Iterator(m_tail.value);
120 return Iterator(m_tail.value);
169 constexpr auto insert_after(ConstIterator position, Node& node_ref) -> Iterator {
170 auto* node = util::addressof(node_ref);
171 auto*
prev = position.base().node();
174 if constexpr (store_tail) {
175 if (
prev == m_tail.value) {
180 node->next =
prev->next;
183 if constexpr (is_sized) {
187 Tag::did_insert(down_cast_self(),
static_cast<ConcreteNode&
>(node_ref));
189 return Iterator(node);
193 if (!position.base().node()) {
197 if (!
next.base().node()) {
202 constexpr auto erase_after(ConstIterator first, ConstIterator last) -> Iterator {
207 auto*
prev = first.base().node();
208 auto*
end = last.base().node();
209 if constexpr (store_tail) {
216 for (
auto it = ++first; it != last;) {
218 Tag::did_remove(down_cast_self(),
static_cast<ConcreteNode&
>(*save.base().node()));
220 if constexpr (is_sized) {
231 auto it = self.before_begin();
235 while (jt != self.end()) {
237 jt = self.erase_after(it);
247 constexpr auto head() const -> Node* {
return m_head.value().next; }
248 constexpr void set_head(Node* head) { m_head.value().next = head; }
250 constexpr void reset_tail() {
251 if constexpr (store_tail) {
252 m_tail.value = util::addressof(m_head.value());
256 util::MovableBox<Node> m_head;
257 [[no_unique_address]] util::StoreIf<Node*, store_tail> m_tail {
nullptr };
258 [[no_unique_address]] util::StoreIf<usize, is_sized> m_size { 0 };
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition forward_list_node.h:9
Definition forward_list_forward_declaration.h:12
constexpr ~IntrusiveForwardList()
Definition forward_list.h:91
auto operator=(IntrusiveForwardList const &) -> IntrusiveForwardList &=delete
constexpr auto max_size() const -> usize
Definition forward_list.h:99
constexpr void clear()
Definition forward_list.h:167
constexpr auto front() const
Definition forward_list.h:128
constexpr auto back()
Definition forward_list.h:134
constexpr auto before_end() const -> ConstIterator requires(store_tail)
Definition forward_list.h:117
constexpr auto end() const -> ConstIterator
Definition forward_list.h:110
constexpr auto insert_after(ConstIterator position, Node &node_ref) -> Iterator
Definition forward_list.h:169
constexpr void push_back(Node &node)
Definition forward_list.h:150
constexpr auto before_begin() const -> ConstIterator
Definition forward_list.h:102
constexpr auto size() const -> usize requires(is_sized)
Definition forward_list.h:94
constexpr auto operator=(IntrusiveForwardList &&other) -> IntrusiveForwardList &
Definition forward_list.h:75
constexpr auto pop_front() -> Optional< T & >
Definition forward_list.h:156
IntrusiveForwardList(IntrusiveForwardList const &)=delete
constexpr auto end() -> Iterator
Definition forward_list.h:107
constexpr auto back() const
Definition forward_list.h:141
constexpr auto erase_after(ConstIterator first, ConstIterator last) -> Iterator
Definition forward_list.h:202
constexpr auto erase_after(ConstIterator position) -> Iterator
Definition forward_list.h:192
constexpr IntrusiveForwardList()
Definition forward_list.h:67
constexpr void push_front(Node &node)
Definition forward_list.h:149
constexpr auto before_end() -> Iterator requires(store_tail)
Definition forward_list.h:112
constexpr auto front()
Definition forward_list.h:123
constexpr auto begin() const
Definition forward_list.h:109
constexpr auto before_begin() -> Iterator
Definition forward_list.h:101
constexpr friend auto tag_invoke(di::Tag< erase_if >, ConcreteSelf &self, F &&function) -> usize
Definition forward_list.h:230
constexpr auto empty() const -> bool
Definition forward_list.h:93
constexpr auto begin()
Definition forward_list.h:106
constexpr IntrusiveForwardList(IntrusiveForwardList &&other)
Definition forward_list.h:71
Definition optional_forward_declaration.h:5
constexpr auto prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
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
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
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 forward_list.h:19
Definition forward_list.h:17
Definition intrusive_tag_base.h:8
Definition numeric_limits.h:7