src/InlineList.h
author David Anderson <dvander@alliedmods.net>
Wed Dec 26 17:20:55 2012 -0800 (2012-12-26)
changeset 244 3c57bbf22aa2
parent 123 a97d0e5a5817
permissions -rw-r--r--
Fix clang bustage.
dvander@123
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@123
     2
 *
dvander@61
     3
 * Copyright (C) 2004-2012 David Anderson
dvander@61
     4
 *
dvander@61
     5
 * This file is part of SourcePawn.
dvander@61
     6
 *
dvander@61
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@61
     8
 * the terms of the GNU General Public License as published by the Free
dvander@61
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@61
    10
 * any later version.
dvander@61
    11
 * 
dvander@61
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@61
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@61
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@61
    15
 *
dvander@61
    16
 * You should have received a copy of the GNU General Public License along with
dvander@61
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@61
    18
 */
dvander@61
    19
#ifndef _include_ke_inline_list_h_
dvander@61
    20
#define _include_ke_inline_list_h_
dvander@61
    21
dvander@61
    22
#include <stddef.h>
dvander@61
    23
dvander@61
    24
namespace ke {
dvander@61
    25
dvander@61
    26
template <typename T> class InlineList;
dvander@61
    27
dvander@61
    28
template <typename T>
dvander@61
    29
class InlineListNode
dvander@61
    30
{
dvander@61
    31
    friend class InlineList<T>;
dvander@61
    32
dvander@61
    33
  public:
dvander@61
    34
    InlineListNode()
dvander@61
    35
      : next_(NULL),
dvander@61
    36
        prev_(NULL)
dvander@61
    37
    {
dvander@61
    38
    }
dvander@61
    39
dvander@61
    40
    InlineListNode(InlineListNode *next, InlineListNode *prev)
dvander@61
    41
      : next_(next),
dvander@61
    42
        prev_(prev)
dvander@61
    43
    {
dvander@61
    44
    }
dvander@61
    45
dvander@61
    46
  protected:
dvander@61
    47
    InlineListNode *next_;
dvander@61
    48
    InlineListNode *prev_;
dvander@61
    49
};
dvander@61
    50
dvander@61
    51
template <typename T>
dvander@61
    52
class InlineList
dvander@61
    53
{
dvander@61
    54
    typedef InlineListNode<T> Node;
dvander@61
    55
dvander@61
    56
    Node head_;
dvander@61
    57
dvander@61
    58
  public:
dvander@61
    59
    InlineList()
dvander@61
    60
      : head_(&head_, &head_)
dvander@61
    61
    {
dvander@61
    62
    }
dvander@61
    63
dvander@61
    64
  public:
dvander@61
    65
    class iterator
dvander@61
    66
    {
dvander@61
    67
        friend class InlineList;
dvander@61
    68
        Node *iter_;
dvander@61
    69
        
dvander@61
    70
      public:
dvander@61
    71
        iterator(Node *iter)
dvander@61
    72
          : iter_(iter)
dvander@61
    73
        {
dvander@61
    74
        }
dvander@61
    75
dvander@61
    76
        iterator & operator++() {
dvander@61
    77
            iter_ = iter_->next_;
dvander@61
    78
            return *this;
dvander@61
    79
        }
dvander@61
    80
        iterator operator ++(int) {
dvander@61
    81
            iterator old(*this);
dvander@61
    82
            iter_ = iter_->next_;
dvander@61
    83
            return old;
dvander@61
    84
        }
dvander@61
    85
        T * operator *() {
dvander@61
    86
            return static_cast<T *>(iter_);
dvander@61
    87
        }
dvander@61
    88
        T * operator ->() {
dvander@61
    89
            return static_cast<T *>(iter_);
dvander@61
    90
        }
dvander@61
    91
        bool operator !=(const iterator &where) const {
dvander@61
    92
            return iter_ != where.iter_;
dvander@61
    93
        }
dvander@61
    94
        bool operator ==(const iterator &where) const {
dvander@61
    95
            return iter_ == where.iter_;
dvander@61
    96
        }
dvander@61
    97
        iterator prev() const {
dvander@61
    98
            return iterator(iter_->prev_);
dvander@61
    99
        }
dvander@61
   100
        iterator next() const {
dvander@61
   101
            return iterator(iter_->next_);
dvander@61
   102
        }
dvander@61
   103
    };
dvander@61
   104
dvander@61
   105
    iterator begin() {
dvander@61
   106
        return iterator(head_.next_);
dvander@61
   107
    }
dvander@61
   108
    iterator end() {
dvander@61
   109
        return iterator(&head_);
dvander@61
   110
    }
dvander@61
   111
    void append(Node *t) {
dvander@61
   112
        t->prev_ = head_.prev_;
dvander@61
   113
        t->next_ = &head_;
dvander@61
   114
        head_.prev_->next_ = t;
dvander@61
   115
        head_.prev_ = t;
dvander@61
   116
    }
dvander@61
   117
    iterator erase(iterator i) {
dvander@61
   118
        iterator next = ++i;
dvander@61
   119
        remove(i.iter_);
dvander@61
   120
        return next;
dvander@61
   121
    }
dvander@61
   122
    void remove(Node *t) {
dvander@61
   123
        t->prev_->next_ = t->next_;
dvander@61
   124
        t->next_->prev_ = t->prev_;
dvander@61
   125
    }
dvander@61
   126
};
dvander@61
   127
dvander@61
   128
}
dvander@61
   129
dvander@61
   130
#endif // _include_ke_inline_list_h_