]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/intrusive_list.h
Remove the Kiwi links from the readme.
[user/henk/code/inspircd.git] / include / intrusive_list.h
index 134a72267b4cf92a3580062e0b80011ae9b1b1c3..5f55591c7731e41e6d70cbcdc932ef652dd25801 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2013-2014 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2014 Attila Molnar <attilamolnar@hush.com>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
 
 #include <iterator>
 
+namespace insp
+{
+
 struct intrusive_list_def_tag { };
 
 template <typename T, typename Tag = intrusive_list_def_tag> class intrusive_list;
+template <typename T, typename Tag = intrusive_list_def_tag> class intrusive_list_tail;
 
 template <typename T, typename Tag = intrusive_list_def_tag>
 class intrusive_list_node
@@ -48,115 +52,20 @@ class intrusive_list_node
        }
 
        friend class intrusive_list<T, Tag>;
+       friend class intrusive_list_tail<T, Tag>;
 };
 
-template <typename T, typename Tag>
-class intrusive_list
-{
- public:
-       class iterator : public std::iterator<std::bidirectional_iterator_tag, T*>
-       {
-               T* curr;
-
-        public:
-               iterator(T* i = NULL)
-                       : curr(i)
-               {
-               }
-
-               iterator& operator++()
-               {
-                       curr = curr->intrusive_list_node<T, Tag>::ptr_next;
-                       return *this;
-               }
-
-               iterator operator++(int)
-               {
-                       iterator ret(*this);
-                       operator++();
-                       return ret;
-               }
-
-               iterator& operator--()
-               {
-                       curr = curr->intrusive_list_node<T, Tag>::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<T, Tag>::ptr_next = listhead;
-                       listhead->intrusive_list_node<T, Tag>::ptr_prev = x;
-               }
-               listhead = x;
-       }
-
-       void erase(const iterator& it)
-       {
-               erase(*it);
-       }
-
-       void erase(T* x)
-       {
-               if (listhead == x)
-                       listhead = x->intrusive_list_node<T, Tag>::ptr_next;
-               x->intrusive_list_node<T, Tag>::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