diff options
author | Attila Molnar <attilamolnar@hush.com> | 2014-07-09 14:26:49 +0200 |
---|---|---|
committer | Attila Molnar <attilamolnar@hush.com> | 2014-07-09 14:26:49 +0200 |
commit | 7282c2250e02c3ea2da57508d885c09c9881c4f0 (patch) | |
tree | 279e9c86d74c6281f58459b4e4135524b603736e | |
parent | 5866a765cc0e15d4631b443c553fd0011d01320e (diff) |
Split intrusive list implementation into a separate file
-rw-r--r-- | include/intrusive_list.h | 111 | ||||
-rw-r--r-- | include/intrusive_list_impl.h | 129 |
2 files changed, 130 insertions, 110 deletions
diff --git a/include/intrusive_list.h b/include/intrusive_list.h index 134a72267..ae323edb8 100644 --- a/include/intrusive_list.h +++ b/include/intrusive_list.h @@ -50,113 +50,4 @@ class intrusive_list_node friend class intrusive_list<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(); - } - - void pop_front() - { - erase(listhead); - } - - T* front() const - { - return listhead; - } - - 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; -}; +#include "intrusive_list_impl.h" diff --git a/include/intrusive_list_impl.h b/include/intrusive_list_impl.h new file mode 100644 index 000000000..5e48442c5 --- /dev/null +++ b/include/intrusive_list_impl.h @@ -0,0 +1,129 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2013-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 + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +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(); + } + + void pop_front() + { + erase(listhead); + } + + T* front() const + { + return listhead; + } + + 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; +}; |