]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/intrusive_list.h
Merge insp20
[user/henk/code/inspircd.git] / include / intrusive_list.h
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2013-2014 Attila Molnar <attilamolnar@hush.com>
5  *
6  * This file is part of InspIRCd.  InspIRCd is free software: you can
7  * redistribute it and/or modify it under the terms of the GNU General Public
8  * License as published by the Free Software Foundation, version 2.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
13  * details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19
20 #pragma once
21
22 #include <iterator>
23
24 struct intrusive_list_def_tag { };
25
26 template <typename T, typename Tag = intrusive_list_def_tag> class intrusive_list;
27 template <typename T, typename Tag = intrusive_list_def_tag> class intrusive_list_tail;
28
29 template <typename T, typename Tag = intrusive_list_def_tag>
30 class intrusive_list_node
31 {
32         T* ptr_next;
33         T* ptr_prev;
34
35         void unlink()
36         {
37                 if (ptr_next)
38                         ptr_next->intrusive_list_node<T, Tag>::ptr_prev = this->ptr_prev;
39                 if (ptr_prev)
40                         ptr_prev->intrusive_list_node<T, Tag>::ptr_next = this->ptr_next;
41                 ptr_next = ptr_prev = NULL;
42         }
43
44  public:
45         intrusive_list_node()
46                 : ptr_next(NULL)
47                 , ptr_prev(NULL)
48         {
49         }
50
51         friend class intrusive_list<T, Tag>;
52         friend class intrusive_list_tail<T, Tag>;
53 };
54
55 // Intrusive list where the list only has a pointer to the head element
56 #define INSPIRCD_INTRUSIVE_LIST_NAME intrusive_list
57 #include "intrusive_list_impl.h"
58 #undef INSPIRCD_INTRUSIVE_LIST_NAME
59
60 // Intrusive list where the list maintains a pointer to both the head and the tail elements.
61 // Additional methods: back(), push_back(), pop_back()
62 #define INSPIRCD_INTRUSIVE_LIST_NAME intrusive_list_tail
63 #define INSPIRCD_INTRUSIVE_LIST_HAS_TAIL
64 #include "intrusive_list_impl.h"
65 #undef INSPIRCD_INTRUSIVE_LIST_NAME
66 #undef INSPIRCD_INTRUSIVE_LIST_HAS_TAIL