dvander@61: /* dvander@61: * Copyright (C) 2004-2012 David Anderson dvander@61: * dvander@61: * This file is part of SourcePawn. dvander@61: * dvander@61: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@61: * the terms of the GNU General Public License as published by the Free dvander@61: * Software Foundation, either version 3 of the License, or (at your option) dvander@61: * any later version. dvander@61: * dvander@61: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@61: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@61: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@61: * dvander@61: * You should have received a copy of the GNU General Public License along with dvander@61: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@61: */ dvander@61: #ifndef _include_ke_inline_list_h_ dvander@61: #define _include_ke_inline_list_h_ dvander@61: dvander@61: #include dvander@61: dvander@61: namespace ke { dvander@61: dvander@61: template class InlineList; dvander@61: dvander@61: template dvander@61: class InlineListNode dvander@61: { dvander@61: friend class InlineList; dvander@61: dvander@61: public: dvander@61: InlineListNode() dvander@61: : next_(NULL), dvander@61: prev_(NULL) dvander@61: { dvander@61: } dvander@61: dvander@61: InlineListNode(InlineListNode *next, InlineListNode *prev) dvander@61: : next_(next), dvander@61: prev_(prev) dvander@61: { dvander@61: } dvander@61: dvander@61: protected: dvander@61: InlineListNode *next_; dvander@61: InlineListNode *prev_; dvander@61: }; dvander@61: dvander@61: template dvander@61: class InlineList dvander@61: { dvander@61: typedef InlineListNode Node; dvander@61: dvander@61: Node head_; dvander@61: dvander@61: public: dvander@61: InlineList() dvander@61: : head_(&head_, &head_) dvander@61: { dvander@61: } dvander@61: dvander@61: public: dvander@61: class iterator dvander@61: { dvander@61: friend class InlineList; dvander@61: Node *iter_; dvander@61: dvander@61: public: dvander@61: iterator(Node *iter) dvander@61: : iter_(iter) dvander@61: { dvander@61: } dvander@61: dvander@61: iterator & operator++() { dvander@61: iter_ = iter_->next_; dvander@61: return *this; dvander@61: } dvander@61: iterator operator ++(int) { dvander@61: iterator old(*this); dvander@61: iter_ = iter_->next_; dvander@61: return old; dvander@61: } dvander@61: T * operator *() { dvander@61: return static_cast(iter_); dvander@61: } dvander@61: T * operator ->() { dvander@61: return static_cast(iter_); dvander@61: } dvander@61: bool operator !=(const iterator &where) const { dvander@61: return iter_ != where.iter_; dvander@61: } dvander@61: bool operator ==(const iterator &where) const { dvander@61: return iter_ == where.iter_; dvander@61: } dvander@61: iterator prev() const { dvander@61: return iterator(iter_->prev_); dvander@61: } dvander@61: iterator next() const { dvander@61: return iterator(iter_->next_); dvander@61: } dvander@61: }; dvander@61: dvander@61: iterator begin() { dvander@61: return iterator(head_.next_); dvander@61: } dvander@61: iterator end() { dvander@61: return iterator(&head_); dvander@61: } dvander@61: void append(Node *t) { dvander@61: t->prev_ = head_.prev_; dvander@61: t->next_ = &head_; dvander@61: head_.prev_->next_ = t; dvander@61: head_.prev_ = t; dvander@61: } dvander@61: iterator erase(iterator i) { dvander@61: iterator next = ++i; dvander@61: remove(i.iter_); dvander@61: return next; dvander@61: } dvander@61: void remove(Node *t) { dvander@61: t->prev_->next_ = t->next_; dvander@61: t->next_->prev_ = t->prev_; dvander@61: } dvander@61: }; dvander@61: dvander@61: } dvander@61: dvander@61: #endif // _include_ke_inline_list_h_