ezEngine  Milestone 7
List.h
1 #pragma once
2 
3 #include <Foundation/Containers/Deque.h>
4 
10 template <typename T>
12 {
13 private:
14 
15  struct ListElement;
16 
18  {
20 
21  ListElement* m_pPrev;
22  ListElement* m_pNext;
23  };
24 
26  struct ListElement : public ListElementBase
27  {
28  ListElement() : ListElementBase() { }
29  explicit ListElement(const T& data);
30 
31  T m_Data;
32  };
33 
36  {
37  EZ_DECLARE_POD_TYPE();
38 
40  ConstIterator() : m_pElement (nullptr) {} // [tested]
41 
43  bool operator== (typename ezListBase<T>::ConstIterator it2) const { return (m_pElement == it2.m_pElement); } // [tested]
44 
46  bool operator!= (typename ezListBase<T>::ConstIterator it2) const { return (m_pElement != it2.m_pElement); } // [tested]
47 
49  const T& operator* () const { return (m_pElement->m_Data); } // [tested]
50 
52  const T* operator->() const { return (&m_pElement->m_Data); } // [tested]
53 
55  void Next() { m_pElement = m_pElement->m_pNext; } // [tested]
56 
58  void Prev() { m_pElement = m_pElement->m_pPrev; } // [tested]
59 
61  bool IsValid() const { return ((m_pElement != nullptr) && (m_pElement->m_pPrev != nullptr) && (m_pElement->m_pNext != nullptr)); } // [tested]
62 
64  void operator++ () { Next(); } // [tested]
65 
67  void operator-- () { Prev(); } // [tested]
68 
69  private:
70  friend class ezListBase<T>;
71 
72  ConstIterator(ListElement* pInit) : m_pElement (pInit) {}
73 
74  ListElement* m_pElement;
75  };
76 
77 public:
79  struct Iterator : public ConstIterator
80  {
81  // this is required to pull in the const version of this function
82  using ConstIterator::operator*;
83  using ConstIterator::operator->;
84 
85  EZ_DECLARE_POD_TYPE();
86 
88  Iterator() : ConstIterator () {} // [tested]
89 
91  T& operator* () { return (this->m_pElement->m_Data); } // [tested]
92 
94  T* operator->() { return (&this->m_pElement->m_Data); } // [tested]
95 
96  private:
97  friend class ezListBase<T>;
98 
99  explicit Iterator(ListElement* pInit) : ConstIterator (pInit) {}
100  };
101 
102 protected:
104  ezListBase(ezAllocatorBase* pAllocator); // [tested]
105 
107  ezListBase(const ezListBase<T>& cc, ezAllocatorBase* pAllocator); // [tested]
108 
110  ~ezListBase(); // [tested]
111 
113  void operator=(const ezListBase<T>& cc); // [tested]
114 
115 public:
117  void Clear(); // [tested]
118 
120  ezUInt32 GetCount() const; // [tested]
121 
123  bool IsEmpty() const; // [tested]
124 
126  const T& PeekFront() const; // [tested]
127 
129  const T& PeekBack() const; // [tested]
130 
132  T& PeekFront(); // [tested]
133 
135  T& PeekBack(); // [tested]
136 
138  void PushBack(); // [tested]
139 
141  void PushBack(const T& element); // [tested]
142 
144  void PopBack(); // [tested]
145 
147  void PushFront(); // [tested]
148 
150  void PushFront (const T& element); // [tested]
151 
153  void PopFront(); // [tested]
154 
156  void SetCount(ezUInt32 uiNewSize); // [tested]
157 
159  Iterator Insert(const Iterator& pos, const T& data); // [tested]
160 
162  void Insert(const Iterator& pos, ConstIterator first, const ConstIterator& last);
163 
165  Iterator Remove(const Iterator& pos); // [tested]
166 
168  Iterator Remove(Iterator first, const Iterator& last);
169 
171  Iterator GetIterator(); // [tested]
172 
174  Iterator GetLastIterator(); // [tested]
175 
177  Iterator GetEndIterator(); // [tested]
178 
180  ConstIterator GetIterator() const; // [tested]
181 
183  ConstIterator GetLastIterator() const; // [tested]
184 
186  ConstIterator GetEndIterator() const; // [tested]
187 
189  ezAllocatorBase* GetAllocator() const { return m_Elements.GetAllocator(); }
190 
192  bool operator==(const ezListBase<T>& rhs) const; // [tested]
193 
195  bool operator!=(const ezListBase<T>& rhs) const; // [tested]
196 
198  ezUInt64 GetHeapMemoryUsage() const { return m_Elements.GetHeapMemoryUsage(); } // [tested]
199 
200 private:
202  ListElementBase m_First;
203 
205  ListElementBase m_Last;
206 
207  // \brief Small hack to get around const problems.
208  Iterator m_End;
209 
211  ezUInt32 m_uiCount;
212 
214  ListElement* AcquireNode(const T& data);
215 
217  void ReleaseNode(ListElement* pNode);
218 
221 
223  ListElement* m_pFreeElementStack;
224 };
225 
226 
228 template <typename T, typename AllocatorWrapper = ezDefaultAllocatorWrapper>
229 class ezList : public ezListBase<T>
230 {
231 public:
232  ezList();
233  ezList(ezAllocatorBase* pAllocator);
234 
235  ezList(const ezList<T, AllocatorWrapper>& other);
236  ezList(const ezListBase<T>& other);
237 
238  void operator=(const ezList<T, AllocatorWrapper>& rhs);
239  void operator=(const ezListBase<T>& rhs);
240 };
241 
242 #include <Foundation/Containers/Implementation/List_inl.h>
243