diff --git a/src/ds/dllist.h b/src/ds/dllist.h index bf23819..f892ece 100644 --- a/src/ds/dllist.h +++ b/src/ds/dllist.h @@ -53,8 +53,11 @@ namespace snmalloc } }; - template - class DLList + template< + class T, + class Terminator = std::nullptr_t, + bool delete_on_clear = false> + class DLList final { private: static_assert( @@ -66,6 +69,32 @@ namespace snmalloc T* tail = Terminator(); public: + ~DLList() + { + clear(); + } + + DLList() = default; + + DLList(DLList&& o) noexcept + { + head = o.head; + tail = o.tail; + + o.head = nullptr; + o.tail = nullptr; + } + + DLList& operator=(DLList&& o) noexcept + { + head = o.head; + tail = o.tail; + + o.head = nullptr; + o.tail = nullptr; + return *this; + } + bool is_empty() { return head == Terminator(); @@ -76,6 +105,11 @@ namespace snmalloc return head; } + T* get_tail() + { + return tail; + } + T* pop() { T* item = head; @@ -86,6 +120,16 @@ namespace snmalloc return item; } + T* pop_tail() + { + T* item = tail; + + if (item != Terminator()) + remove(item); + + return item; + } + void insert(T* item) { #ifndef NDEBUG @@ -147,6 +191,19 @@ namespace snmalloc #endif } + void clear() + { + while (head != nullptr) + { + auto c = head; + remove(c); + if (delete_on_clear) + { + delete c; + } + } + } + void debug_check_contains(T* item) { #ifndef NDEBUG