From c47f66179960ce0c52066ae454e0b7a1238f6414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 18 Jul 2006 21:08:52 +0000 Subject: [PATCH] * Added a template class to bridge over to the struct list C stuff. * Added an Insert() variant that can insert an element behind another one. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18199 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../private/kernel/util/DoublyLinkedList.h | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/headers/private/kernel/util/DoublyLinkedList.h b/headers/private/kernel/util/DoublyLinkedList.h index a7775dbca7..0080b1cc92 100644 --- a/headers/private/kernel/util/DoublyLinkedList.h +++ b/headers/private/kernel/util/DoublyLinkedList.h @@ -79,6 +79,24 @@ public: } }; +// DoublyLinkedListCLink - interface to struct list +template +class DoublyLinkedListCLink { + private: + typedef DoublyLinkedListLink Link; + + public: + inline Link *operator()(Element *element) const + { + return (Link *)&element->link; + } + + inline const Link *operator()(const Element *element) const + { + return (const Link *)&element->link; + } +}; + // for convenience #define DOUBLY_LINKED_LIST_TEMPLATE_LIST \ template @@ -201,6 +219,7 @@ public: inline bool IsEmpty() const { return (fFirst == NULL); } inline void Insert(Element *element, bool back = true); + inline void Insert(Element *before, Element *element); inline void Add(Element *element, bool back = true); inline void Remove(Element *element); @@ -268,6 +287,31 @@ DOUBLY_LINKED_LIST_CLASS_NAME::Insert(Element *element, bool back) } } +// Insert +DOUBLY_LINKED_LIST_TEMPLATE_LIST +void +DOUBLY_LINKED_LIST_CLASS_NAME::Insert(Element *before, Element *element) +{ + if (before == NULL) { + Insert(element, false); + return; + } + if (element == NULL) + return; + + Link *beforeLink = sGetLink(before); + Link *link = sGetLink(element); + + link->previous = before; + link->next = beforeLink->next; + if (link->next != NULL) + link->next->previous = element; + beforeLink->next = element; + + if (fLast == before) + fLast = element; +} + // Add DOUBLY_LINKED_LIST_TEMPLATE_LIST void