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