Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cPair.h
Go to the documentation of this file.
1 //
5 //
6 
7 #ifndef _INC_cPair_H
8 #define _INC_cPair_H
9 #ifndef NO_PRAGMA_ONCE
10 #pragma once
11 #endif
12 
13 #include "cMem.h"
14 #include "cDebugAssert.h"
15 
16 namespace Gray
17 {
18  template<typename TYPE>
19  class cRangeT
20  {
25  typedef cRangeT<TYPE> THIS_t;
26 
27  public:
30  public:
31  TYPE get_Min() const
32  {
33  return m_Lo;
34  }
35  TYPE get_Max() const
36  {
37  return m_Hi;
38  }
39  TYPE get_Avg() const
40  {
41  return (m_Lo + m_Hi) / 2;
42  }
43  TYPE GetClampValue(TYPE nVal) const
44  {
45  // assume normalized.
46  if (nVal < m_Lo)
47  return m_Lo;
48  if (nVal > m_Hi)
49  return m_Hi;
50  return nVal;
51  }
52  bool IsInsideI(TYPE nVal) const
53  {
55  // assume normalized.
56  return nVal >= m_Lo && nVal <= m_Hi;
57  }
58  bool IsInsideX(TYPE nVal) const
59  {
62  // assume normalized.
63  return nVal >= m_Lo && nVal < m_Hi;
64  }
65 
66  TYPE get_RangeI() const
67  {
69  // assume normalized.
70  return (m_Hi - m_Lo) + 1; // inclusive. integer
71  }
72  TYPE get_RangeX() const
73  {
75  // assume normalized.
76  return m_Hi - m_Lo; // exclusive.
77  }
78 
79  TYPE GetLinear1(float fOne) const
80  {
82  return (TYPE)(m_Lo + (fOne * get_RangeI()));
83  }
84  int GetSpinValueI(int iVal) const
85  {
87  iVal -= (int)m_Lo;
88  int iRange = (int)get_RangeI();
89  iVal %= iRange;
90  if (iVal < 0)
91  iVal += (int)(m_Hi + 1);
92  else
93  iVal += (int)(m_Lo);
94 #ifdef _DEBUG
95  TYPE iValClamp = (TYPE)GetClampValue((TYPE)iVal);
96  ASSERT(iVal == iValClamp);
97 #endif
98  return iVal;
99  }
100 
101  // Setters.
102  void SetZero()
103  {
104  m_Hi = m_Lo = 0;
105  }
106  void put_Min(TYPE iLo)
107  {
108  m_Lo = iLo;
109  }
110  void put_Max(TYPE iHi)
111  {
112  m_Hi = iHi;
113  }
114  void SetRange(TYPE iLo, TYPE iHi)
115  {
117  m_Lo = iLo;
118  m_Hi = iHi;
119  }
121  {
122  if (m_Lo > m_Hi)
123  {
124  cValT::Swap<TYPE>(m_Lo, m_Hi);
125  }
126  }
127  void UnionValue(TYPE nVal)
128  {
130  if (nVal < m_Lo)
131  m_Lo = nVal;
132  if (nVal > m_Hi)
133  m_Hi = nVal;
134  }
135 
136  bool IsRangeOverlapI(const THIS_t& x) const
137  {
138  // Do 2 ranges (assume Normalized/proper ordered ranges) overlap ?
139  if (x.m_Lo > m_Hi)
140  return false;
141  if (x.m_Hi < m_Lo)
142  return false;
143  return true;
144  }
145  void SetUnionRange(const THIS_t& x)
146  {
147  // assume Normalized/proper ordered ranges
148  if (x.m_Hi > m_Hi)
149  {
150  m_Hi = x.m_Hi;
151  }
152  if (x.m_Lo < m_Lo)
153  {
154  m_Lo = x.m_Lo;
155  }
156  }
157  };
158 
159  template< class _TYPE_A, class _TYPE_B >
160  class cPairT
161  {
167 
168  public:
169  _TYPE_A m_a;
170  _TYPE_B m_b;
171 
172  public:
173  _TYPE_A get_A() const noexcept
174  {
175  return this->m_a; // Key
176  }
177  _TYPE_B get_B() const noexcept
178  {
179  return this->m_b; // Value
180  }
181  _TYPE_A get_HashCode() const noexcept
182  {
184  return m_a;
185  }
186 
187  void put_A(_TYPE_A a) noexcept
188  {
189  m_a = a;
190  }
191  void put_B(_TYPE_B b) noexcept
192  {
193  m_b = b;
194  }
195  };
196 
197  template< class _TYPE_A, class _TYPE_ARG_A, class _TYPE_B, class _TYPE_ARG_B >
198  class cPairX : public cPairT < _TYPE_A, _TYPE_B >
199  {
207 
209 
210  public:
211  cPairX() noexcept // Undefined values for dynamic arrays.
212  {}
213  cPairX(_TYPE_ARG_A a, _TYPE_ARG_B b) noexcept
214  {
215  this->m_a = a;
216  this->m_b = b;
217  }
218 
219  void SetValues(_TYPE_ARG_A a, _TYPE_ARG_B b) noexcept
220  {
221  this->m_a = a;
222  this->m_b = b;
223  }
224  _TYPE_ARG_A get_HashCode() const noexcept
225  {
227  return this->m_a;
228  }
229  const _TYPE_A& get_A() const noexcept
230  {
231  return this->m_a;
232  }
233  void put_A(_TYPE_ARG_A a) noexcept
234  {
235  this->m_a = a;
236  }
237  const _TYPE_A& get_B() const noexcept
238  {
239  return this->m_b;
240  }
241  void put_B(_TYPE_ARG_B b) noexcept
242  {
243  this->m_b = b;
244  }
245  };
246 
247  template< class _TYPE_A, class _TYPE_B >
248  class cPair : public cPairT < _TYPE_A, _TYPE_B >
249  {
252 
254 
255  public:
256  cPair() noexcept // Undefined values for dynamic arrays.
257  {}
258  cPair(_TYPE_A a, _TYPE_B b) noexcept
259  {
260  this->m_a = a;
261  this->m_b = b;
262  }
263 
264  // If element is a member of a static array.
265 
266  bool IsValidIndex(ITERATE_t i) const noexcept
267  {
270  if (i < 0)
271  return false;
272  return this[i].m_a || this[i].m_b;
273  }
274 
275  ITERATE_t FindIA(_TYPE_A a) const noexcept
276  {
279  for (ITERATE_t i = 0; IsValidIndex(i); i++)
280  {
281  if (this[i].m_a == a)
282  return i;
283  }
284  return k_ITERATE_BAD;
285  }
286  ITERATE_t FindIB(_TYPE_B b) const noexcept
287  {
291  for (ITERATE_t i = 0; IsValidIndex(i); i++)
292  {
293  if (this[i].m_b == b)
294  return i;
295  }
296  return k_ITERATE_BAD;
297  }
298 
299  bool FindARetB(_TYPE_A a, _TYPE_B* pb) const noexcept
300  {
304  ITERATE_t i = FindIA(a);
305  if (i >= 0)
306  {
307  *pb = this[i].m_b;
308  return true;
309  }
310  return false;
311  }
312  bool FindBRetA(_TYPE_B b, _TYPE_A* pa) const noexcept
313  {
316  ITERATE_t i = FindIB(b);
317  if (i >= 0)
318  {
319  *pa = this[i].m_a;
320  return true;
321  }
322  return false;
323  }
324 
325  _TYPE_B FindSortedARetB(_TYPE_A a) const noexcept
326  {
330  ITERATE_t i = 0;
331  for (; IsValidIndex(i); i++)
332  {
333  if (a < this[i + 1].m_a)
334  return(this[i].m_b);
335  }
336  return(this[i - 1].m_b);
337  }
338  };
339 };
340 #endif // _INC_cPair_H
#define TYPE
Definition: StrT.cpp:38
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cPair.h:161
void put_B(_TYPE_B b) noexcept
Definition: cPair.h:191
_TYPE_A get_HashCode() const noexcept
Definition: cPair.h:181
void put_A(_TYPE_A a) noexcept
Definition: cPair.h:187
_TYPE_A m_a
nullptr or 0 = last in array. (typically sorted by A as primary key)
Definition: cPair.h:169
_TYPE_B get_B() const noexcept
Definition: cPair.h:177
_TYPE_B m_b
nullptr or 0 = last in array.
Definition: cPair.h:170
_TYPE_A get_A() const noexcept
Definition: cPair.h:173
Definition: cPair.h:199
cPairX(_TYPE_ARG_A a, _TYPE_ARG_B b) noexcept
Definition: cPair.h:213
const _TYPE_A & get_A() const noexcept
Definition: cPair.h:229
const _TYPE_A & get_B() const noexcept
Definition: cPair.h:237
void SetValues(_TYPE_ARG_A a, _TYPE_ARG_B b) noexcept
Definition: cPair.h:219
_TYPE_ARG_A get_HashCode() const noexcept
Definition: cPair.h:224
cPairX() noexcept
Definition: cPair.h:211
void put_B(_TYPE_ARG_B b) noexcept
Definition: cPair.h:241
void put_A(_TYPE_ARG_A a) noexcept
Definition: cPair.h:233
Definition: cPair.h:249
bool IsValidIndex(ITERATE_t i) const noexcept
Definition: cPair.h:266
bool FindBRetA(_TYPE_B b, _TYPE_A *pa) const noexcept
Definition: cPair.h:312
cPair() noexcept
Definition: cPair.h:256
ITERATE_t FindIA(_TYPE_A a) const noexcept
Definition: cPair.h:275
cPair(_TYPE_A a, _TYPE_B b) noexcept
Definition: cPair.h:258
ITERATE_t FindIB(_TYPE_B b) const noexcept
Definition: cPair.h:286
_TYPE_B FindSortedARetB(_TYPE_A a) const noexcept
Definition: cPair.h:325
bool FindARetB(_TYPE_A a, _TYPE_B *pb) const noexcept
Definition: cPair.h:299
Definition: cPair.h:20
bool IsRangeOverlapI(const THIS_t &x) const
Definition: cPair.h:136
TYPE get_Max() const
Definition: cPair.h:35
void put_Max(TYPE iHi)
Definition: cPair.h:110
void SetRange(TYPE iLo, TYPE iHi)
Definition: cPair.h:114
TYPE get_RangeX() const
Definition: cPair.h:72
void SetUnionRange(const THIS_t &x)
Definition: cPair.h:145
void UnionValue(TYPE nVal)
Definition: cPair.h:127
TYPE m_Hi
inclusive high side of range. int size = (hi-lo)+1, float size = hi-lo ?? weird.
Definition: cPair.h:29
void put_Min(TYPE iLo)
Definition: cPair.h:106
TYPE m_Lo
low range value.
Definition: cPair.h:28
TYPE get_Min() const
Definition: cPair.h:31
bool IsInsideX(TYPE nVal) const
Definition: cPair.h:58
TYPE GetClampValue(TYPE nVal) const
Definition: cPair.h:43
TYPE GetLinear1(float fOne) const
Definition: cPair.h:79
int GetSpinValueI(int iVal) const
Definition: cPair.h:84
void SetZero()
Definition: cPair.h:102
TYPE get_RangeI() const
Definition: cPair.h:66
bool IsInsideI(TYPE nVal) const
Definition: cPair.h:52
TYPE get_Avg() const
Definition: cPair.h:39
void NormalizeRange()
Definition: cPair.h:120
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
int ITERATE_t
like size_t but signed
Definition: Index.h:28
const ITERATE_t k_ITERATE_BAD
Definition: Index.h:30