Merge pull request #256 from vvakame/impl-ts
[jackhill/mal.git] / cpp / StaticList.h
1 #ifndef INCLUDE_STATICLIST_H
2 #define INCLUDE_STATICLIST_H
3
4 template<typename T>
5 class StaticList
6 {
7 public:
8 StaticList() : m_head(NULL) { }
9
10 class Iterator;
11 Iterator begin() { return Iterator(m_head); }
12 Iterator end() { return Iterator(NULL); }
13
14 class Node {
15 public:
16 Node(StaticList<T>& list, T item)
17 : m_item(item), m_next(list.m_head) {
18 list.m_head = this;
19 }
20
21 private:
22 friend class Iterator;
23 T m_item;
24 Node* m_next;
25 };
26
27 class Iterator {
28 public:
29 Iterator& operator ++ () {
30 m_node = m_node->m_next;
31 return *this;
32 }
33
34 T& operator * () { return m_node->m_item; }
35 bool operator != (const Iterator& that) {
36 return m_node != that.m_node;
37 }
38
39 private:
40 friend class StaticList<T>;
41 Iterator(Node* node) : m_node(node) { }
42 Node* m_node;
43 };
44
45 private:
46 friend class Node;
47 Node* m_head;
48 };
49
50 #endif // INCLUDE_STATICLIST_H