X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fintrusive_list.h;h=de013ae386f357c9afdc67a947f00647e8bb9596;hb=ad50225dc3d5ce6e44a5009351a7434b7249d233;hp=399dc33e82251aeaa7578e0f641dabcd37235b3f;hpb=f71e6bf9cb41811f18864f5d4eecb26e29d03f25;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/intrusive_list.h b/include/intrusive_list.h index 399dc33e8..de013ae38 100644 --- a/include/intrusive_list.h +++ b/include/intrusive_list.h @@ -21,12 +21,16 @@ #include +namespace insp +{ + struct intrusive_list_def_tag { }; template class intrusive_list; +template class intrusive_list_tail; template -struct intrusive_list_node +class intrusive_list_node { T* ptr_next; T* ptr_prev; @@ -48,115 +52,20 @@ struct 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; - } - - void 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(); - } +} // namespace insp - void pop_front() - { - erase(listhead); - } - - T* front() const - { - return listhead; - } +// 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 - 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 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