2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 * @file FUiVariant.cpp
19 * @brief This is the implementation file for Variant class.
23 #include <FUiVariant.h>
24 #include <FBaseErrors.h>
25 #include <FBaseDateTime.h>
26 #include <FBaseString.h>
27 #include <FBaseStringComparer.h>
28 #include <FGrpFloatMatrix4.h>
29 #include <FGrpRectangle.h>
30 #include <FGrpDimension.h>
31 #include <FGrpPoint.h>
32 #include <FGrpColor.h>
33 #include <FGrpFloatPoint.h>
34 #include <FGrpFloatRectangle.h>
35 #include <FGrpFloatDimension.h>
36 #include <FBaseSysLog.h>
37 #include "FUi_VariantImpl.h"
39 using namespace Tizen::Base;
40 using namespace Tizen::Graphics;
42 namespace Tizen { namespace Ui
45 const Variant Variant::NULL_VARIANT;
47 Variant::Variant(void)
48 : __pVariantImpl(null)
50 __pVariantImpl = new (std::nothrow) _VariantImpl;
51 if (__pVariantImpl == null)
53 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
57 Variant::~Variant(void)
61 __pVariantImpl->Release();
64 __pVariantImpl = null;
67 Variant::Variant(const Variant& value)
68 : __pVariantImpl(null)
70 SysAssertf(value.__pVariantImpl, "No data in rhs for copy ctor");
71 __pVariantImpl = value.__pVariantImpl;
72 __pVariantImpl->AddRef();
75 Variant::Variant(int value)
76 : __pVariantImpl(null)
78 __pVariantImpl = new (std::nothrow) _VariantImpl;
79 if (__pVariantImpl == null)
81 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
85 __pVariantImpl->__type = VARIANT_TYPE_INT;
86 __pVariantImpl->__data.valueInt = 0;
87 __pVariantImpl->__data.valueInt = value;
91 Variant::Variant(unsigned int value)
92 : __pVariantImpl(null)
94 __pVariantImpl = new (std::nothrow) _VariantImpl;
95 if (__pVariantImpl == null)
97 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
101 __pVariantImpl->__type = VARIANT_TYPE_UINT;
102 __pVariantImpl->__data.valueUInt = 0;
103 __pVariantImpl->__data.valueUInt = value;
107 Variant::Variant(bool value)
108 : __pVariantImpl(null)
110 __pVariantImpl = new (std::nothrow) _VariantImpl;
111 if (__pVariantImpl == null)
113 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
117 __pVariantImpl->__type = VARIANT_TYPE_BOOL;
118 __pVariantImpl->__data.valueBool = true;
119 __pVariantImpl->__data.valueBool = value;
123 Variant::Variant(float value)
124 : __pVariantImpl(null)
126 __pVariantImpl = new (std::nothrow) _VariantImpl;
127 if (__pVariantImpl == null)
129 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
133 __pVariantImpl->__type = VARIANT_TYPE_FLOAT;
134 __pVariantImpl->__data.valueFloat = 0;
135 __pVariantImpl->__data.valueFloat = value;
139 Variant::Variant(double value)
140 : __pVariantImpl(null)
142 __pVariantImpl = new (std::nothrow) _VariantImpl;
143 if (__pVariantImpl == null)
145 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
149 __pVariantImpl->__type = VARIANT_TYPE_DOUBLE;
150 __pVariantImpl->__data.valueDouble = 0;
151 __pVariantImpl->__data.valueDouble = value;
155 Variant::Variant(long value)
156 : __pVariantImpl(null)
158 __pVariantImpl = new (std::nothrow) _VariantImpl;
159 if (__pVariantImpl == null)
161 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
165 __pVariantImpl->__type = VARIANT_TYPE_LONG;
166 __pVariantImpl->__data.valueLong = 0;
167 __pVariantImpl->__data.valueLong = value;
171 Variant::Variant(unsigned long value)
172 : __pVariantImpl(null)
174 __pVariantImpl = new (std::nothrow) _VariantImpl;
175 if (__pVariantImpl == null)
177 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
181 __pVariantImpl->__type = VARIANT_TYPE_ULONG;
182 __pVariantImpl->__data.valueULong = 0;
183 __pVariantImpl->__data.valueULong = value;
187 Variant::Variant(long long value)
188 : __pVariantImpl(null)
190 __pVariantImpl = new (std::nothrow) _VariantImpl;
191 if (__pVariantImpl == null)
193 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
197 __pVariantImpl->__type = VARIANT_TYPE_LONGLONG;
198 __pVariantImpl->__data.valueLongLong = 0;
199 __pVariantImpl->__data.valueLongLong = value;
203 Variant::Variant(unsigned long long value)
204 : __pVariantImpl(null)
206 __pVariantImpl = new (std::nothrow) _VariantImpl;
207 if (__pVariantImpl == null)
209 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
213 __pVariantImpl->__type = VARIANT_TYPE_ULONGLONG;
214 __pVariantImpl->__data.valueULongLong = 0;
215 __pVariantImpl->__data.valueULongLong = value;
219 Variant::Variant(const char* pValue)
220 : __pVariantImpl(null)
222 __pVariantImpl = new (std::nothrow) _VariantImpl;
223 if (__pVariantImpl == null)
225 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
229 __pVariantImpl->__type = VARIANT_TYPE_STRING;
230 __pVariantImpl->__data.pString = null;
231 __pVariantImpl->__data.pString = new (std::nothrow) String(pValue);
235 Variant::Variant(const wchar_t* pValue)
236 : __pVariantImpl(null)
238 __pVariantImpl = new (std::nothrow) _VariantImpl;
239 if (__pVariantImpl == null)
241 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
245 __pVariantImpl->__type = VARIANT_TYPE_STRING;
246 __pVariantImpl->__data.pString = null;
247 __pVariantImpl->__data.pString = new (std::nothrow) String(pValue);
251 Variant::Variant(const String& value)
252 : __pVariantImpl(null)
254 __pVariantImpl = new (std::nothrow) _VariantImpl;
255 if (__pVariantImpl == null)
257 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
261 __pVariantImpl->__type = VARIANT_TYPE_STRING;
262 __pVariantImpl->__data.pString = null;
263 __pVariantImpl->__data.pString = new (std::nothrow) String(value);
267 Variant::Variant(const DateTime& value)
268 : __pVariantImpl(null)
270 __pVariantImpl = new (std::nothrow) _VariantImpl;
271 if (__pVariantImpl == null)
273 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
277 __pVariantImpl->__type = VARIANT_TYPE_DATETIME;
278 __pVariantImpl->__data.pDateTime = null;
279 __pVariantImpl->__data.pDateTime = new (std::nothrow) DateTime(value);
283 Variant::Variant(const Color& value)
284 : __pVariantImpl(null)
286 __pVariantImpl = new (std::nothrow) _VariantImpl;
287 if (__pVariantImpl == null)
289 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
293 __pVariantImpl->__type = VARIANT_TYPE_COLOR;
294 __pVariantImpl->__data.pColor = null;
295 __pVariantImpl->__data.pColor = new (std::nothrow) Color(value);
299 Variant::Variant(const Point& value)
300 : __pVariantImpl(null)
302 __pVariantImpl = new (std::nothrow) _VariantImpl;
303 if (__pVariantImpl == null)
305 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
309 __pVariantImpl->__type = VARIANT_TYPE_POINT;
310 __pVariantImpl->__data.pPoint = null;
311 __pVariantImpl->__data.pPoint = new (std::nothrow) Point(value);
315 Variant::Variant(const FloatPoint& value)
316 : __pVariantImpl(null)
318 __pVariantImpl = new (std::nothrow) _VariantImpl;
319 if (__pVariantImpl == null)
321 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
325 __pVariantImpl->__type = VARIANT_TYPE_FLOAT_POINT;
326 __pVariantImpl->__data.pFloatPoint = null;
327 __pVariantImpl->__data.pFloatPoint = new (std::nothrow) FloatPoint(value);
331 Variant::Variant(const Rectangle& value)
332 : __pVariantImpl(null)
334 __pVariantImpl = new (std::nothrow) _VariantImpl;
335 if (__pVariantImpl == null)
337 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
341 __pVariantImpl->__type = VARIANT_TYPE_RECTANGLE;
342 __pVariantImpl->__data.pRect = null;
343 __pVariantImpl->__data.pRect = new (std::nothrow) Rectangle(value);
347 Variant::Variant(const FloatRectangle& value)
348 : __pVariantImpl(null)
350 __pVariantImpl = new (std::nothrow) _VariantImpl;
351 if (__pVariantImpl == null)
353 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
357 __pVariantImpl->__type = VARIANT_TYPE_FLOAT_RECTANGLE;
358 __pVariantImpl->__data.pRectf = null;
359 __pVariantImpl->__data.pRectf = new (std::nothrow) FloatRectangle(value);
363 Variant::Variant(const Dimension& value)
364 : __pVariantImpl(null)
366 __pVariantImpl = new (std::nothrow) _VariantImpl;
367 if (__pVariantImpl == null)
369 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
373 __pVariantImpl->__type = VARIANT_TYPE_DIMENSION;
374 __pVariantImpl->__data.pDimension = null;
375 __pVariantImpl->__data.pDimension = new (std::nothrow) Dimension(value);
379 Variant::Variant(const FloatDimension& value)
380 : __pVariantImpl(null)
382 __pVariantImpl = new (std::nothrow) _VariantImpl;
383 if (__pVariantImpl == null)
385 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
389 __pVariantImpl->__type = VARIANT_TYPE_FLOAT_DIMENSION;
390 __pVariantImpl->__data.pFloatDimension = null;
391 __pVariantImpl->__data.pFloatDimension = new (std::nothrow) FloatDimension(value);
395 Variant::Variant(const FloatMatrix4& value)
396 : __pVariantImpl(null)
398 __pVariantImpl = new (std::nothrow) _VariantImpl;
399 if (__pVariantImpl == null)
401 SysLogException(NID_UI, E_SYSTEM, "[E_OUT_OF_MEMORY] pImpl is null.");
405 __pVariantImpl->__type = VARIANT_TYPE_FLOAT_MATRIX4;
406 __pVariantImpl->__data.pFloatMatrix4 = null;
407 __pVariantImpl->__data.pFloatMatrix4 = new (std::nothrow) FloatMatrix4(value);
411 // Assignment Operators
413 Variant::operator =(const Variant& rhs)
417 if (__pVariantImpl && rhs.__pVariantImpl && __pVariantImpl != rhs.__pVariantImpl)
419 __pVariantImpl->Release();
420 __pVariantImpl = rhs.__pVariantImpl;
421 __pVariantImpl->AddRef();
427 #define CREATE_VARIANT_IMPL(type, member, value) \
429 if (!__pVariantImpl || __pVariantImpl->__type != type) \
431 _VariantImpl* pImpl = new (std::nothrow) _VariantImpl; \
434 pImpl->__type = type; \
435 pImpl->__data.member = value; \
436 delete __pVariantImpl; \
437 __pVariantImpl = pImpl; \
442 /* __pVariantImpl != null && __pVariantImpl->__type == type */ \
443 __pVariantImpl->__data.member = value; \
448 Variant::operator =(int rhs)
450 CREATE_VARIANT_IMPL(VARIANT_TYPE_INT, valueInt, rhs);
456 Variant::operator =(unsigned int rhs)
458 CREATE_VARIANT_IMPL(VARIANT_TYPE_UINT, valueUInt, rhs);
464 Variant::operator =(bool rhs)
466 CREATE_VARIANT_IMPL(VARIANT_TYPE_BOOL, valueBool, rhs);
472 Variant::operator =(float rhs)
474 CREATE_VARIANT_IMPL(VARIANT_TYPE_FLOAT, valueFloat, rhs);
480 Variant::operator =(double rhs)
482 CREATE_VARIANT_IMPL(VARIANT_TYPE_DOUBLE, valueDouble, rhs);
488 Variant::operator =(long rhs)
490 CREATE_VARIANT_IMPL(VARIANT_TYPE_LONG, valueLong, rhs);
496 Variant::operator =(unsigned long rhs)
498 CREATE_VARIANT_IMPL(VARIANT_TYPE_ULONG, valueULong, rhs);
504 Variant::operator =(long long rhs)
506 CREATE_VARIANT_IMPL(VARIANT_TYPE_LONGLONG, valueLongLong, rhs);
512 Variant::operator =(unsigned long long rhs)
514 CREATE_VARIANT_IMPL(VARIANT_TYPE_ULONGLONG, valueLongLong, rhs);
520 Variant::operator =(const char* pRhs)
522 String* pString = new (std::nothrow) String(pRhs);
523 CREATE_VARIANT_IMPL(VARIANT_TYPE_STRING, pString, pString);
529 Variant::operator =(const wchar_t* pRhs)
531 String* pString = new (std::nothrow) String(pRhs);
532 CREATE_VARIANT_IMPL(VARIANT_TYPE_STRING, pString, pString);
538 Variant::operator =(const String& rhs)
540 String* pString = new (std::nothrow) String(rhs);
541 CREATE_VARIANT_IMPL(VARIANT_TYPE_STRING, pString, pString);
547 Variant::operator =(const DateTime& rhs)
549 DateTime* pDateTime = new (std::nothrow) DateTime(rhs);
550 CREATE_VARIANT_IMPL(VARIANT_TYPE_DATETIME, pDateTime, pDateTime);
556 Variant::operator =(const Color& rhs)
558 Color* pColor = new (std::nothrow) Color(rhs);
559 CREATE_VARIANT_IMPL(VARIANT_TYPE_COLOR, pColor, pColor);
565 Variant::operator =(const Point& rhs)
567 Point* pPoint = new (std::nothrow) Point(rhs);
568 CREATE_VARIANT_IMPL(VARIANT_TYPE_POINT, pPoint, pPoint);
574 Variant::operator =(const FloatPoint& rhs)
577 FloatPoint* pFloatPoint = new (std::nothrow) FloatPoint(rhs);
578 CREATE_VARIANT_IMPL(VARIANT_TYPE_FLOAT_POINT, pFloatPoint, pFloatPoint);
584 Variant::operator =(const Rectangle& rhs)
586 Rectangle* pRectangle = new (std::nothrow) Rectangle(rhs);
587 CREATE_VARIANT_IMPL(VARIANT_TYPE_RECTANGLE, pRect, pRectangle);
593 Variant::operator =(const FloatRectangle& rhs)
595 FloatRectangle* pFloatRectangle = new (std::nothrow) FloatRectangle(rhs);
596 CREATE_VARIANT_IMPL(VARIANT_TYPE_FLOAT_RECTANGLE, pRectf, pFloatRectangle);
602 Variant::operator =(const Dimension& rhs)
605 Dimension* pDimension = new (std::nothrow) Dimension(rhs);
606 CREATE_VARIANT_IMPL(VARIANT_TYPE_DIMENSION, pDimension, pDimension);
612 Variant::operator =(const FloatDimension& rhs)
614 FloatDimension* pFloatDimension = new (std::nothrow) FloatDimension(rhs);
615 CREATE_VARIANT_IMPL(VARIANT_TYPE_FLOAT_DIMENSION, pFloatDimension, pFloatDimension);
621 Variant::operator =(const FloatMatrix4& rhs)
623 FloatMatrix4* pFloatMatrix4 = new (std::nothrow) FloatMatrix4(rhs);
624 CREATE_VARIANT_IMPL(VARIANT_TYPE_FLOAT_MATRIX4, pFloatMatrix4, pFloatMatrix4);
630 operator ==(const Variant& lhs, const Variant& rhs)
632 const _VariantImpl* pLhsImpl = lhs.GetVariantImpl();
633 const _VariantImpl* pRhsImpl = rhs.GetVariantImpl();
635 if (pLhsImpl == null || pRhsImpl == null)
640 if (pLhsImpl == pRhsImpl)
645 if (pLhsImpl->__type != pRhsImpl->__type)
650 switch (pLhsImpl->__type)
652 case VARIANT_TYPE_INT:
653 return pLhsImpl->__data.valueInt == pRhsImpl->__data.valueInt;
655 case VARIANT_TYPE_UINT:
656 return pLhsImpl->__data.valueUInt == pRhsImpl->__data.valueUInt;
658 case VARIANT_TYPE_BOOL:
659 return pLhsImpl->__data.valueBool == pRhsImpl->__data.valueBool;
661 case VARIANT_TYPE_FLOAT:
662 return pLhsImpl->__data.valueFloat == pRhsImpl->__data.valueFloat;
664 case VARIANT_TYPE_DOUBLE:
665 return pLhsImpl->__data.valueDouble == pRhsImpl->__data.valueDouble;
667 case VARIANT_TYPE_LONG:
668 return pLhsImpl->__data.valueLong == pRhsImpl->__data.valueLong;
670 case VARIANT_TYPE_ULONG:
671 return pLhsImpl->__data.valueULong == pRhsImpl->__data.valueULong;
673 case VARIANT_TYPE_LONGLONG:
674 return pLhsImpl->__data.valueLongLong == pRhsImpl->__data.valueLongLong;
676 case VARIANT_TYPE_ULONGLONG:
677 return pLhsImpl->__data.valueULongLong == pRhsImpl->__data.valueULongLong;
679 case VARIANT_TYPE_STRING:
681 if (pLhsImpl->__data.pString)
683 return (*pLhsImpl->__data.pString == *pRhsImpl->__data.pString);
691 case VARIANT_TYPE_DATETIME:
693 if (pLhsImpl->__data.pDateTime)
695 return *pLhsImpl->__data.pDateTime == *pRhsImpl->__data.pDateTime;
703 case VARIANT_TYPE_COLOR:
705 if (pLhsImpl->__data.pColor)
707 return *pLhsImpl->__data.pColor == *pRhsImpl->__data.pColor;
715 case VARIANT_TYPE_POINT:
717 if (pLhsImpl->__data.pPoint)
719 return *pLhsImpl->__data.pPoint == *pRhsImpl->__data.pPoint;
727 case VARIANT_TYPE_FLOAT_POINT:
729 if (pLhsImpl->__data.pFloatPoint)
731 return *pLhsImpl->__data.pFloatPoint == *pRhsImpl->__data.pFloatPoint;
739 case VARIANT_TYPE_RECTANGLE:
741 if (pLhsImpl->__data.pRect)
743 return *pLhsImpl->__data.pRect == *pRhsImpl->__data.pRect;
751 case VARIANT_TYPE_FLOAT_RECTANGLE:
753 if (pLhsImpl->__data.pRectf)
755 return *pLhsImpl->__data.pRectf == *pRhsImpl->__data.pRectf;
763 case VARIANT_TYPE_DIMENSION:
765 if (pLhsImpl->__data.pDimension)
767 return *pLhsImpl->__data.pDimension == *pRhsImpl->__data.pDimension;
775 case VARIANT_TYPE_FLOAT_DIMENSION:
777 if (pLhsImpl->__data.pFloatDimension)
779 return *pLhsImpl->__data.pFloatDimension == *pRhsImpl->__data.pFloatDimension;
787 case VARIANT_TYPE_FLOAT_MATRIX4:
789 if (pLhsImpl->__data.pFloatMatrix4)
791 return *pLhsImpl->__data.pFloatMatrix4 == *pRhsImpl->__data.pFloatMatrix4;
799 case VARIANT_TYPE_NONE:
800 return pLhsImpl->__type == pRhsImpl->__type;
810 operator !=(const Variant& lhs, const Variant& rhs)
812 return !(lhs == rhs);
816 Variant::ToInt(void) const
818 const _VariantImpl* pImpl = GetVariantImpl();
821 if (!pImpl->IsSameType(VARIANT_TYPE_INT))
823 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_INT.");
827 return pImpl->__data.valueInt;
835 Variant::ToUInt(void) const
837 const _VariantImpl* pImpl = GetVariantImpl();
840 if (!pImpl->IsSameType(VARIANT_TYPE_UINT))
842 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_UINT.");
846 return pImpl->__data.valueUInt;
853 Variant::ToBool(void) const
855 const _VariantImpl* pImpl = GetVariantImpl();
858 if (!pImpl->IsSameType(VARIANT_TYPE_BOOL))
860 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_BOOL.");
864 return pImpl->__data.valueBool;
872 Variant::ToFloat(void) const
874 const _VariantImpl* pImpl = GetVariantImpl();
877 if (!pImpl->IsSameType(VARIANT_TYPE_FLOAT))
879 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_FLOAT.");
883 return pImpl->__data.valueFloat;
891 Variant::ToDouble(void) const
893 const _VariantImpl* pImpl = GetVariantImpl();
896 if (!pImpl->IsSameType(VARIANT_TYPE_DOUBLE))
898 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_DOUBLE.");
902 return pImpl->__data.valueDouble;
910 Variant::ToLong(void) const
912 const _VariantImpl* pImpl = GetVariantImpl();
915 if (!pImpl->IsSameType(VARIANT_TYPE_LONG))
917 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_LONG.");
921 return pImpl->__data.valueLong;
929 Variant::ToULong(void) const
931 const _VariantImpl* pImpl = GetVariantImpl();
934 if (!pImpl->IsSameType(VARIANT_TYPE_ULONG))
936 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_ULONG.");
940 return pImpl->__data.valueULong;
948 Variant::ToLongLong(void) const
950 const _VariantImpl* pImpl = GetVariantImpl();
953 if (!pImpl->IsSameType(VARIANT_TYPE_LONGLONG))
955 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_LONGLONG.");
959 return pImpl->__data.valueLongLong;
967 Variant::ToULongLong(void) const
969 const _VariantImpl* pImpl = GetVariantImpl();
972 if (!pImpl->IsSameType(VARIANT_TYPE_ULONGLONG))
974 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_ULONGLONG.");
978 return pImpl->__data.valueULongLong;
986 Variant::ToString(void) const
988 const _VariantImpl* pImpl = GetVariantImpl();
991 if (!pImpl->IsSameType(VARIANT_TYPE_STRING))
993 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_STRING.");
997 return *pImpl->__data.pString;
1005 Variant::ToDateTime(void) const
1007 const _VariantImpl* pImpl = GetVariantImpl();
1010 if (!pImpl->IsSameType(VARIANT_TYPE_DATETIME))
1012 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_DATETIME.");
1016 return *pImpl->__data.pDateTime;
1024 Variant::ToColor(void) const
1026 const _VariantImpl* pImpl = GetVariantImpl();
1029 if (!pImpl->IsSameType(VARIANT_TYPE_COLOR))
1031 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_COLOR.");
1035 return *pImpl->__data.pColor;
1043 Variant::ToPoint(void) const
1045 const _VariantImpl* pImpl = GetVariantImpl();
1048 if (!pImpl->IsSameType(VARIANT_TYPE_POINT))
1050 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_POINT.");
1054 return *pImpl->__data.pPoint;
1062 Variant::ToFloatPoint(void) const
1064 const _VariantImpl* pImpl = GetVariantImpl();
1067 if (!pImpl->IsSameType(VARIANT_TYPE_FLOAT_POINT))
1069 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_FLOATPOINT.");
1073 return *pImpl->__data.pFloatPoint;
1077 return FloatPoint();
1081 Variant::ToRectangle(void) const
1083 const _VariantImpl* pImpl = GetVariantImpl();
1086 if (!pImpl->IsSameType(VARIANT_TYPE_RECTANGLE))
1088 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_RECTANGLE.");
1092 return *pImpl->__data.pRect;
1100 Variant::ToFloatRectangle(void) const
1102 const _VariantImpl* pImpl = GetVariantImpl();
1105 if (!pImpl->IsSameType(VARIANT_TYPE_FLOAT_RECTANGLE))
1107 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_FLOAT_RECTANGLE.");
1111 return *pImpl->__data.pRectf;
1115 return FloatRectangle();
1119 Variant::ToDimension(void) const
1121 const _VariantImpl* pImpl = GetVariantImpl();
1124 if (!pImpl->IsSameType(VARIANT_TYPE_DIMENSION))
1126 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_DIMENSION.");
1130 return *pImpl->__data.pDimension;
1138 Variant::ToFloatDimension(void) const
1140 const _VariantImpl* pImpl = GetVariantImpl();
1143 if (!pImpl->IsSameType(VARIANT_TYPE_FLOAT_DIMENSION))
1145 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_FLOAT_DIMENSION.");
1149 return *pImpl->__data.pFloatDimension;
1153 return FloatDimension();
1157 Variant::ToFloatMatrix4(void) const
1159 const _VariantImpl* pImpl = GetVariantImpl();
1162 if (!pImpl->IsSameType(VARIANT_TYPE_FLOAT_MATRIX4))
1164 SysLogException(NID_UI, E_INVALID_OPERATION, "[E_INVALID_OPERATION] The current variant type is not VARIANT_TYPE_FLOAT_MATRIX4.");
1168 return *pImpl->__data.pFloatMatrix4;
1172 return FloatMatrix4();
1176 Variant::IsEmpty(void) const
1178 const _VariantImpl* pImpl = GetVariantImpl();
1181 return pImpl->__type == VARIANT_TYPE_NONE;
1188 Variant::GetType() const
1190 const _VariantImpl* pImpl = GetVariantImpl();
1193 return pImpl->__type;
1196 return VARIANT_TYPE_NONE;
1200 Variant::Equals(const Object& obj) const
1202 const Variant* pOther = dynamic_cast <const Variant*>(&obj);
1208 return (*this == *pOther);
1212 Variant::GetHashCode(void) const
1214 const _VariantImpl* pImpl = GetVariantImpl();
1216 switch (pImpl->__type)
1218 case VARIANT_TYPE_INT:
1219 return (int) pImpl->__data.valueInt;
1221 case VARIANT_TYPE_UINT:
1222 return (int) pImpl->__data.valueUInt;
1224 case VARIANT_TYPE_BOOL:
1225 return (int) pImpl->__data.valueBool;
1227 case VARIANT_TYPE_FLOAT:
1228 return (int) pImpl->__data.valueFloat;
1230 case VARIANT_TYPE_DOUBLE:
1231 return (int) pImpl->__data.valueDouble;
1233 case VARIANT_TYPE_LONG:
1234 return (int) pImpl->__data.valueLong;
1236 case VARIANT_TYPE_ULONG:
1237 return (int) pImpl->__data.valueULong;
1239 case VARIANT_TYPE_LONGLONG:
1240 return (int) pImpl->__data.valueLongLong;
1242 case VARIANT_TYPE_ULONGLONG:
1243 return (int) pImpl->__data.valueULongLong;
1245 case VARIANT_TYPE_STRING:
1247 if (pImpl->__data.pString)
1249 return pImpl->__data.pString->GetHashCode();
1257 case VARIANT_TYPE_DATETIME:
1259 if (pImpl->__data.pDateTime)
1261 return (pImpl->__data.pDateTime)->GetHashCode();
1269 case VARIANT_TYPE_COLOR:
1271 if (pImpl->__data.pPoint)
1273 return (pImpl->__data.pColor)->GetHashCode();
1281 case VARIANT_TYPE_POINT:
1283 if (pImpl->__data.pPoint)
1285 return (pImpl->__data.pPoint)->GetHashCode();
1293 case VARIANT_TYPE_FLOAT_POINT:
1295 if (pImpl->__data.pFloatPoint)
1297 return (pImpl->__data.pFloatPoint)->GetHashCode();
1305 case VARIANT_TYPE_RECTANGLE:
1307 if (pImpl->__data.pRect)
1309 return (pImpl->__data.pRect)->GetHashCode();
1317 case VARIANT_TYPE_FLOAT_RECTANGLE:
1319 if (pImpl->__data.pRectf)
1321 return (pImpl->__data.pRectf)->GetHashCode();
1329 case VARIANT_TYPE_DIMENSION:
1331 if (pImpl->__data.pDimension)
1333 return (pImpl->__data.pDimension)->GetHashCode();
1341 case VARIANT_TYPE_FLOAT_DIMENSION:
1343 if (pImpl->__data.pFloatDimension)
1345 return (pImpl->__data.pFloatDimension)->GetHashCode();
1353 case VARIANT_TYPE_FLOAT_MATRIX4:
1355 if (pImpl->__data.pFloatMatrix4)
1357 return (pImpl->__data.pFloatMatrix4)->GetHashCode();
1365 case VARIANT_TYPE_NONE:
1374 Variant::GetVariantImpl(void) const
1376 return static_cast <const _VariantImpl*>(__pVariantImpl);
1380 Variant::GetVariantImpl(void)
1382 return __pVariantImpl;