Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
IceContainer.h
Go to the documentation of this file.
1 
8 
11 // Include Guard
12 #ifndef __ICECONTAINER_H__
13 #define __ICECONTAINER_H__
14 
15  #define CONTAINER_STATS
16 
17  enum FindMode
18  {
21 
22  FIND_FORCE_DWORD = 0x7fffffff
23  };
24 
26  {
27  public:
28  // Constructor / Destructor
29  Container();
30  Container(const Container& object);
31  Container(udword size, float growth_factor);
32  ~Container();
33  // Management
35 
46  inline_ Container& Add(udword entry)
48  {
49  // Resize if needed
50  if(mCurNbEntries==mMaxNbEntries) Resize();
51 
52  // Add new entry
53  mEntries[mCurNbEntries++] = entry;
54  return *this;
55  }
56 
57  inline_ Container& Add(const udword* entries, udword nb)
58  {
59  // Resize if needed
60  if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb);
61 
62  // Add new entry
63  CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword));
64  mCurNbEntries+=nb;
65  return *this;
66  }
67 
69 
80  inline_ Container& Add(float entry)
82  {
83  // Resize if needed
84  if(mCurNbEntries==mMaxNbEntries) Resize();
85 
86  // Add new entry
87  mEntries[mCurNbEntries++] = IR(entry);
88  return *this;
89  }
90 
91  inline_ Container& Add(const float* entries, udword nb)
92  {
93  // Resize if needed
94  if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb);
95 
96  // Add new entry
97  CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float));
98  mCurNbEntries+=nb;
99  return *this;
100  }
101 
104  {
105  if(!Contains(entry)) Add(entry);
106  return *this;
107  }
108 
110 
115  Container& Empty();
117 
119 
124  inline_ void Reset()
126  {
127  // Avoid the write if possible
128  // ### CMOV
129  if(mCurNbEntries) mCurNbEntries = 0;
130  }
131 
132  // HANDLE WITH CARE
134  {
135  mCurNbEntries = size;
136  }
137 
139 
144  bool SetSize(udword nb);
146 
148 
152  bool Refit();
154 
155  // Checks whether the container already contains a given value.
156  bool Contains(udword entry, udword* location=null) const;
157  // Deletes an entry - doesn't preserve insertion order.
158  bool Delete(udword entry);
159  // Deletes an entry - does preserve insertion order.
160  bool DeleteKeepingOrder(udword entry);
162  inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; }
164  inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; }
165 
166  // Helpers
167  Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP);
168  Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP);
169  // Data access.
170  inline_ udword GetNbEntries() const { return mCurNbEntries; }
171  inline_ udword GetEntry(udword i) const { return mEntries[i]; }
172  inline_ udword* GetEntries() const { return mEntries; }
173 
174  inline_ udword GetFirst() const { return mEntries[0]; }
175  inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; }
176 
177  // Growth control
178  inline_ float GetGrowthFactor() const { return mGrowthFactor; }
179  inline_ void SetGrowthFactor(float growth) { mGrowthFactor = growth; }
180  inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; }
181  inline_ BOOL IsNotEmpty() const { return mCurNbEntries; }
182 
184  inline_ udword operator[](udword i) const { OPASSERT(i>=0 && i<mCurNbEntries); return mEntries[i]; }
186  inline_ udword& operator[](udword i) { OPASSERT(i>=0 && i<mCurNbEntries); return mEntries[i]; }
187 
188  // Stats
189  udword GetUsedRam() const;
190 
192  void operator = (const Container& object);
193 
194 #ifdef CONTAINER_STATS
195  inline_ udword GetNbContainers() const { return mNbContainers; }
196  inline_ udword GetTotalBytes() const { return mUsedRam; }
197  private:
198 
199  static udword mNbContainers;
200  static udword mUsedRam;
201 #endif
202  private:
203  // Resizing
204  bool Resize(udword needed=1);
205  // Data
206  udword mMaxNbEntries;
207  udword mCurNbEntries;
208  udword* mEntries;
209  float mGrowthFactor;
210  };
211 
212 #endif // __ICECONTAINER_H__