]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/intrusive_list.h
Make the name of intrusive list class configurable using a define
[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
28 template <typename T, typename Tag = intrusive_list_def_tag>
29 class intrusive_list_node
30 {
31         T* ptr_next;
32         T* ptr_prev;
33
34         void unlink()
35         {
36                 if (ptr_next)
37                         ptr_next->intrusive_list_node<T, Tag>::ptr_prev = this->ptr_prev;
38                 if (ptr_prev)
39                         ptr_prev->intrusive_list_node<T, Tag>::ptr_next = this->ptr_next;
40                 ptr_next = ptr_prev = NULL;
41         }
42
43  public:
44         intrusive_list_node()
45                 : ptr_next(NULL)
46                 , ptr_prev(NULL)
47         {
48         }
49
50         friend class intrusive_list<T, Tag>;
51 };
52
53 #define INSPIRCD_INTRUSIVE_LIST_NAME intrusive_list
54 #include "intrusive_list_impl.h"
55 #undef INSPIRCD_INTRUSIVE_LIST_NAME