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