Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cArraySortRef.h
Go to the documentation of this file.
1 //
5 
6 #ifndef _INC_cArraySortRef_H
7 #define _INC_cArraySortRef_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cArraySort.h"
13 #include "cArrayRef.h"
14 
15 namespace Gray
16 {
17  template<class TYPE, typename TYPE_KEY>
18  class cArraySortRef : public cArraySortFacade < cRefPtr<TYPE>, TYPE*, TYPE_KEY >
19  {
25 
26  typedef cArraySortFacade< cRefPtr<TYPE>, TYPE*, TYPE_KEY > SUPER_t;
27 
28  public:
29 
30  void DisposeAll()
31  {
35 
36  ITERATE_t iSize = this->GetSize();
37  if (iSize > 0)
38  {
39  { // save original list, call DisposeThis on everything from original list
40  cArrayRef<TYPE> orig;
41  orig.SetCopy(*this);
42 
43  ASSERT(orig.GetSize() == iSize);
44  for (ITERATE_t i = 0; i < iSize; i++)
45  {
46  TYPE* pObj = orig.GetAt(i);
47  if (pObj != nullptr)
48  pObj->DisposeThis();
49  }
50  }
51  this->RemoveAll();
52  }
53  }
54  };
55 
56  //*************************************************
57 
58  template <class TYPE, typename _TYPE_HASH = HASHCODE_t>
59  class cArraySortHash : public cArraySortRef < TYPE, _TYPE_HASH >
60  {
65 
66  public:
68  typedef typename SUPER_t::REF_t REF_t;
69  typedef typename SUPER_t::KEY_t KEY_t;
70 
71  protected:
72  virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
73  {
75  ASSERT_N(pData1 != nullptr);
76  ASSERT_N(pData2 != nullptr);
77  KEY_t key1 = pData1->get_HashCode();
78  KEY_t key2 = pData2->get_HashCode();
79  return cValT::Compare(key1, key2);
80  }
81  virtual COMPARE_t CompareKey(KEY_t key1, REF_t pBase) const override
82  {
85  ASSERT_N(pBase != nullptr);
86  KEY_t key2 = pBase->get_HashCode();
87  return cValT::Compare(key1, key2);
88  }
89  public:
90  virtual ~cArraySortHash()
91  {}
92 
93  ITERATE_t FindIForAK(const TYPE* pBase) const
94  {
97  if (pBase == nullptr)
98  return k_ITERATE_BAD;
99  return this->FindIForKey(pBase->get_HashCode());
100  }
101  bool RemoveArgKey(TYPE* pBase)
102  {
103  if (pBase == nullptr)
104  return false;
105  return SUPER_t::RemoveArgKey(pBase, pBase->get_HashCode());
106  }
107  };
108 
109  //*************************************************
110 
111  template <class TYPE, typename TYPE_KEY = int>
112  class cArraySortValue : public cArraySortRef < TYPE, TYPE_KEY >
113  {
120 
121  public:
123  typedef typename SUPER_t::REF_t REF_t;
124  typedef typename SUPER_t::KEY_t KEY_t;
125 
126  protected:
127  virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
128  {
130  ASSERT(pData1 != nullptr);
131  ASSERT(pData2 != nullptr);
132  TYPE_KEY key1 = pData1->get_SortValue();
133  TYPE_KEY key2 = pData2->get_SortValue();
134  COMPARE_t iDiff = cValT::Compare(key1, key2);
135  if (iDiff == COMPARE_Equal) // allow duplicate get_SortValue() but NOT duplicate objects!
136  return cValT::Compare((INT_PTR)pData1, (INT_PTR)pData2);
137  return iDiff;
138  }
139  virtual COMPARE_t CompareKey(KEY_t key1, REF_t pBase) const override
140  {
141  if (pBase == nullptr)
142  return COMPARE_Greater;
143  TYPE_KEY key2 = pBase->get_SortValue();
144  return cValT::Compare(key1, key2);
145  }
146  public:
148  {}
149 
150  ITERATE_t FindIForAK(const TYPE* pBase) const
151  {
154  if (pBase == nullptr)
155  return k_ITERATE_BAD;
156  TYPE_KEY nKey = pBase->get_SortValue();
157  ITERATE_t i = this->FindIFirstForKey(nKey);
158  if (i < 0)
159  return k_ITERATE_BAD;
160  for (;; i++)
161  {
162  cRefPtr<TYPE> pBase2 = this->GetAtCheck(i);
163  if (pBase2 == nullptr) // pBase is not in the array!
164  break;
165  if (pBase2 == pBase) // since sorted values are allowed to duplicate.
166  return i;
167  }
168  // This probably shouldn't happen? pBase is not in the array!
169  return k_ITERATE_BAD; // FindIForAC(pBase); // just do a brute force search.
170  }
171  bool RemoveArgKey(TYPE* pBase)
172  {
173  ITERATE_t index = this->FindIForAK(pBase);
174  if (index < 0)
175  return false;
177  return true;
178  }
180  {
182  ASSERT(pBase != nullptr);
183  TYPE_KEY nKey = pBase->get_SortValue();
184  ITERATE_t i = this->FindILastForKey(nKey);
185  if (i < 0) // one of the same type is here?
186  {
187  return this->Add(pBase); // add new sorted by nKey.
188  }
189  // add to the end of the get_SortValue series.
190  this->InsertAt(++i, pBase);
191  return i;
192  }
193  };
194 
195  //*************************************************
196 
197  template <class TYPE, typename _TYPECH = GChar_t>
198  class cArraySortName : public cArraySortRef < TYPE, const _TYPECH* >
199  {
204 
205  public:
207  typedef typename SUPER_t::REF_t REF_t;
208  typedef typename SUPER_t::KEY_t KEY_t;
209 
210  protected:
211  virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
212  {
214  ASSERT_N(pData1 != nullptr);
215  ASSERT_N(pData2 != nullptr);
216  return StrT::CmpI<_TYPECH>(pData1->get_Name(), pData2->get_Name());
217  }
218  virtual COMPARE_t CompareKey(KEY_t key1, REF_t pObj) const override
219  {
220  ASSERT_N(key1 != nullptr);
221  ASSERT_N(pObj != nullptr);
222  return StrT::CmpI<_TYPECH>(key1, pObj->get_Name());
223  }
224  public:
225  virtual ~cArraySortName()
226  {}
227 
228  ITERATE_t FindIForAK(const TYPE* pBase) const
229  {
233  if (pBase == nullptr)
234  return k_ITERATE_BAD;
235  return this->FindIForKey(pBase->get_Name());
236  }
237  bool RemoveArgKey(TYPE* pBase)
238  {
239  if (pBase == nullptr)
240  return false;
241  return SUPER_t::RemoveArgKey(pBase, pBase->get_Name());
242  }
243  };
244 }
245 #endif // _INC_cArraySortRef_H
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define ASSERT_N(exp)
Definition: cDebugAssert.h:70
void RemoveAll()
Clean up.
Definition: cArray.h:230
void InsertAt(ITERATE_t nIndex, ARG_TYPE newElement)
Definition: cArray.h:341
ITERATE_t GetSize() const noexcept
Definition: cArray.h:137
void RemoveAt(ITERATE_t nIndex)
Definition: cArray.h:367
REF_t GetAt(ITERATE_t index) const
Definition: cArray.h:830
Definition: cArrayRef.h:21
Definition: cArraySort.h:406
SUPER_t::REF_t REF_t
Definition: cArraySort.h:414
REF_t GetAtCheck(ITERATE_t nIndex) const
Definition: cArraySort.h:445
Definition: cArraySortRef.h:60
SUPER_t::KEY_t KEY_t
Definition: cArraySortRef.h:69
ITERATE_t FindIForAK(const TYPE *pBase) const
Definition: cArraySortRef.h:93
virtual COMPARE_t CompareKey(KEY_t key1, REF_t pBase) const override
Definition: cArraySortRef.h:81
SUPER_t::REF_t REF_t
Definition: cArraySortRef.h:68
virtual ~cArraySortHash()
Definition: cArraySortRef.h:90
bool RemoveArgKey(TYPE *pBase)
Definition: cArraySortRef.h:101
cArraySortRef< TYPE, _TYPE_HASH > SUPER_t
Definition: cArraySortRef.h:67
virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
Definition: cArraySortRef.h:72
Definition: cArraySortRef.h:199
SUPER_t::KEY_t KEY_t
Definition: cArraySortRef.h:208
SUPER_t::REF_t REF_t
Definition: cArraySortRef.h:207
virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
Definition: cArraySortRef.h:211
virtual COMPARE_t CompareKey(KEY_t key1, REF_t pObj) const override
Definition: cArraySortRef.h:218
cArraySortRef< TYPE, const _TYPECH * > SUPER_t
Definition: cArraySortRef.h:206
bool RemoveArgKey(TYPE *pBase)
Definition: cArraySortRef.h:237
virtual ~cArraySortName()
Definition: cArraySortRef.h:225
ITERATE_t FindIForAK(const TYPE *pBase) const
Definition: cArraySortRef.h:228
Definition: cArraySortRef.h:19
void DisposeAll()
Definition: cArraySortRef.h:30
Definition: cArraySortRef.h:113
SUPER_t::REF_t REF_t
Definition: cArraySortRef.h:123
ITERATE_t FindIForAK(const TYPE *pBase) const
Definition: cArraySortRef.h:150
virtual COMPARE_t CompareData(REF_t pData1, REF_t pData2) const noexcept override
Definition: cArraySortRef.h:127
SUPER_t::KEY_t KEY_t
Definition: cArraySortRef.h:124
ITERATE_t AddAfter(TYPE *pBase)
Definition: cArraySortRef.h:179
virtual COMPARE_t CompareKey(KEY_t key1, REF_t pBase) const override
Definition: cArraySortRef.h:139
bool RemoveArgKey(TYPE *pBase)
Definition: cArraySortRef.h:171
virtual ~cArraySortValue()
Definition: cArraySortRef.h:147
cArraySortRef< TYPE, TYPE_KEY > SUPER_t
Definition: cArraySortRef.h:122
ITERATE_t FindIForKey(KEY_t key) const
Definition: cArraySort.h:68
SUPER_t::REF_t REF_t
Definition: cArraySort.h:33
ITERATE_t FindIFirstForKey(TYPE nKey) const
Definition: cArraySort.h:79
ITERATE_t FindILastForKey(TYPE nKey) const
Definition: cArraySort.h:96
bool RemoveArgKey(REF_t pObj, KEY_t key)
Definition: cArraySort.h:44
ITERATE_t Add(TYPE pNew)
Definition: cArraySort.h:186
TYPE_KEY KEY_t
Definition: cArraySort.h:32
void SetCopy(const cArrayTyped< TYPE, ARG_TYPE > &aValues)
Definition: cArray.h:598
< 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
int ITERATE_t
like size_t but signed
Definition: Index.h:28
const ITERATE_t k_ITERATE_BAD
Definition: Index.h:30
@ COMPARE_Greater
VARCMP_GT.
Definition: cValT.h:24
@ COMPARE_Equal
VARCMP_EQ.
Definition: cValT.h:23
uint16 index
Definition: sample3.cpp:29
static COMPARE_t Compare(const TYPE &a, const TYPE &b) noexcept
Definition: cValT.h:46