Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cVariant.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cVariant_H
7 #define _INC_cVariant_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cVariantData.h"
15 
16 #ifdef _WIN32
17 struct tagVARIANT;
18 typedef tagVARIANT VARIANT;
19 #endif
20 
21 namespace GrayLib
22 {
24 
26  {
34 
35  typedef cVariantData SUPER_t;
36  typedef cVariant THIS_t;
37 
38  public:
39  static const cVariant k_VarNULL;
40 
41  protected:
43 
44  protected:
45  // Helper functions.
46  void InitVar(const cVariant& vVar);
47  void InitVar(VARTYPE_TYPE eVarType, const void* pStr, size_t iLen);
48  void EmptyLast();
49 
50  const cStringA& ref_StrA() const;
51 
52  public:
53  cVariant() noexcept
54  : m_eVarType(VARTYPE_NoType)
55  {
56  // default = null.
57  }
58 
59  cVariant(const ATOMCHAR_t** ppArrayArgs, ITERATE_t iArgQty);
60  cVariant(const cVariantArray& aVals);
61  cVariant(const cVariantArrayT& aVals);
62  cVariant(const cAtomRef& atomVal);
63  cVariant(const cStringA& strAVal);
64  cVariant(const cStringW& strWVal);
65  cVariant(const char* pszVal);
66  cVariant(const wchar_t* pwsVal);
67  cVariant(const cTimeInt& timei);
68  cVariant(const cTimeDouble& timed);
69  cVariant(const GUID& guid);
70  cVariant(const cVarMap& rMap);
71  cVariant(cVariantMap* pMap);
72  cVariant(IXObject* pXObj);
73 
74  // Construct any basic type.
75 #define CTYPE_DEF(a,_TYPE,c,d,e,f,g,h) cVariant( _TYPE bVal );
77 #undef CTYPE_DEF
78 
79  cVariant(VARTYPE_TYPE eVarType, UINT32 uVal)
80  {
83  ASSERT(eVarType == VARTYPE_UID || eVarType == VARTYPE_Color || eVarType == VARTYPE_HResult || eVarType == VARTYPE_TimeInt);
84  InitVar(eVarType, &uVal, sizeof(uVal));
85  }
86  cVariant(VARTYPE_TYPE eVarType, UINT64 uVal)
87  {
90  InitVar(eVarType, &uVal, sizeof(uVal));
91  }
92  cVariant(VARTYPE_TYPE eVarType, const void* pvData, size_t nLen = 0)
93  {
96  InitVar(eVarType, pvData, nLen);
97  }
98  cVariant(const THIS_t& vVal)
99  {
100  InitVar(vVal);
101  }
102  cVariant(THIS_t&& ref) noexcept
103  {
105  m_eVarType = ref.m_eVarType;
106  m_u = ref.m_u; // memcpy()
107  ref.m_eVarType = VARTYPE_NoType; // Clear source.
108  }
109 
111  {
112  SetNoType(); // should just use EmptyLast() but clear type just to be safe.
113  }
114 
115  size_t GetHeapStats(OUT ITERATE_t& iAllocCount) const;
116 
117  VARTYPE_TYPE get_VarType() const noexcept
118  {
119  return m_eVarType;
120  }
121  const cVariantTypeDef& get_VarTypeDef() const noexcept
122  {
123  return GetVarTypeDef(m_eVarType);
124  }
125 
126  bool isNoType() const noexcept
127  {
129  return m_eVarType == VARTYPE_NoType ;
130  }
131  bool isVarTypeNumeric() const noexcept
132  {
133  return get_VarTypeDef().isNumeric();
134  }
135  bool isVarTypeFloat() const noexcept
136  {
137  return get_VarTypeDef().isFloat();
138  }
139  bool isVarTypeString() const noexcept
140  {
141  return get_VarTypeDef().isString();
142  }
143 
144  bool isNumSigned() const noexcept
145  {
146  return get_VarTypeDef().isNumSigned();
147  }
148  bool isStringA() const noexcept
149  {
150  return get_VarTypeDef().isStringA();
151  }
152  bool isStringW() const noexcept
153  {
154  return get_VarTypeDef().isStringW();
155  }
156  bool isTime() const noexcept
157  {
158  return get_VarTypeDef().isTime();
159  }
160 
161  bool isArray() const noexcept
162  {
164  return m_eVarType == VARTYPE_Array || m_eVarType == VARTYPE_ArrayT ;
165  }
166  bool isStringExp() const noexcept
167  {
169  return m_eVarType == VARTYPE_StringExp ;
170  }
171  bool isXObj() const noexcept
172  {
173  return IsXObj(m_eVarType) ;
174  }
175  bool isHResult() const noexcept
176  {
178  return m_eVarType == VARTYPE_HResult ;
179  }
180 
181  size_t get_DataSize() const;
182  const void* get_DataPtr() const;
183 
184  COMPARE_t Compare(const cVariant& vVar) const;
185  bool IsEqualTo(const THIS_t& vVar) const
186  {
187  return(!Compare(vVar));
188  }
189  bool operator == (const THIS_t& vVar) const
190  {
191  return(!Compare(vVar));
192  }
193  bool operator != (const THIS_t& vVar) const
194  {
195  return(Compare(vVar));
196  }
197 
198  bool isHResultError() const
199  {
200  if (!isHResult())
201  return false;
202  return FAILED(m_u.m_HResult);
203  }
204  bool isEmptyVar() const;
205  bool isZeroVar() const;
206  void SetZeroVar(VARTYPE_TYPE eVarType = VARTYPE_NoType);
207 
208  void SetNoType()
209  {
210  EmptyLast();
211  m_eVarType = VARTYPE_NoType;
212  }
213  void SetClear()
214  {
215  SetNoType();
216  }
217 
218  void put_Var(const cVariant& vVar);
219  void SetVarData(VARTYPE_TYPE eVarType, const void* pData, size_t iLen);
220  bool SetVarType(VARTYPE_TYPE eVarType, const cVariant& vVal);
221 
222  // define getters and setters.
223 #define VARIANT_DEF(a,b,c) b get_##a() const; \
224  void put_##a( c x );
225 
226  VARIANT_DEF(StrCA, const char*, const char*);
227  VARIANT_DEF(StrCW, const wchar_t*, const wchar_t*);
228  VARIANT_DEF(StrC, const GChar_t*, const GChar_t*); // TCHAR GChar_t
229  VARIANT_DEF(Atom, cAtomRef, cAtomRef);
230  VARIANT_DEF(Str, cString, cString); // TCHAR GChar_t
231  VARIANT_DEF(StrA, cStringA, cStringA);
232  VARIANT_DEF(StrW, cStringW, cStringW);
233  VARIANT_DEF(StrExp, cStringA, cStringA);
234  VARIANT_DEF(TimeDouble, double, double);
235  VARIANT_DEF(TimeInt, TIMESEC_t, TIMESEC_t);
236  VARIANT_DEF(CYS, CYS_t, CYS_t);
237  VARIANT_DEF(CY, CY_t, CY_t);
238  VARIANT_DEF(UID, UID_t, UID_t);
239  VARIANT_DEF(HResult, HRESULT, HRESULT);
240  VARIANT_DEF(Color, COLORREF, COLORREF);
241  VARIANT_DEF(Vector3, cVariantVector3<float>, const float*); // TODO: rename this Vector3f ??
242  // put_Map, get_Map ??
243 
244 #define CTYPE_DEF(a,_TYPE,c,d,e,f,g,h) _TYPE get_##a() const; \
245  void put_##a( _TYPE x );
247 #undef CTYPE_DEF
248 
249 #undef VARIANT_DEF
250 
251  inline void put_Int(int nVal)
252  {
253  put_Int32(nVal);
254  }
255  inline int get_Int() const
256  {
257  return get_Int32();
258  }
259 
260 #ifdef USE_LONG_AS_INT64
261  void put_Long(signed long iVal );
262  signed long get_Long() const;
263  void put_ULong( unsigned long uVal );
264  unsigned long get_ULong() const;
265 #endif
266 
267  template<typename _TYPE_CH>
268  inline cStringT<_TYPE_CH> get_StrT() const;
269 
270  void put_UID(const IXObject* pXObj);
271  void put_Array(const cVariantArray& aVars);
272  void put_ArrayT(const cVariantArrayT& aVals);
273  void put_Vector3(float x, float y, float z);
274  IXObject* get_XObj() const;
275  void put_XObj(IXObject* pXObj);
276 
277  void SetTimeIntNow();
278  void SetTimeDoubleNow();
279 
280  void StrExpIgnore();
281  void SetVarTypeSimplest(bool bKeepFloat );
282 
283  HRESULT put_StrExpUnk(const ATOMCHAR_t* pStrExp);
284 #ifdef USE_EXPRESSION
287 #endif
288  StrLen_t GetStrExpUnk(ATOMCHAR_t* pszStr, StrLen_t iLenMax, bool bInArray = false) const
289  {
291  return SUPER_t::GetStrExpT(m_eVarType, pszStr, iLenMax, bInArray);
292  }
293 
294  CY_t GetCY(bool bAssumeNaked = false, CY_t uValMul = k_CYMul) const;
295 
296  void SetBlobData(const void* pData, size_t nSize, VARTYPE_TYPE eVarType = VARTYPE_Blob); // or VARTYPE_GUID
297  void put_Blob(const cHeapBlock& b, VARTYPE_TYPE eVarType = VARTYPE_Blob)
298  {
299  SetBlobData(b.get_Data(), b.get_DataSize(), eVarType);
300  }
301  size_t GetBlobData(void* pData, size_t nSizeMax) const;
302  size_t SetBlobStr(VARTYPE_TYPE eVarType, const ATOMCHAR_t* pszStr);
303  cHeapBlock& MakeRefBlob(VARTYPE_TYPE eVarType);
304 
305 #define VARIANT_OP(a,b,c) operator b() const { return( get_##a()); } \
306  const THIS_t& operator=( c x ) { put_##a( x ); return *this; }
307 
308  VARIANT_OP(StrCA, const char*, const char*);
309  VARIANT_OP(StrCW, const wchar_t*, const wchar_t*);
311  VARIANT_OP(StrW, cStringW, const cStringW&);
312 
313 #define CTYPE_DEF(a,_TYPE,c,d,e,f,g,h) VARIANT_OP(a,_TYPE,_TYPE)
315 #undef CTYPE_DEF
316 
317 #undef VARIANT_OP
318 
319  const THIS_t& operator=(const THIS_t& vVal)
320  {
321  put_Var(vVal);
322  return *this;
323  }
324 
325  void SetMove(THIS_t& ref)
326  {
327  m_eVarType = ref.m_eVarType;
328  m_u = ref.m_u; // ::memcpy()
330  }
331 
332  THIS_t& operator = (THIS_t&& ref)
333  {
335  SetMove(ref);
336  return *this;
337  }
338 
340  void put_Map(cVariantMap* pMap);
341  const cVariant& GetMapVar(const ATOMCHAR_t* pszName) const;
342  cVariantMapPtr MakeMap();
343  cVariant& MakeMapVar(const ATOMCHAR_t* pszName);
344  HRESULT SetMapVar(const ATOMCHAR_t* pszName, const cVariant& vSet);
345  const THIS_t& operator[](const ATOMCHAR_t* pszName) const
346  {
347  return GetMapVar(pszName);
348  }
349  THIS_t& operator[](const ATOMCHAR_t* pszName)
350  {
351  return MakeMapVar(pszName);
352  }
353 
355  ITERATE_t get_ArraySize() const;
356  ITERATE_t MakeArraySize(bool bBreakQuotes = false);
357  THIS_t& MakeArrayElement(ITERATE_t index = k_ITERATE_BAD);
358  cVariantArray& MakeArray();
359 
360  bool IsArrayChild(const cVariant& vVal) const;
361  ITERATE_t SetArray(const ATOMCHAR_t** ppArgs, ITERATE_t iArgQty, ITERATE_t nQtyAppend = 0);
362  ITERATE_t SetArrayParse(const ATOMCHAR_t* pszStr);
363 
364  void RemoveArrayElement(ITERATE_t index, ITERATE_t iQty = 1);
365  bool InsertArrayElement(ITERATE_t index, const cVariant& vVal);
366  double get_ArrayRangeDouble() const;
367 
369  ITERATE_t AppendArray(cVariant& vValArray ); // Parse also !
370 
371  const THIS_t& GetArrayElement(ITERATE_t index) const;
373  {
374  return GetArrayElement(index);
375  }
376 
377  bool SetArrayElement(ITERATE_t index, const cVariant& vVal);
378  void AddArrayElement(const THIS_t& vVal)
379  {
380  MakeArrayElement(k_ITERATE_BAD).put_Var(vVal);
381  }
383  {
384  return MakeArrayElement(index);
385  }
386 
387 #if 1
388 
389  // _TYPE GetArray##_NAME( ITERATE_t index ) const { return( GetArrayElement(index).get_##_NAME()); }
390 
391 #define VARIANT_ARRAY_TYPE(_NAME,_TYPE) \
392  void SetArray##_NAME( ITERATE_t index, _TYPE Val ) { MakeArrayElement(index).put_##_NAME(Val); } \
393  void AddArray##_NAME( _TYPE Val ) { MakeArrayElement(k_ITERATE_BAD).put_##_NAME(Val); }
394 
395  VARIANT_ARRAY_TYPE(StrCA, const char*)
396  VARIANT_ARRAY_TYPE(StrCW, const wchar_t*)
405  VARIANT_ARRAY_TYPE(Vector3, const float*)
408 
409 #define CTYPE_DEF(a,_TYPE,c,d,e,f,g,h) VARIANT_ARRAY_TYPE(a,_TYPE)
411 #undef CTYPE_DEF
412 
413 #undef VARIANT_ARRAY_TYPE
414 #endif
415 
416  void AddArrayUID(const IXObject* pObj)
417  {
418  MakeArrayElement(k_ITERATE_BAD).put_UID(pObj);
419  }
420 
422  HRESULT SerializeOutput(cStreamOutput& file) const;
423  HRESULT SerializeInputType(cStreamInput& file, VARTYPE_TYPE eVarType);
424  HRESULT SerializeInput(cStreamInput& file);
425  HRESULT Serialize(cArchive& a);
426 
427  static bool GRAYCALL v_Var2Strings(cArrayStringA& a, cVariant& vVal);
428  static void GRAYCALL v_Strings2Var(cVariant& vVal, const cArrayStringA& a);
429 
430 #ifdef _WIN32
432  static HRESULT GRAYCALL CvtWin2Var(const VARIANT& src, cVariant& dst);
433  static HRESULT GRAYCALL CvtVar2Win(const cVariant& src, VARIANT& dst);
434  HRESULT put_VARIANT(const VARIANT& var);
435  HRESULT get_VARIANT(VARIANT& var);
436 #endif
437 
439  };
440 
441  template<> inline cStringT<char> cVariant::get_StrT<char>() const
442  {
443  return get_StrA();
444  }
445  template<> inline cStringT<wchar_t> cVariant::get_StrT<wchar_t>() const
446  {
447  return get_StrW();
448  }
449 };
450 #endif // _INC_cVariant_H
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define FAILED(x)
Definition: HResult.h:30
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
UINT32 COLORREF
ABGR (high to low bits)
Definition: cVariantData.h:21
#define VARIANT_DEF(a, b, c)
Definition: cVariant.h:223
#define VARIANT_OP(a, b, c)
Definition: cVariant.h:305
#define VARIANT_ARRAY_TYPE(_NAME, _TYPE)
Definition: cVariant.h:391
Definition: cVarMap.h:109
Definition: cVariantData.h:80
Definition: cVariantData.h:56
Definition: cVariantData.h:145
union GrayLib::cVariantData::@61 m_u
Definition: cVarMap.h:248
Definition: cVariantType.h:46
Definition: cVariant.h:26
static const cVariant k_VarNULL
VARTYPE_NoType isNoType()
Definition: cVariant.h:39
StrLen_t GetStrExpUnk(ATOMCHAR_t *pszStr, StrLen_t iLenMax, bool bInArray=false) const
Definition: cVariant.h:288
THIS_t & operator[](const ATOMCHAR_t *pszName)
Definition: cVariant.h:349
cStringT< _TYPE_CH > get_StrT() const
bool isHResult() const noexcept
Definition: cVariant.h:175
void SetMove(THIS_t &ref)
Definition: cVariant.h:325
bool isArray() const noexcept
Definition: cVariant.h:161
bool isTime() const noexcept
a time stamp?
Definition: cVariant.h:156
cStringW get_StrW() const
Definition: cVariantStr.cpp:203
cVariant get_VarExpEval() const
bool isVarTypeFloat() const noexcept
Definition: cVariant.h:135
THIS_t & operator[](ITERATE_t index)
Definition: cVariant.h:382
void AddArrayUID(const IXObject *pObj)
Definition: cVariant.h:416
bool isNoType() const noexcept
Definition: cVariant.h:126
void AddArrayElement(const THIS_t &vVal)
Definition: cVariant.h:378
bool isStringA() const noexcept
UTF8 format string. char*.
Definition: cVariant.h:148
const cVariantTypeDef & get_VarTypeDef() const noexcept
Definition: cVariant.h:121
cVariant(THIS_t &&ref) noexcept
Definition: cVariant.h:102
UNITTEST_FRIEND(cVariant)
bool isVarTypeNumeric() const noexcept
Definition: cVariant.h:131
bool isNumSigned() const noexcept
Definition: cVariant.h:144
VARTYPE_TYPE get_VarType() const noexcept
Definition: cVariant.h:117
cVariant() noexcept
Definition: cVariant.h:53
int get_Int() const
Definition: cVariant.h:255
cStringA get_StrA() const
Definition: cVariantStr.cpp:153
bool isXObj() const noexcept
Definition: cVariant.h:171
void put_Int(int nVal)
Definition: cVariant.h:251
cVariant(VARTYPE_TYPE eVarType, UINT32 uVal)
Definition: cVariant.h:79
~cVariant()
Definition: cVariant.h:110
bool isHResultError() const
Definition: cVariant.h:198
const THIS_t & operator[](const ATOMCHAR_t *pszName) const
Definition: cVariant.h:345
cVariant(VARTYPE_TYPE eVarType, const void *pvData, size_t nLen=0)
Definition: cVariant.h:92
bool isStringExp() const noexcept
Definition: cVariant.h:166
const THIS_t & operator[](ITERATE_t index) const
Definition: cVariant.h:372
void SetNoType()
empty example of the type.
Definition: cVariant.h:208
const THIS_t & operator=(const THIS_t &vVal)
Definition: cVariant.h:319
cVariant(const THIS_t &vVal)
Definition: cVariant.h:98
bool isVarTypeString() const noexcept
Definition: cVariant.h:139
void SetClear()
Definition: cVariant.h:213
HRESULT put_StrExpEval(const ATOMCHAR_t *pStrExp)
cVariant(VARTYPE_TYPE eVarType, UINT64 uVal)
Definition: cVariant.h:86
bool isStringW() const noexcept
UNICODE format string. wchar_t*.
Definition: cVariant.h:152
bool IsEqualTo(const THIS_t &vVar) const
Definition: cVariant.h:185
void put_Blob(const cHeapBlock &b, VARTYPE_TYPE eVarType=VARTYPE_Blob)
Definition: cVariant.h:297
VARTYPE_TYPE m_eVarType
type for cVariantData. VT_NULL or VARTYPE (for COM). really held in a single BYTE
Definition: cVariant.h:42
Definition: cArchive.h:20
Definition: cAtom.h:63
Definition: cHeap.h:156
void * get_Data() const noexcept
Definition: cHeap.h:363
size_t get_DataSize() const noexcept
Definition: cMem.h:344
Definition: cRefPtr.h:225
Definition: cStream.h:306
Definition: cStream.h:126
Definition: cTimeDouble.h:21
< similar to the MFC CTime and cTimeSpan, not as accurate or large ranged as COleDateTime
Definition: cTimeInt.h:101
Definition: IXObject.h:46
Definition: cMesh.h:22
VARTYPE_TYPE
< define types of structure/record elements. (COM uses VARTYPE=VARENUM for this) stored as BYTE
Definition: cVariantType.h:19
@ VARTYPE_NoType
Definition: cVariantType.h:24
UNITTEST2_PREDEF(cQuadtree)
class __DECL_IMPORT cVariant
Definition: cJSONWriter.h:19
HASHCODE32_t UID_t
Sort of the same as a HASHCODE_t. not the same as UIDINDEX_t.
Definition: cUID.h:18
int COMPARE_t
result of compare. 0=same, 1=a>b, -1=a<b
Definition: cValT.h:17
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
template class GRAYCORE_LINK cStringT< wchar_t >
Definition: cString.cpp:652
int ITERATE_t
like size_t but signed
Definition: Index.h:28
cStringT< wchar_t > cStringW
Definition: cString.h:634
cStringT< char > cStringA
Definition: cString.h:635
time_t TIMESEC_t
absolute seconds since January 1, 1970. (GMT?)(signed) NOTE: Changing to __time64_t just adds more ra...
Definition: cTimeUnits.h:23
char ATOMCHAR_t
the char form (UNICODE or not) for an atom. (for symbolic names)
Definition: StrConst.h:15
char GChar_t
My version of TCHAR, _TCHAR.
Definition: StrConst.h:26
const ITERATE_t k_ITERATE_BAD
Definition: Index.h:30
bool operator!=(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:254
bool operator==(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:250
cStringT< GChar_t > cString
Definition: cString.h:636
uint16 index
Definition: sample3.cpp:29
Definition: StrA.h:20
Definition: cDebugAssert.h:29
Definition: IUnknown.h:34