From f26f6c62202c77acf430225662dc7691212cdee3 Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 18 Jul 2025 20:06:00 +0200 Subject: Core/Misc: Add splice/pop_front/pop_back to LinkedListHead --- src/common/Threading/LockedQueue.h | 5 ++-- src/server/shared/Dynamic/LinkedList.h | 44 ++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/common/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h index fb4a740c69e..25666db9358 100644 --- a/src/common/Threading/LockedQueue.h +++ b/src/common/Threading/LockedQueue.h @@ -77,10 +77,11 @@ public: if (_queue.empty()) return false; - if (!check.Process(_queue.front())) + decltype(auto) front = _queue.front(); + if (!check.Process(front)) return false; - result = std::move(_queue.front()); + result = std::move(front); _queue.pop_front(); return true; } diff --git a/src/server/shared/Dynamic/LinkedList.h b/src/server/shared/Dynamic/LinkedList.h index 4b9e0422a36..6fec8c98a3d 100644 --- a/src/server/shared/Dynamic/LinkedList.h +++ b/src/server/shared/Dynamic/LinkedList.h @@ -15,8 +15,8 @@ * with this program. If not, see . */ -#ifndef _LINKEDLIST -#define _LINKEDLIST +#ifndef TRINITYCORE_LINKED_LIST_H +#define TRINITYCORE_LINKED_LIST_H #include "Define.h" #include @@ -35,6 +35,12 @@ class LinkedListElement public: LinkedListElement() : iNext(nullptr), iPrev(nullptr) { } + bool isInList() const + { + return iNext != nullptr /*unlinked element*/ + && iNext != this /*list head*/; + } + LinkedListElement * next() { return iNext; } LinkedListElement const* next() const { return iNext; } LinkedListElement * prev() { return iPrev; } @@ -110,6 +116,16 @@ class LinkedListHead iHeader.insertBefore(pElem); } + void pop_front() + { + front_impl()->delink(); + } + + void pop_back() + { + back_impl()->delink(); + } + uint32 size() const { if (!iSize) @@ -156,6 +172,11 @@ class LinkedListHead return static_cast(_Ptr); } + base_pointer node() const + { + return _Ptr; + } + Iterator& operator++() { // preincrement _Ptr = _Ptr->next(); @@ -214,6 +235,25 @@ class LinkedListHead template Iterator end_impl() const { return Iterator(&iHeader); } + void splice_impl(LinkedListElement* where, LinkedListElement* first, LinkedListElement* last) + { + LinkedListElement* wherePrev = where->iPrev; + LinkedListElement* firstPrev = first->iPrev; + LinkedListElement* lastPrev = last->iPrev; + lastPrev->iNext = where; + where->iPrev = lastPrev; + firstPrev->iNext = last; + last->iPrev = firstPrev; + wherePrev->iNext = first; + first->iPrev = wherePrev; + } + + template + void splice_impl(Iterator where, Iterator first, Iterator last) + { + splice_impl(where.node(), first.node(), last.node()); + } + private: LinkedListHead(LinkedListHead const&) = delete; LinkedListHead(LinkedListHead&&) = delete; -- cgit v1.2.3