37 T* T::*NextPtr = &T::next,
38 T* T::*PrevPtr = &T::prev>
58 constexpr Iterator() noexcept : current_(
nullptr), tail_(
nullptr) {}
59 constexpr Iterator(T* node, T* tail) noexcept : current_(node), tail_(tail) {}
70 current_ = current_->*NextPtr;
82 if (current_ ==
nullptr) {
85 current_ = current_->*PrevPtr;
97 return current_ == other.current_;
101 return !(*
this == other);
122 constexpr ConstIterator(
const T* node,
const T* tail) noexcept : current_(node), tail_(tail) {}
134 current_ = current_->*NextPtr;
146 if (current_ ==
nullptr) {
149 current_ = current_->*PrevPtr;
161 return current_ == other.current_;
165 return !(*
this == other);
196 current_ = current_->*PrevPtr;
208 if (current_ ==
nullptr) {
211 current_ = current_->*NextPtr;
223 return current_ == other.current_;
227 return !(*
this == other);
260 current_ = current_->*PrevPtr;
272 if (current_ ==
nullptr) {
275 current_ = current_->*NextPtr;
287 return current_ == other.current_;
291 return !(*
this == other);
305 constexpr IntrusiveList() noexcept : head_(
nullptr), tail_(
nullptr), size_(0) {}
316 : head_(other.head_), tail_(other.tail_), size_(other.size_) {
317 other.head_ =
nullptr;
318 other.tail_ =
nullptr;
323 if (
this != &other) {
327 other.head_ =
nullptr;
328 other.tail_ =
nullptr;
335 [[nodiscard]]
constexpr bool empty() const noexcept {
364 node->*PrevPtr =
nullptr;
365 node->*NextPtr = head_;
367 if (head_ !=
nullptr) {
368 head_->*PrevPtr = node;
379 node->*NextPtr =
nullptr;
380 node->*PrevPtr = tail_;
382 if (tail_ !=
nullptr) {
383 tail_->*NextPtr = node;
399 head_ = head_->*NextPtr;
401 if (head_ !=
nullptr) {
402 head_->*PrevPtr =
nullptr;
407 node->*NextPtr =
nullptr;
408 node->*PrevPtr =
nullptr;
421 tail_ = tail_->*PrevPtr;
423 if (tail_ !=
nullptr) {
424 tail_->*NextPtr =
nullptr;
429 node->*NextPtr =
nullptr;
430 node->*PrevPtr =
nullptr;
438 constexpr void erase(T* node)
noexcept {
439 if (node ==
nullptr) {
443 T* prev = node->*PrevPtr;
444 T* next = node->*NextPtr;
446 if (prev !=
nullptr) {
447 prev->*NextPtr = next;
452 if (next !=
nullptr) {
453 next->*PrevPtr = prev;
458 node->*NextPtr =
nullptr;
459 node->*PrevPtr =
nullptr;
466 if (pos ==
nullptr) {
476 T* prev = pos->*PrevPtr;
478 node->*PrevPtr = prev;
479 node->*NextPtr = pos;
481 if (prev !=
nullptr) {
482 prev->*NextPtr = node;
485 pos->*PrevPtr = node;
492 if (pos ==
nullptr) {
502 T* next = pos->*NextPtr;
504 node->*PrevPtr = pos;
505 node->*NextPtr = next;
507 if (next !=
nullptr) {
508 next->*PrevPtr = node;
511 pos->*NextPtr = node;
519 while (current !=
nullptr) {
520 T* next = current->*NextPtr;
521 current->*NextPtr =
nullptr;
522 current->*PrevPtr =
nullptr;
constexpr ConstIterator(Iterator it) noexcept
constexpr bool operator!=(const ConstIterator &other) const noexcept
constexpr ConstIterator & operator++() noexcept
constexpr bool operator==(const ConstIterator &other) const noexcept
constexpr pointer operator->() const noexcept
constexpr ConstIterator() noexcept
constexpr ConstIterator operator++(int) noexcept
std::ptrdiff_t difference_type
constexpr ConstIterator operator--(int) noexcept
constexpr reference operator*() const noexcept
std::bidirectional_iterator_tag iterator_category
constexpr ConstIterator(const T *node, const T *tail) noexcept
constexpr ConstIterator & operator--() noexcept
constexpr ConstReverseIterator & operator++() noexcept
constexpr ConstReverseIterator & operator--() noexcept
constexpr ConstReverseIterator() noexcept
constexpr ConstReverseIterator(ReverseIterator it) noexcept
constexpr ConstReverseIterator operator++(int) noexcept
constexpr ConstReverseIterator operator--(int) noexcept
constexpr pointer operator->() const noexcept
constexpr bool operator!=(const ConstReverseIterator &other) const noexcept
std::bidirectional_iterator_tag iterator_category
constexpr reference operator*() const noexcept
constexpr bool operator==(const ConstReverseIterator &other) const noexcept
std::ptrdiff_t difference_type
constexpr ConstReverseIterator(const T *node, const T *head) noexcept
Forward iterator for intrusive list We store a pointer to the list's tail to handle decrement from en...
constexpr bool operator!=(const Iterator &other) const noexcept
std::bidirectional_iterator_tag iterator_category
constexpr Iterator operator++(int) noexcept
constexpr Iterator operator--(int) noexcept
std::ptrdiff_t difference_type
constexpr Iterator & operator++() noexcept
constexpr pointer operator->() const noexcept
constexpr Iterator(T *node, T *tail) noexcept
constexpr bool operator==(const Iterator &other) const noexcept
constexpr Iterator() noexcept
constexpr Iterator & operator--() noexcept
constexpr reference operator*() const noexcept
Reverse iterator for intrusive list Cannot use std::reverse_iterator because end() (nullptr) cannot b...
constexpr ReverseIterator operator--(int) noexcept
constexpr ReverseIterator operator++(int) noexcept
constexpr bool operator!=(const ReverseIterator &other) const noexcept
constexpr reference operator*() const noexcept
constexpr ReverseIterator(T *node, T *head) noexcept
constexpr pointer operator->() const noexcept
constexpr ReverseIterator & operator++() noexcept
constexpr ReverseIterator() noexcept
constexpr bool operator==(const ReverseIterator &other) const noexcept
std::ptrdiff_t difference_type
constexpr ReverseIterator & operator--() noexcept
std::bidirectional_iterator_tag iterator_category
Intrusive doubly-linked list for zero-allocation order management.
constexpr const_reverse_iterator rend() const noexcept
constexpr const_reverse_iterator crend() const noexcept
constexpr void insert_after(T *pos, T *node) noexcept
Insert element after given position O(1) operation.
constexpr pointer front() noexcept
Get front element.
constexpr void clear() noexcept
Clear list (does not delete elements)
constexpr pointer pop_back() noexcept
Remove back element.
constexpr IntrusiveList & operator=(IntrusiveList &&other) noexcept
constexpr const_pointer front() const noexcept
constexpr void push_front(T *node) noexcept
Add element to front (newest order, used for LIFO if needed)
constexpr iterator end() noexcept
constexpr void erase(T *node) noexcept
Remove specific element from list O(1) operation - no search required.
~IntrusiveList() noexcept=default
Destructor - does not delete elements (intrusive design)
constexpr const_iterator cbegin() const noexcept
const T & const_reference
constexpr const_iterator end() const noexcept
constexpr reverse_iterator rbegin() noexcept
Reverse iterators.
constexpr const_reverse_iterator rbegin() const noexcept
constexpr const_iterator begin() const noexcept
constexpr size_type size() const noexcept
Get number of elements.
constexpr const_reverse_iterator crbegin() const noexcept
constexpr pointer pop_front() noexcept
Remove front element.
constexpr bool empty() const noexcept
Check if list is empty.
constexpr iterator begin() noexcept
Iterators.
constexpr reverse_iterator rend() noexcept
constexpr void push_back(T *node) noexcept
Add element to back (oldest order, FIFO time priority)
constexpr void insert_before(T *pos, T *node) noexcept
Insert element before given position O(1) operation.
constexpr const_iterator cend() const noexcept
constexpr pointer back() noexcept
Get back element.
constexpr const_pointer back() const noexcept
constexpr IntrusiveList() noexcept
Constructor.
#define SLICK_DETAIL_NAMESPACE_BEGIN
#define SLICK_DETAIL_NAMESPACE_END