25#include <kiwano/macros.h>
32template <
typename _PtrTy>
36 using value_type =
typename std::pointer_traits<_PtrTy>::pointer;
37 using pointer = value_type*;
38 using reference = value_type&;
83 return first_ ==
nullptr;
91 child->GetPrev()->GetNext() = child->GetNext();
93 child->GetNext()->GetPrev() = child->GetPrev();
95 child->GetPrev() = last_;
96 child->GetNext() =
nullptr;
100 last_->GetNext() = child;
114 if (child->GetPrev())
115 child->GetPrev()->GetNext() = child->GetNext();
116 if (child->GetNext())
117 child->GetNext()->GetPrev() = child->GetPrev();
119 child->GetPrev() =
nullptr;
120 child->GetNext() = first_;
124 first_->GetPrev() = child;
138 if (child->GetPrev())
139 child->GetPrev()->GetNext() = child->GetNext();
140 if (child->GetNext())
141 child->GetNext()->GetPrev() = child->GetPrev();
143 if (before->GetPrev())
144 before->GetPrev()->GetNext() = child;
148 child->GetPrev() = before->GetPrev();
149 child->GetNext() = before;
150 before->GetPrev() = child;
157 if (child->GetPrev())
158 child->GetPrev()->GetNext() = child->GetNext();
159 if (child->GetNext())
160 child->GetNext()->GetPrev() = child->GetPrev();
162 if (after->GetNext())
163 after->GetNext()->GetPrev() = child;
167 child->GetNext() = after->GetNext();
168 child->GetPrev() = after;
169 after->GetNext() = child;
176 if (child->GetNext())
178 child->GetNext()->GetPrev() = child->GetPrev();
182 last_ = child->GetPrev();
185 if (child->GetPrev())
187 child->GetPrev()->GetNext() = child->GetNext();
191 first_ = child->GetNext();
194 child->GetPrev() =
nullptr;
195 child->GetNext() =
nullptr;
202 value_type p = first_;
209 tmp->GetNext() =
nullptr;
210 tmp->GetPrev() =
nullptr;
226 value_type p = first_;
236 if (p->GetPrev() != tmp)
249 template <
typename _IterPtrTy>
252 using iterator_category = std::bidirectional_iterator_tag;
253 using value_type = _IterPtrTy;
254 using pointer = _IterPtrTy*;
255 using reference = _IterPtrTy&;
256 using difference_type = ptrdiff_t;
258 inline Iterator(value_type ptr =
nullptr,
bool is_end =
false)
264 inline reference operator*()
const
266 KGE_ASSERT(base_ && !is_end_);
267 return const_cast<reference
>(base_);
270 inline pointer operator->()
const
272 return std::pointer_traits<pointer>::pointer_to(**
this);
277 KGE_ASSERT(base_ && !is_end_);
278 value_type next = base_->GetNext();
299 base_ = base_->GetPrev();
310 inline bool operator==(
const Iterator& other)
const
312 return base_ == other.base_ && is_end_ == other.is_end_;
315 inline bool operator!=(
const Iterator& other)
const
317 return !(*
this == other);
320 inline operator bool()
const
322 return base_ !=
nullptr && !is_end_;
328 typename std::remove_const<value_type>::type base_;
334 using reverse_iterator = std::reverse_iterator<iterator>;
335 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
339 return iterator(first_, first_ ==
nullptr);
342 inline const_iterator begin()
const
344 return const_iterator(first_, first_ ==
nullptr);
347 inline const_iterator cbegin()
const
352 inline iterator end()
354 return iterator(last_,
true);
357 inline const_iterator end()
const
359 return const_iterator(last_,
true);
362 inline const_iterator cend()
const
367 inline reverse_iterator rbegin()
369 return reverse_iterator(end());
372 inline const_reverse_iterator rbegin()
const
374 return const_reverse_iterator(end());
377 inline const_reverse_iterator crbegin()
const
382 inline reverse_iterator rend()
384 return reverse_iterator(begin());
387 inline const_reverse_iterator rend()
const
389 return const_reverse_iterator(begin());
392 inline const_reverse_iterator crend()
const
397 inline value_type& front()
400 throw std::out_of_range(
"front() called on empty list");
404 inline const value_type& front()
const
407 throw std::out_of_range(
"front() called on empty list");
411 inline value_type& back()
414 throw std::out_of_range(
"back() called on empty list");
418 inline const value_type& back()
const
421 throw std::out_of_range(
"back() called on empty list");
432template <
typename _PtrTy>
436 using value_type =
typename std::pointer_traits<_PtrTy>::pointer;
437 using reference = value_type&;
438 using pointer = value_type*;
452 prev_ = rhs->GetPrev();
453 next_ = rhs->GetNext();
侵入式链表元素
Definition: IntrusiveList.hpp:434
const value_type & GetPrev() const
获取前一元素
Definition: IntrusiveList.hpp:459
value_type & GetNext()
获取下一元素
Definition: IntrusiveList.hpp:480
const value_type & GetNext() const
获取下一元素
Definition: IntrusiveList.hpp:473
value_type & GetPrev()
获取前一元素
Definition: IntrusiveList.hpp:466
侵入式链表
Definition: IntrusiveList.hpp:34
value_type & GetFirst()
获取首元素
Definition: IntrusiveList.hpp:60
void InsertBefore(reference child, reference before)
在链表的对象前插入新对象
Definition: IntrusiveList.hpp:136
void Clear()
清空所有对象
Definition: IntrusiveList.hpp:200
const value_type & GetFirst() const
获取首元素
Definition: IntrusiveList.hpp:53
value_type & GetLast()
获取尾元素
Definition: IntrusiveList.hpp:74
void PushBack(reference child)
在链表尾部添加对象
Definition: IntrusiveList.hpp:88
void InsertAfter(reference child, reference after)
在链表的对象后插入新对象
Definition: IntrusiveList.hpp:155
void Remove(reference child)
移除对象
Definition: IntrusiveList.hpp:174
bool IsEmpty() const
链表是否为空
Definition: IntrusiveList.hpp:81
void PushFront(reference child)
在链表头部添加对象
Definition: IntrusiveList.hpp:112
bool CheckValid()
检查链表是否有效
Definition: IntrusiveList.hpp:219
const value_type & GetLast() const
获取尾元素
Definition: IntrusiveList.hpp:67
Definition: IntrusiveList.hpp:251