X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fintrusive_list.h;h=88f3c6829c2dda877bf3d19a97d346d2a0b6e11e;hb=662364f8551b3db2a3cbc0000f2d3eec091d8e07;hp=134a72267b4cf92a3580062e0b80011ae9b1b1c3;hpb=45ca2908a3c7f3d4c56325e1fbc404bd11bdba3b;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/intrusive_list.h b/include/intrusive_list.h index 134a72267..88f3c6829 100644 --- a/include/intrusive_list.h +++ b/include/intrusive_list.h @@ -24,6 +24,7 @@ struct intrusive_list_def_tag { }; template class intrusive_list; +template class intrusive_list_tail; template class intrusive_list_node @@ -48,115 +49,18 @@ class intrusive_list_node } friend class intrusive_list; + friend class intrusive_list_tail; }; -template -class intrusive_list -{ - public: - class iterator : public std::iterator - { - T* curr; - - public: - iterator(T* i = NULL) - : curr(i) - { - } - - iterator& operator++() - { - curr = curr->intrusive_list_node::ptr_next; - return *this; - } - - iterator operator++(int) - { - iterator ret(*this); - operator++(); - return ret; - } - - iterator& operator--() - { - curr = curr->intrusive_list_node::ptr_prev; - return *this; - } - - iterator operator--(int) - { - iterator ret(*this); - operator--(); - return ret; - } - - bool operator==(const iterator& other) const { return (curr == other.curr); } - bool operator!=(const iterator& other) const { return (curr != other.curr); } - T* operator*() const { return curr; } - }; - - typedef iterator const_iterator; - - intrusive_list() - : listhead(NULL) - , listsize(0) - { - } - - bool empty() const - { - return (size() == 0); - } - - size_t size() const - { - return listsize; - } - - iterator begin() const - { - return iterator(listhead); - } - - iterator end() const - { - return iterator(); - } - - void pop_front() - { - erase(listhead); - } - - T* front() const - { - return listhead; - } - - void push_front(T* x) - { - if (listsize++) - { - x->intrusive_list_node::ptr_next = listhead; - listhead->intrusive_list_node::ptr_prev = x; - } - listhead = x; - } - - void erase(const iterator& it) - { - erase(*it); - } - - void erase(T* x) - { - if (listhead == x) - listhead = x->intrusive_list_node::ptr_next; - x->intrusive_list_node::unlink(); - listsize--; - } - - private: - T* listhead; - size_t listsize; -}; +// Intrusive list where the list only has a pointer to the head element +#define INSPIRCD_INTRUSIVE_LIST_NAME intrusive_list +#include "intrusive_list_impl.h" +#undef INSPIRCD_INTRUSIVE_LIST_NAME + +// Intrusive list where the list maintains a pointer to both the head and the tail elements. +// Additional methods: back(), push_back(), pop_back() +#define INSPIRCD_INTRUSIVE_LIST_NAME intrusive_list_tail +#define INSPIRCD_INTRUSIVE_LIST_HAS_TAIL +#include "intrusive_list_impl.h" +#undef INSPIRCD_INTRUSIVE_LIST_NAME +#undef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL