ezEngine  Milestone 7
IdTable.h
1 #pragma once
2 
3 #include <Foundation/Types/Id.h>
4 #include <Foundation/Memory/AllocatorWrapper.h>
5 
14 template <typename IdType, typename ValueType>
16 {
17 public:
18  typedef typename IdType::StorageType IndexType;
19  typedef IdType TypeOfId;
20 
23  {
24  public:
26  bool IsValid() const; // [tested]
27 
29  bool operator==(const typename ezIdTableBase<IdType, ValueType>::ConstIterator& it2) const;
30 
32  bool operator!=(const typename ezIdTableBase<IdType, ValueType>::ConstIterator& it2) const;
33 
35  IdType Id() const; // [tested]
36 
38  const ValueType& Value() const; // [tested]
39 
41  void Next(); // [tested]
42 
44  void operator++(); // [tested]
45 
46  protected:
47  friend class ezIdTableBase<IdType, ValueType>;
48 
49  explicit ConstIterator(const ezIdTableBase<IdType, ValueType>& idTable);
50 
51  const ezIdTableBase<IdType, ValueType>& m_idTable;
52  IndexType m_uiCurrentIndex; // current element index that this iterator points to.
53  IndexType m_uiCurrentCount; // current number of valid elements that this iterator has found so far.
54  };
55 
57  struct Iterator : public ConstIterator
58  {
59  public:
60  // this is required to pull in the const version of this function
62 
64  ValueType& Value(); // [tested]
65 
66  private:
67  friend class ezIdTableBase<IdType, ValueType>;
68 
69  explicit Iterator(const ezIdTableBase<IdType, ValueType>& idTable);
70  };
71 
72 protected:
74  ezIdTableBase(ezAllocatorBase* pAllocator); // [tested]
75 
77  ezIdTableBase(const ezIdTableBase<IdType, ValueType>& rhs, ezAllocatorBase* pAllocator); // [tested]
78 
80  ~ezIdTableBase(); // [tested]
81 
83  void operator= (const ezIdTableBase<IdType, ValueType>& rhs); // [tested]
84 
85 public:
87  void Reserve(IndexType uiCapacity); // [tested]
88 
90  IndexType GetCount() const; // [tested]
91 
93  bool IsEmpty() const; // [tested]
94 
96  void Clear(); // [tested]
97 
99  IdType Insert(const ValueType& value); // [tested]
100 
102  bool Remove(const IdType id, ValueType* out_oldValue = nullptr); // [tested]
103 
105  bool TryGetValue(const IdType id, ValueType& out_value) const; // [tested]
106 
108  bool TryGetValue(const IdType id, ValueType*& out_pValue) const; // [tested]
109 
111  const ValueType& operator[](const IdType id) const; // [tested]
112 
114  ValueType& operator[](const IdType id); // [tested]
115 
117  const ValueType& GetValueUnchecked(const IndexType index) const;
118 
120  ValueType& GetValueUnchecked(const IndexType index);
121 
123  bool Contains(const IdType id) const; // [tested]
124 
126  Iterator GetIterator(); // [tested]
127 
129  ConstIterator GetIterator() const; // [tested]
130 
132  ezAllocatorBase* GetAllocator() const;
133 
135  bool IsFreelistValid() const;
136 
137 private:
138  enum { CAPACITY_ALIGNMENT = 16 };
139 
140  struct Entry
141  {
142  IdType id;
143  ValueType value;
144  };
145 
146  Entry* m_pEntries;
147 
148  IndexType m_uiCount;
149  IndexType m_uiCapacity;
150 
151  IndexType m_uiFreelistEnqueue;
152  IndexType m_uiFreelistDequeue;
153 
154  ezAllocatorBase* m_pAllocator;
155 
156  void SetCapacity(IndexType uiCapacity);
157  void InitializeFreelist(IndexType uiStart, IndexType uiEnd);
158 };
159 
161 template <typename IdType, typename ValueType, typename AllocatorWrapper = ezDefaultAllocatorWrapper>
162 class ezIdTable : public ezIdTableBase<IdType, ValueType>
163 {
164 public:
165  ezIdTable();
166  ezIdTable(ezAllocatorBase* pAllocator);
167 
170 
171  void operator=(const ezIdTable<IdType, ValueType, AllocatorWrapper>& rhs);
172  void operator=(const ezIdTableBase<IdType, ValueType>& rhs);
173 };
174 
175 #include <Foundation/Containers/Implementation/IdTable_inl.h>
176