PageRenderTime 53ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/include/jeVariant.h

#
C Header | 353 lines | 287 code | 36 blank | 30 comment | 10 complexity | a7597e3e327b29dfbe230098bb533f78 MD5 | raw file
  1. /*!
  2. @file jeClass.h
  3. @author Vladimir Gumenuk (BlackIce)
  4. @date 04/23/2009
  5. @brief Maintains jet variant type definition
  6. @par Licence
  7. The contents of this file are subject to the Jet3D Public License
  8. Version 1.02 (the "License"); you may not use this file except in
  9. compliance with the License. You may obtain a copy of the License at
  10. http://www.jet3d.com
  11. @par
  12. Software distributed under the License is distributed on an "AS IS"
  13. basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  14. the License for the specific language governing rights and limitations
  15. under the License.
  16. @par
  17. The Original Code is Jet3D, released December 12, 1999.
  18. Copyright (C) 1996-1999 Eclipse Entertainment, L.L.C. All Rights Reserved
  19. */
  20. #ifndef __jeVariant_h__
  21. #define __jeVariant_h__
  22. #pragma warning(disable:4267) // '=' : conversion from 'size_t' to 'DWORD', possible loss of data
  23. //////////////////////////////////////////////////////////////////////////
  24. // jeVariant
  25. enum _VariantType
  26. {
  27. VAR_EMPTY = 0,
  28. VAR_CHAR,
  29. VAR_BYTE,
  30. VAR_SHORT,
  31. VAR_WORD,
  32. VAR_INTEGER,
  33. VAR_UINT,
  34. VAR_LONG,
  35. VAR_DWORD,
  36. VAR_FLOAT,
  37. VAR_DOUBLE,
  38. VAR_STRING,
  39. VAR_BIN, // when applied to property declaration means static buffer declared as BYTE buf[SIZE];
  40. VAR_CLSUNKNOWN,
  41. VAR_VEC2D,
  42. VAR_VEC3D,
  43. VAR_XFORM,
  44. VAR_PLANE,
  45. VAR_BOOL,
  46. };
  47. typedef unsigned short VariantType;
  48. typedef struct jeVariant
  49. {
  50. VariantType vt; // variant type
  51. union
  52. {
  53. char cVal;
  54. BYTE bVal;
  55. short sVal;
  56. WORD wVal;
  57. int iVal;
  58. UINT uiVal;
  59. long lVal;
  60. DWORD dwVal;
  61. jeFloat fVal;
  62. double dVal;
  63. jeString strVal;
  64. LPBYTE binVal;
  65. IClassUnknown *punkVal;
  66. jeVec2d vec2D;
  67. jeVec3d vec3D;
  68. jeXForm3d xForm3D;
  69. jePlane Plane;
  70. bool bBool;
  71. };
  72. DWORD dwSize;
  73. } jeVariant;
  74. //////////////////////////////////////////////////////////////////////////
  75. // variant api
  76. inline void jeVariantInit( jeVariant *pv ) {
  77. pv->vt = VAR_EMPTY;
  78. pv->dwVal = 0;
  79. pv->dwSize = 0;
  80. }
  81. inline void jeVariantClear( jeVariant *pv ) {
  82. switch( pv->vt ) {
  83. case VAR_EMPTY: break;
  84. case VAR_CHAR:
  85. case VAR_BYTE:
  86. case VAR_SHORT:
  87. case VAR_WORD:
  88. case VAR_INTEGER:
  89. case VAR_UINT:
  90. case VAR_LONG:
  91. case VAR_DWORD:
  92. case VAR_VEC2D:
  93. case VAR_VEC3D:
  94. case VAR_XFORM:
  95. case VAR_PLANE:
  96. case VAR_BOOL:
  97. pv->dwVal = 0;
  98. break;
  99. case VAR_FLOAT:
  100. pv->fVal = 0.0f;
  101. break;
  102. case VAR_DOUBLE:
  103. pv->dVal = 0.0;
  104. break;
  105. case VAR_STRING:
  106. JE_RAM_FREE( pv->strVal );
  107. break;
  108. case VAR_BIN:
  109. JE_RAM_FREE( pv->binVal );
  110. break;
  111. case VAR_CLSUNKNOWN:
  112. pv->punkVal->Release();
  113. pv->punkVal = 0;
  114. break;
  115. }
  116. pv->vt = VAR_EMPTY;
  117. pv->dwSize = 0;
  118. }
  119. inline bool jeVariantCopy( jeVariant *pDst, const jeVariant *pSrc ) {
  120. if( pDst->vt != VAR_EMPTY )
  121. return false;
  122. pDst->dwSize = pSrc->dwSize;
  123. switch( pSrc->vt ) {
  124. case VAR_EMPTY: break;
  125. case VAR_CHAR: pDst->cVal = pSrc->cVal; break;
  126. case VAR_BYTE: pDst->bVal = pSrc->bVal; break;
  127. case VAR_SHORT: pDst->sVal = pSrc->sVal; break;
  128. case VAR_WORD: pDst->wVal = pSrc->wVal; break;
  129. case VAR_INTEGER: pDst->iVal = pSrc->iVal; break;
  130. case VAR_UINT: pDst->uiVal = pSrc->uiVal; break;
  131. case VAR_LONG: pDst->lVal = pSrc->lVal; break;
  132. case VAR_DWORD: pDst->dwVal = pSrc->dwVal; break;
  133. case VAR_FLOAT: pDst->fVal = pSrc->fVal; break;
  134. case VAR_DOUBLE: pDst->dVal = pSrc->dVal; break;
  135. case VAR_STRING:
  136. {
  137. if( !pSrc->dwSize )
  138. return false;
  139. pDst->strVal = (jeString)JE_RAM_ALLOCATE( pSrc->dwSize+1 );
  140. if( !pDst->strVal )
  141. return false;
  142. char *d = pDst->strVal;
  143. char *s = pSrc->strVal;
  144. while( *d++ = *s++ ) ;
  145. *d = 0;
  146. pDst->dwSize = pSrc->dwSize;
  147. }
  148. break;
  149. case VAR_BIN:
  150. {
  151. if( !pSrc->dwSize )
  152. return false;
  153. pDst->binVal = (LPBYTE)JE_RAM_ALLOCATE( pSrc->dwSize );
  154. if( !pDst->binVal )
  155. return false;
  156. for( dword i = 0; i < pSrc->dwSize; i++ )
  157. pDst->binVal[i] = pSrc->binVal[i];
  158. pDst->dwSize = pSrc->dwSize;
  159. }
  160. break;
  161. case VAR_CLSUNKNOWN:
  162. if( !pSrc->punkVal )
  163. return false;
  164. pDst->punkVal = pSrc->punkVal;
  165. pDst->punkVal->AddRef();
  166. break;
  167. case VAR_VEC2D:
  168. pDst->vec2D = pSrc->vec2D;
  169. break;
  170. case VAR_VEC3D:
  171. pDst->vec3D = pSrc->vec3D;
  172. break;
  173. case VAR_XFORM:
  174. pDst->xForm3D = pSrc->xForm3D;
  175. break;
  176. case VAR_PLANE:
  177. pDst->Plane = pSrc->Plane;
  178. break;
  179. case VAR_BOOL:
  180. pDst->bBool = pSrc->bBool;
  181. break;
  182. }
  183. pDst->vt = pSrc->vt;
  184. return true;
  185. }
  186. //////////////////////////////////////////////////////////////////////////
  187. // CVariant
  188. class CVariant : public jeVariant
  189. {
  190. public:
  191. CVariant() { jeVariantInit( this ); }
  192. ~CVariant() { jeVariantClear( this ); }
  193. CVariant( char c ) {
  194. vt = VAR_CHAR;
  195. cVal = c;
  196. dwSize = sizeof(char);
  197. }
  198. CVariant( BYTE b ) {
  199. vt = VAR_BYTE;
  200. bVal = b;
  201. dwSize = sizeof(BYTE);
  202. }
  203. CVariant( short s ) {
  204. vt = VAR_SHORT;
  205. sVal = s;
  206. dwSize = sizeof(short);
  207. }
  208. CVariant( WORD w ) {
  209. vt = VAR_WORD;
  210. wVal = w;
  211. dwSize = sizeof(WORD);
  212. }
  213. CVariant( int i ) {
  214. vt = VAR_INTEGER;
  215. iVal = i;
  216. dwSize = sizeof(int);
  217. }
  218. CVariant( UINT u ) {
  219. vt = VAR_UINT;
  220. uiVal = u;
  221. dwSize = sizeof(uint);
  222. }
  223. CVariant( long l ) {
  224. vt = VAR_LONG;
  225. lVal = l;
  226. dwSize = sizeof(long);
  227. }
  228. CVariant( DWORD dw ) {
  229. vt = VAR_DWORD;
  230. dwVal = dw;
  231. dwSize = sizeof(dword);
  232. }
  233. CVariant( float f ) {
  234. vt = VAR_FLOAT;
  235. fVal = f;
  236. dwSize = sizeof(float);
  237. }
  238. CVariant( double d ) {
  239. vt = VAR_DOUBLE;
  240. dVal = d;
  241. dwSize = sizeof(double);
  242. }
  243. CVariant( bool b ) {
  244. vt = VAR_BOOL;
  245. bBool = b;
  246. dwSize = sizeof(bool);
  247. }
  248. CVariant( const jeVec2d& v ) {
  249. vt = VAR_VEC2D;
  250. vec2D = v;
  251. dwSize = sizeof(jeVec2d);
  252. }
  253. CVariant( const jeVec3d& v ) {
  254. vt = VAR_VEC3D;
  255. vec3D = v;
  256. dwSize = sizeof(jeVec3d);
  257. }
  258. CVariant( const jeXForm3d& x ) {
  259. vt = VAR_XFORM;
  260. xForm3D = x;
  261. dwSize = sizeof(jeXForm3d);
  262. }
  263. CVariant( const jePlane& x ) {
  264. vt = VAR_PLANE;
  265. Plane = x;
  266. dwSize = sizeof(jePlane);
  267. }
  268. CVariant( jecString str ) {
  269. assert( str );
  270. vt = VAR_STRING;
  271. dwSize = strlen( str );
  272. strVal = (jeString)JE_RAM_ALLOCATE( dwSize + 1 );
  273. char *d = strVal;
  274. const char *s = str;
  275. while( *d++ = *s++ ) ;
  276. *d = 0;
  277. }
  278. CVariant( const LPBYTE pbin, DWORD dwSize ) {
  279. assert( pbin );
  280. assert( dwSize != 0 );
  281. vt = VAR_BIN;
  282. dwSize = dwSize;
  283. binVal = (LPBYTE)JE_RAM_ALLOCATE( dwSize );
  284. for( dword i = 0; i < dwSize; i++ )
  285. binVal[i] = pbin[i];
  286. }
  287. CVariant( IClassUnknown *punk ) {
  288. assert( punk );
  289. vt = VAR_CLSUNKNOWN;
  290. punkVal = punk;
  291. punkVal->AddRef();
  292. }
  293. CVariant( const jeVariant& v ) {
  294. jeVariantInit( this );
  295. jeVariantCopy( this, &v );
  296. }
  297. CVariant& operator= ( const CVariant& v ) {
  298. jeVariantClear( this );
  299. jeVariantCopy( this, &v );
  300. return (*this);
  301. }
  302. void clear() {
  303. jeVariantClear( this );
  304. }
  305. bool Detach( jeVariant& v ) {
  306. bool bRet = jeVariantCopy( &v, this );
  307. jeVariantClear( this );
  308. return bRet;
  309. }
  310. };
  311. //////////////////////////////////////////////////////////////////////////
  312. #pragma warning(default:4267)
  313. #endif // __jeVariant_h__