Rune Engine  Version 0.2.7-alpha
Documentation for how to make games using the Rune Engine.
list.h
1 
23 #pragma once
24 
25 namespace rune {
26 
28  template <class T>
29  struct listItem
30  {
31 
32  T storedItem;
33  listItem* nextItem;
34 
35  listItem()
36  {
37  nextItem = nullptr;
38  }
39 
40  };
42 
43  template <class T>
44  class List
45  {
46 
47  private:
48  listItem<T>* listHead;
49  listItem<T>* currentlyAccessedItem;
50 
51  int listSize;
52 
53  public:
54 
55  List()
56  : listHead(nullptr), listSize(0), currentlyAccessedItem(nullptr)
57  {
58  }
59 
60  ~List()
61  {
62  clear();
63  }
64 
68  T* getList()
69  {
70  currentlyAccessedItem = listHead;
71  return &(listHead->storedItem);
72  }
73 
77  T* getNext()
78  {
79 
80  if (currentlyAccessedItem == nullptr)
81  {
82  return nullptr;
83  }
84 
85  currentlyAccessedItem = currentlyAccessedItem->nextItem;
86 
87  return &(currentlyAccessedItem->storedItem);
88 
89  }
90 
93  int size()
94  {
95  return listSize;
96  }
97 
100  void add(T const& newData)
101  {
102 
103  listSize++;
104  listItem<T>* newItem = new listItem<T>;
105  newItem->storedItem = newData;
106 
107  listItem<T>* currentItem = listHead;
108 
109  if (listHead == nullptr)
110  {
111 
112  listHead = newItem;
113 
114  }
115  else
116  {
117 
118  while (currentItem->nextItem != nullptr)
119  {
120 
121  currentItem = currentItem->nextItem;
122 
123  }
124 
125  currentItem->nextItem = newItem;
126 
127  }
128 
129  }
130 
133  void remove(int index)
134  {
135 
136  listSize--;
137  listItem<T>* currentItem = listHead;
138 
139  //Access the element just before the element to be deleted.
140  for (int i = 0; i < index - 1; i++)
141  {
142 
143  currentItem = currentItem->nextItem;
144 
145  }
146 
147  //If the list is now empty, reset. Otherwise, delete the specified element.
148  if (index == 0)
149  {
150  listItem<T>* temp = listHead;
151  listHead = listHead->nextItem;
152  delete temp;
153  }
154  else
155  {
156  listItem<T>* temp = currentItem->nextItem->nextItem;
157 
158  delete currentItem->nextItem;
159  currentItem->nextItem = temp;
160  }
161 
162  }
163 
165  void clear()
166  {
167 
168  while (listSize != 0)
169  {
170 
171  //Go through and delete each element of the list
172  remove(0);
173 
174  }
175 
176  }
177 
181  void insert(T const& newData, int index)
182  {
183 
184  listSize++;
185  listItem<T>* currentItem = listHead;
186 
187  listItem<T>* newItem = new listItem<T>;
188  newItem->storedItem = newData;
189 
190  //Access the element just before the space to be inserted.
191  for (int i = 0; i < index - 1; i++)
192  {
193 
194  currentItem = currentItem->nextItem;
195 
196  }
197 
198  listItem<T>* temp = currentItem->nextItem;
199 
200  currentItem->nextItem = newItem;
201  newItem->nextItem = temp;
202 
203  }
204 
209  T& operator[](int index)
210  {
211 
212  listItem<T>* currentItem = listHead;
213 
214  for (int i = 0; i < index; i++)
215  {
216 
217  currentItem = currentItem->nextItem;
218 
219  }
220 
221  return (currentItem->storedItem);
222 
223  }
224 
225  };
226 
227 }//namespace rune
rune::List
A list that can be used to store data.
Definition: list.h:45
rune::List::remove
void remove(int index)
Definition: list.h:133
rune::List::size
int size()
Definition: list.h:93
rune::List::clear
void clear()
Clears the list.
Definition: list.h:165
rune::List::getList
T * getList()
Definition: list.h:68
rune::List::add
void add(T const &newData)
Definition: list.h:100
rune::List::getNext
T * getNext()
Definition: list.h:77
rune
The main namespace to be used for interfacing with the engine.
Definition: animator.h:21
rune::List::insert
void insert(T const &newData, int index)
Definition: list.h:181
rune::List::operator[]
T & operator[](int index)
Definition: list.h:209