25 #define GRAY_FOREACH( _ITYPE, i, a ) for ( ITERATE_t index_##i=0, _foreach_int=true; index_##i < a.GetSize(); index_##i++, _foreach_int=true ) \
26 for ( _ITYPE i=a[index_##i]; _foreach_int; _foreach_int=false )
46 for (; (nCount--) != 0; pElements++)
48 ::new((
void*)pElements)
TYPE;
65 for (; (nCount--) != 0; pElements++)
81 while ((nCount--) != 0)
97 template <
class TYPE,
class ARG_TYPE = const TYPE& >
126 m_pData = ref.m_pData; ref.m_pData =
nullptr;
127 m_nSize = ref.m_nSize; ref.m_nSize = 0;
147 return this->m_nSize <= 0;
216 return GetAt(nIndex);
229 template <
class TYPE,
class ARG_TYPE>
239 if (m_pData !=
nullptr)
241 DestructElements<TYPE>(m_pData, iSize);
247 template <
class TYPE,
class ARG_TYPE>
258 else if (m_pData ==
nullptr)
262 ASSERT(m_pData !=
nullptr);
263 ConstructElements<TYPE>(m_pData, nNewSize);
265 else if (nNewSize <= GetMallocSize())
269 if (nNewSize > m_nSize)
272 ConstructElements<TYPE>(&m_pData[m_nSize], nNewSize - m_nSize);
274 else if (m_nSize > nNewSize)
277 DestructElements<TYPE>(&m_pData[nNewSize], m_nSize - nNewSize);
292 ASSERT(nNewSize > m_nSize);
293 ConstructElements<TYPE>(&m_pData[m_nSize], nNewSize - m_nSize);
298 template <
class TYPE,
class ARG_TYPE>
303 SetSize(
src.m_nSize);
304 CopyElements<TYPE>(m_pData,
src.m_pData,
src.m_nSize);
307 template <
class TYPE,
class ARG_TYPE>
312 if (nIndex < m_nSize)
314 m_pData[nIndex] = newElement;
320 m_pData[nIndex] = newElement;
323 template <
class TYPE,
class ARG_TYPE>
329 BYTE bTmp[
sizeof(
TYPE)];
330 ASSERT(IsValidIndex(iFrom));
333 ASSERT(IsValidIndex(iTo));
335 (iFrom - iTo) *
sizeof(
TYPE));
340 template <
class TYPE,
class ARG_TYPE>
347 if (nIndex >= m_nSize)
356 SetSize(m_nSize + 1);
358 MoveElement(nOldSize, nIndex);
362 ASSERT(nIndex + 1 <= m_nSize);
363 m_pData[nIndex] = newElement;
366 template <
class TYPE,
class ARG_TYPE>
373 ITERATE_t nMoveCount = m_nSize - (nIndex + 1);
376 DestructElements<TYPE>(&m_pData[nIndex], 1);
384 template <
class TYPE,
class ARG_TYPE>
389 if (iQty <= 0 || nIndex < 0)
391 ITERATE_t nMoveCount = m_nSize - (nIndex + iQty);
396 iQty = m_nSize - nIndex;
405 DestructElements<TYPE>(&m_pData[nIndex], iQty);
413 template <
class TYPE,
class ARG_TYPE>
417 if (m_pData ==
nullptr)
425 if (m_nSize > GetMallocSize())
435 template <
class TYPE,
class ARG_TYPE = const TYPE&>
601 if (
this == &aValues)
620 if (this->
m_pData[nIndex] == arg)
638 ELEM_t tmp = this->
GetAt(0);
646 ELEM_t tmp = this->
GetAt(i);
669 return this->
Add(newElement);
674 return this->
Add(newElement);
697 this->
SetSize(nOldSize + nSrcSize);
698 CopyElements<TYPE>(this->
GetData() + nOldSize,
src.GetData(), nSrcSize);
707 if (
this == &aValues)
731 template<
class TYPE,
class ARG_TYPE>
738 REF_t a = this->ConstElementAt(i);
739 REF_t b = this->ConstElementAt(i + 1);
740 if (CompareData(a, b) > 0)
748 template<
class TYPE,
class ARG_TYPE>
755 const TYPE& a = this->ConstElementAt(i);
756 const TYPE& b = this->ConstElementAt(i + 1);
757 if (CompareData(a, b) >= 0)
765 template<
class TYPE,
class ARG_TYPE>
772 while (iLeft < iRight && CompareData(this->ElementAt(iLeft), this->ElementAt(iRight)) <=
COMPARE_Equal)
776 this->Swap(iRight, iLeft);
779 while (iLeft < iRight && CompareData(this->ElementAt(iLeft), this->ElementAt(iRight)) <=
COMPARE_Equal)
783 this->Swap(iLeft, iRight);
788 template<
class TYPE,
class ARG_TYPE>
793 ITERATE_t iMid = QSortPartition(iLeft, iRight);
794 if (iLeft < iMid - 1)
795 QSort(iLeft, iMid - 1);
796 if (iMid + 1 < iRight)
797 QSort(iMid + 1, iRight);
802 template <
class TYPE,
class TYPE_ARG = TYPE*>
862 template <
class TYPE>
896 for (
ITERATE_t i = iSize - 1; i >= 0; i--)
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
#define TYPE
Definition: StrT.cpp:38
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define ASSERT_N(exp)
Definition: cDebugAssert.h:70
#define ASSERT_THROW(exp)
Definition: cDebugAssert.h:68
#define COBJECT_IsValidCheck()
Definition: cObject.h:64
#define ASSERT_VALID(p)
Definition: cObject.h:61
void RemoveAll()
Clean up.
Definition: cArray.h:230
CArray(THIS_t &&ref) noexcept
Definition: cArray.h:123
ITERATE_t m_nSize
Number of elements (upperBound - 1)
Definition: cArray.h:109
void SetAtGrow(ITERATE_t nIndex, ARG_TYPE newElement)
Definition: cArray.h:308
bool IsEmpty() const noexcept
Definition: cArray.h:145
const TYPE & GetAt(ITERATE_t nIndex) const
Definition: cArray.h:162
void SetAt(ITERATE_t nIndex, ARG_TYPE newElement)
Definition: cArray.h:173
virtual ~CArray()
Definition: cArray.h:129
TYPE & ElementAt(ITERATE_t nIndex)
Definition: cArray.h:167
ITERATE_t GetMallocSize() const noexcept
Definition: cArray.h:150
void SetDataArrayPtr(TYPE *pData, ITERATE_t nSize)
Definition: cArray.h:189
ITERATE_t GetUpperBound() const noexcept
Definition: cArray.h:141
TYPE * GetData()
Definition: cArray.h:185
void InsertAt(ITERATE_t nIndex, ARG_TYPE newElement)
Definition: cArray.h:341
TYPE & operator[](ITERATE_t nIndex)
Definition: cArray.h:210
bool IsValidMallocSize() const noexcept
Definition: cArray.h:414
bool IsValidIndex(ITERATE_t i) const noexcept
Definition: cArray.h:112
void MoveElement(ITERATE_t iFrom, ITERATE_t iTo)
Definition: cArray.h:324
ITERATE_t Add(ARG_TYPE newElement)
Definition: cArray.h:199
TYPE * m_pData
the actual array of data
Definition: cArray.h:108
ITERATE_t GetSize() const noexcept
Definition: cArray.h:137
void RemoveAt(ITERATE_t nIndex)
Definition: cArray.h:367
const TYPE & operator[](ITERATE_t nIndex) const
Definition: cArray.h:214
void Copy(const CArray &src)
Definition: cArray.h:299
void RemoveAt(ITERATE_t nIndex, ITERATE_t iQty)
Definition: cArray.h:385
const TYPE * GetData() const
Definition: cArray.h:181
void SetSize(ITERATE_t nNewSize)
Definition: cArray.h:248
CArray() noexcept
Definition: cArray.h:118
TYPE PopHead()
Definition: cArray.h:844
virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
Definition: cArray.h:823
REF_t GetAtCheck(ITERATE_t index) const
Definition: cArray.h:834
cArrayTyped< TYPE, TYPE_ARG > SUPER_t
Definition: cArray.h:810
SUPER_t::ELEM_t ELEM_t
Definition: cArray.h:813
REF_t GetAt(ITERATE_t index) const
Definition: cArray.h:830
virtual ~cArrayFacade()
Definition: cArray.h:817
SUPER_t::REF_t REF_t
Definition: cArray.h:814
cArrayFacade< TYPE, TYPE_ARG > THIS_t
Definition: cArray.h:811
TYPE PopTail()
Definition: cArray.h:852
void DeleteAt(ITERATE_t i)
Definition: cArray.h:875
SUPER_t::REF_t REF_t
Definition: cArray.h:871
cArrayFacade< TYPE *, TYPE * > SUPER_t
Definition: cArray.h:870
void DeleteAll()
Definition: cArray.h:882
SUPER_t::ELEM_t ELEM_t
Definition: cArray.h:872
cArrayStruct() noexcept
Definition: cArray.h:938
cArrayStruct(ITERATE_t iSize)
Definition: cArray.h:941
void RemoveLast()
Definition: cArray.h:631
virtual COMPARE_t CompareData(REF_t Data1, REF_t Data2) const noexcept
Definition: cArray.h:452
REF_t ConstElementAt(ITERATE_t nIndex) const
Definition: cArray.h:534
TYPE & operator[](ITERATE_t nIndex)
Definition: cArray.h:540
void QSort()
Definition: cArray.h:722
REF_t ConstHead() const
Definition: cArray.h:567
size_t GetHeapStats(OUT ITERATE_t &iAllocCount) const noexcept
Definition: cArray.h:508
bool isArraySortedND() const
Definition: cArray.h:749
const TYPE & operator[](ITERATE_t nIndex) const
Definition: cArray.h:544
ITERATE_t PushTail(ARG_TYPE newElement)
Definition: cArray.h:671
void UnLinkArg(ARG_TYPE arg)
Definition: cArray.h:659
void AddArray(const SUPER_t &src)
Definition: cArray.h:687
const cArrayTyped< TYPE, ARG_TYPE > & operator=(const cArrayTyped< TYPE, ARG_TYPE > &aValues)
Definition: cArray.h:608
void AddHead(ARG_TYPE newElement)
Definition: cArray.h:676
TYPE & Head()
Definition: cArray.h:551
cArrayTyped(const THIS_t &rArray)
Definition: cArray.h:468
void SetCopy(const cArrayTyped< TYPE, ARG_TYPE > &aValues)
Definition: cArray.h:598
REF_t GetAtTail()
Definition: cArray.h:576
ITERATE_t ClampValidIndex(ITERATE_t i) const noexcept
Definition: cArray.h:499
TYPE & ElementAtHead()
Definition: cArray.h:559
void AssertValidIndex(ITERATE_t nIndex) const
Definition: cArray.h:517
cArrayTyped< TYPE, ARG_TYPE > THIS_t
Definition: cArray.h:443
REF_t ConstTail() const
Definition: cArray.h:571
bool HasArg(ARG_TYPE arg) const
Definition: cArray.h:625
bool IsValidIndex(ITERATE_t i) const noexcept
Definition: cArray.h:495
ARG_TYPE REF_t
How to refer to this? value or ref or pointer?
Definition: cArray.h:449
bool RemoveArg(ARG_TYPE arg)
Definition: cArray.h:650
TYPE & ElementAtSecure(ITERATE_t nIndex)
Definition: cArray.h:527
cArrayTyped() noexcept
Definition: cArray.h:465
TYPE & Tail()
Definition: cArray.h:555
TYPE & ElementAtTail()
Definition: cArray.h:563
bool isValidCheck() const noexcept
< memory allocation and structure definitions are valid.
Definition: cArray.h:482
virtual ~cArrayTyped()
Definition: cArray.h:478
ITERATE_t QSortPartition(ITERATE_t iLeft, ITERATE_t iRight)
Definition: cArray.h:766
bool IsEqualArray(const SUPER_t &aValues) const
Definition: cArray.h:702
ITERATE_t iterator
Definition: cArray.h:445
ITERATE_t AddTail(ARG_TYPE newElement)
Definition: cArray.h:666
ITERATE_t FindIFor(ARG_TYPE arg) const
Definition: cArray.h:614
ELEM_t PopTail()
Definition: cArray.h:642
cArrayTyped(ITERATE_t iSize)
Definition: cArray.h:474
void UnLinkIndex(ITERATE_t nIndex)
Definition: cArray.h:581
TYPE * get_DataWork() const
Definition: cArray.h:682
CArray< TYPE, ARG_TYPE > SUPER_t
Definition: cArray.h:442
const TYPE & GetAtSecure(ITERATE_t nIndex) const
Definition: cArray.h:521
bool isArraySorted() const
Definition: cArray.h:732
void QSort(ITERATE_t iLeft, ITERATE_t iRight)
Definition: cArray.h:789
ITERATE_t const_iterator
Definition: cArray.h:446
void Swap(ITERATE_t i, ITERATE_t j)
Definition: cArray.h:591
TYPE ELEM_t
What type is stored.
Definition: cArray.h:448
ELEM_t PopHead()
Definition: cArray.h:635
cArrayVal()
Definition: cArray.h:919
cArrayVal(ITERATE_t iSize)
Definition: cArray.h:922
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
void __cdecl CopyElements(TYPE *pDest, const TYPE *pSrc, ITERATE_t nCount)
Definition: cArray.h:72
void __cdecl DestructElements(TYPE *pElements, ITERATE_t nCount)
Definition: cArray.h:53
void __cdecl ConstructElements(TYPE *pElements, ITERATE_t nCount)
Definition: cArray.h:31
void __cdecl CopyElements< BYTE >(BYTE *pDest, const BYTE *pSrc, ITERATE_t nCount)
Definition: cArray.h:89
int ITERATE_t
like size_t but signed
Definition: Index.h:28
const ITERATE_t k_ITERATE_BAD
Definition: Index.h:30
@ COMPARE_Equal
VARCMP_EQ.
Definition: cValT.h:23
uint16 index
Definition: sample3.cpp:29
Definition: cDebugAssert.h:29
static void *__stdcall ReAllocPtr(void *pData, size_t nSize)
Definition: cHeap.cpp:158
static void *__stdcall AllocPtr(size_t nSize)
Definition: cHeap.cpp:125
static void __stdcall FreePtr(void *pData)
Definition: cHeap.cpp:103
static size_t __stdcall GetSize(const void *pData) noexcept
Definition: cHeap.cpp:226
@ FILL_Alloc
filled to indicate malloc() memory in debug mode.
Definition: cHeap.h:33
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132
static bool __stdcall IsValid(const void *pData, size_t nSize=1, bool bWriteAccess=false) noexcept
Definition: cMem.cpp:33
static bool IsCorrupt(const void *pData, size_t nSize=1, bool bWriteAccess=false) noexcept
Definition: cMem.h:57
static void CopyOverlap(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:139
static COMPARE_t Compare(const void *p1, const void *p2, size_t nSizeBlock) noexcept
Definition: cMem.h:78
static void Swap(void *pvMem1, void *pvMem2, size_t nBlockSize) noexcept
Definition: cMem.h:213