7 #ifndef CAFU_ARRAY_HPP_INCLUDED
8 #define CAFU_ARRAY_HPP_INCLUDED
15 #if defined(_WIN32) && defined(_MSC_VER)
17 #pragma warning(disable:6011)
20 #pragma warning(disable:6385)
23 #pragma warning(disable:6386)
26 #pragma warning(disable:28159)
29 #pragma warning(disable:28251)
40 template<
class T>
class ArrayT
44 unsigned long MaxNrOfElements;
45 unsigned long NrOfElements;
58 unsigned long Size()
const;
61 T& operator [] (
unsigned long Index);
62 const T& operator [] (
unsigned long Index)
const;
63 void PushBack(
const T Element);
64 void PushBackEmpty(
unsigned long Amount=1);
65 void PushBackEmptyExact(
unsigned long Amount=1);
66 void DeleteBack(
unsigned long Amount=1);
70 void InsertAt(
unsigned long Index,
const T Element);
71 void RemoveAt(
unsigned long Index);
72 void RemoveAtAndKeepOrder(
unsigned long Index);
73 template<
typename Function>
74 void QuickSort(Function IsLess);
76 int Find(
const T& Element)
const;
90 MaxNrOfElements=OldArray.MaxNrOfElements;
91 NrOfElements =OldArray.NrOfElements;
92 Elements =MaxNrOfElements>0 ?
new T[MaxNrOfElements] : NULL;
94 for (
unsigned long Nr=0; Nr<NrOfElements; Nr++) Elements[Nr]=OldArray.Elements[Nr];
107 T* NewElements=OldArray.MaxNrOfElements>0 ?
new T[OldArray.MaxNrOfElements] : NULL;
108 for (
unsigned long Nr=0; Nr<OldArray.NrOfElements; Nr++) NewElements[Nr]=OldArray.Elements[Nr];
112 MaxNrOfElements=OldArray.MaxNrOfElements;
113 NrOfElements =OldArray.NrOfElements;
114 Elements =NewElements;
121 if (NrOfElements != Other.NrOfElements)
124 for (
unsigned long Nr=0; Nr<NrOfElements; Nr++)
125 if (Elements[Nr] != Other.Elements[Nr])
134 return !(this->operator == (Other));
163 assert(Index<NrOfElements);
165 return Elements[Index];
171 assert(Index<NrOfElements);
173 return Elements[Index];
184 if (NrOfElements>MaxNrOfElements)
186 if (!MaxNrOfElements) MaxNrOfElements=1;
187 while (MaxNrOfElements<NrOfElements)
193 T* NewElements=
new T[MaxNrOfElements];
194 for (
unsigned long Nr=0; Nr<NrOfElements-1; Nr++) NewElements[Nr]=Elements[Nr];
197 Elements=NewElements;
200 Elements[NrOfElements-1]=Element;
206 NrOfElements+=Amount;
208 if (NrOfElements>MaxNrOfElements)
210 if (!MaxNrOfElements) MaxNrOfElements=1;
211 while (MaxNrOfElements<NrOfElements)
217 T* NewElements=
new T[MaxNrOfElements];
218 for (
unsigned long Nr=0; Nr<NrOfElements-Amount; Nr++) NewElements[Nr]=Elements[Nr];
221 Elements=NewElements;
228 NrOfElements+=Amount;
230 if (NrOfElements>MaxNrOfElements)
232 MaxNrOfElements=NrOfElements;
234 T* NewElements=
new T[MaxNrOfElements];
235 for (
unsigned long Nr=0; Nr<NrOfElements-Amount; Nr++) NewElements[Nr]=Elements[Nr];
238 Elements=NewElements;
245 while (Amount>0 && NrOfElements>0)
247 Elements[NrOfElements-1]=T();
256 for (
unsigned long Nr=0; Nr<Other.
Size(); Nr++)
263 assert(Index<=NrOfElements);
267 for (
unsigned long Nr=NrOfElements-1; Nr>Index; Nr--)
268 Elements[Nr]=Elements[Nr-1];
270 Elements[Index]=Element;
276 assert(Index<NrOfElements);
278 Elements[Index]=Elements[NrOfElements-1];
285 assert(Index<NrOfElements);
287 for (
unsigned long Nr=Index; Nr+1<NrOfElements; Nr++)
288 Elements[Nr]=Elements[Nr+1];
298 if (NrOfElements<=1)
return;
301 ToDoRanges.PushBack(0);
302 ToDoRanges.PushBack(NrOfElements-1);
305 while (ToDoRanges.
Size()>=2)
307 const unsigned long LastIndex =ToDoRanges[ToDoRanges.
Size()-1]; ToDoRanges.DeleteBack();
308 const unsigned long FirstIndex=ToDoRanges[ToDoRanges.
Size()-1]; ToDoRanges.DeleteBack();
310 if (FirstIndex<LastIndex)
312 const T& x=Elements[LastIndex];
313 unsigned long i=FirstIndex-1;
315 for (
unsigned long j=FirstIndex; j<=LastIndex-1; j++)
316 if (IsLess(Elements[j], x))
319 const T Swap=Elements[i];
320 Elements[i]=Elements[j];
324 const T Swap=Elements[i+1];
325 Elements[i+1]=Elements[LastIndex];
326 Elements[LastIndex]=Swap;
330 ToDoRanges.PushBack(i+1); ToDoRanges.PushBack(LastIndex);
331 if (i>0) { ToDoRanges.PushBack(FirstIndex); ToDoRanges.PushBack(i-1); }
368 for (
unsigned long Nr=0; Nr<NrOfElements; Nr++)
369 if (Elements[Nr]==Element)
General array error.
Definition: Array.hpp:35
ArrayT< T > & operator=(const ArrayT< T > &OldArray)
Assignment operator.
Definition: Array.hpp:104
unsigned long Size() const
Get size of array.
Definition: Array.hpp:138
bool operator==(const ArrayT< T > &Other) const
Equality operator.
Definition: Array.hpp:119
Array index exceeds array boundaries.
Definition: Array.hpp:36
~ArrayT()
Destructor.
Definition: Array.hpp:98
bool operator!=(const ArrayT< T > &Other) const
Inequality operator.
Definition: Array.hpp:132
Overflow of the arrays size.
Definition: Array.hpp:37
void Overwrite()
Clear array (but reuse memory)
Definition: Array.hpp:154
void Clear()
Clear array (and free allocated memory)
Definition: Array.hpp:144
Definition: Renderer.hpp:16
ArrayT()
Usual constructor.
Definition: Array.hpp:80