/* * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2013-2014 Attila Molnar * * 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 . */ #pragma once #include struct intrusive_list_def_tag { }; template class intrusive_list; template class intrusive_list_tail; template class intrusive_list_node { T* ptr_next; T* ptr_prev; void unlink() { if (ptr_next) ptr_next->intrusive_list_node::ptr_prev = this->ptr_prev; if (ptr_prev) ptr_prev->intrusive_list_node::ptr_next = this->ptr_next; ptr_next = ptr_prev = NULL; } public: intrusive_list_node() : ptr_next(NULL) , ptr_prev(NULL) { } friend class intrusive_list; friend class intrusive_list_tail; }; // 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 // 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