| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075 |
- //
- // Notice Regarding Standards. AMD does not provide a license or sublicense to
- // any Intellectual Property Rights relating to any standards, including but not
- // limited to any audio and/or video codec technologies such as MPEG-2, MPEG-4;
- // AVC/H.264; HEVC/H.265; AAC decode/FFMPEG; AAC encode/FFMPEG; VC-1; and MP3
- // (collectively, the "Media Technologies"). For clarity, you will pay any
- // royalties due for such third party technologies, which may include the Media
- // Technologies that are owed as a result of AMD providing the Software to you.
- //
- // MIT license
- //
- // Copyright (c) 2018 Advanced Micro Devices, Inc. All rights reserved.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- //
- #ifndef AMF_Variant_h
- #define AMF_Variant_h
- #pragma once
- #if defined(_MSC_VER)
- #pragma warning(disable: 4996)
- #endif
- #include "Interface.h"
- #include <locale.h>
- #include <wchar.h>
- #include <string.h>
- #if defined(__cplusplus)
- namespace amf
- {
- #endif
- //----------------------------------------------------------------------------------------------
- // variant types
- //----------------------------------------------------------------------------------------------
- typedef enum AMF_VARIANT_TYPE
- {
- AMF_VARIANT_EMPTY = 0,
- AMF_VARIANT_BOOL = 1,
- AMF_VARIANT_INT64 = 2,
- AMF_VARIANT_DOUBLE = 3,
- AMF_VARIANT_RECT = 4,
- AMF_VARIANT_SIZE = 5,
- AMF_VARIANT_POINT = 6,
- AMF_VARIANT_RATE = 7,
- AMF_VARIANT_RATIO = 8,
- AMF_VARIANT_COLOR = 9,
- AMF_VARIANT_STRING = 10, // value is char*
- AMF_VARIANT_WSTRING = 11, // value is wchar_t*
- AMF_VARIANT_INTERFACE = 12, // value is AMFInterface*
- AMF_VARIANT_FLOAT = 13,
- AMF_VARIANT_FLOAT_SIZE = 14,
- AMF_VARIANT_FLOAT_POINT2D = 15,
- AMF_VARIANT_FLOAT_POINT3D = 16,
- AMF_VARIANT_FLOAT_VECTOR4D = 17
- } AMF_VARIANT_TYPE;
- //----------------------------------------------------------------------------------------------
- // variant struct
- //----------------------------------------------------------------------------------------------
- typedef struct AMFVariantStruct
- {
- AMF_VARIANT_TYPE type;
- union
- {
- amf_bool boolValue;
- amf_int64 int64Value;
- amf_double doubleValue;
- char* stringValue;
- wchar_t* wstringValue;
- AMFInterface* pInterface;
- struct AMFRect rectValue;
- struct AMFSize sizeValue;
- struct AMFPoint pointValue;
- struct AMFRate rateValue;
- struct AMFRatio ratioValue;
- struct AMFColor colorValue;
- amf_float floatValue;
- struct AMFFloatSize floatSizeValue;
- struct AMFFloatPoint2D floatPoint2DValue;
- struct AMFFloatPoint3D floatPoint3DValue;
- struct AMFFloatVector4D floatVector4DValue;
- };
- } AMFVariantStruct;
- //----------------------------------------------------------------------------------------------
- // variant accessors
- //----------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_VARIANT_TYPE AMF_STD_CALL AMFVariantGetType(const AMFVariantStruct* _variant) { return (_variant)->type; }
- #if defined(__cplusplus)
- static AMF_INLINE AMF_VARIANT_TYPE& AMF_STD_CALL AMFVariantGetType(AMFVariantStruct* _variant) { return (_variant)->type; }
- #endif
- static AMF_INLINE amf_bool AMF_STD_CALL AMFVariantGetBool(const AMFVariantStruct* _variant) { return (_variant)->boolValue; }
- static AMF_INLINE amf_int64 AMF_STD_CALL AMFVariantGetInt64(const AMFVariantStruct* _variant) { return (_variant)->int64Value; }
- static AMF_INLINE amf_double AMF_STD_CALL AMFVariantGetDouble(const AMFVariantStruct* _variant) { return (_variant)->doubleValue; }
- static AMF_INLINE amf_float AMF_STD_CALL AMFVariantGetFloat(const AMFVariantStruct* _variant) { return (_variant)->floatValue; }
- static AMF_INLINE const char* AMF_STD_CALL AMFVariantGetString(const AMFVariantStruct* _variant) { return (_variant)->stringValue; }
- static AMF_INLINE const wchar_t* AMF_STD_CALL AMFVariantGetWString(const AMFVariantStruct* _variant) { return (_variant)->wstringValue; }
- #if defined(__cplusplus)
- static AMF_INLINE const AMFInterface* AMF_STD_CALL AMFVariantGetInterface(const AMFVariantStruct* _variant) { return (_variant)->pInterface; }
- #endif
- static AMF_INLINE AMFInterface* AMF_STD_CALL AMFVariantGetInterface(AMFVariantStruct* _variant) { return (_variant)->pInterface; }
- #if defined(__cplusplus)
- static AMF_INLINE const AMFRect & AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
- static AMF_INLINE const AMFSize & AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
- static AMF_INLINE const AMFPoint& AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
- static AMF_INLINE const AMFFloatSize& AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
- static AMF_INLINE const AMFFloatPoint2D& AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
- static AMF_INLINE const AMFFloatPoint3D& AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
- static AMF_INLINE const AMFFloatVector4D& AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
- static AMF_INLINE const AMFRate & AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
- static AMF_INLINE const AMFRatio& AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
- static AMF_INLINE const AMFColor& AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
- #else // #if defined(__cplusplus)
- static AMF_INLINE const AMFRect AMF_STD_CALL AMFVariantGetRect (const AMFVariantStruct* _variant) { return (_variant)->rectValue; }
- static AMF_INLINE const AMFSize AMF_STD_CALL AMFVariantGetSize (const AMFVariantStruct* _variant) { return (_variant)->sizeValue; }
- static AMF_INLINE const AMFPoint AMF_STD_CALL AMFVariantGetPoint(const AMFVariantStruct* _variant) { return (_variant)->pointValue; }
- static AMF_INLINE const AMFFloatSize AMF_STD_CALL AMFVariantGetFloatSize(const AMFVariantStruct* _variant) { return (_variant)->floatSizeValue; }
- static AMF_INLINE const AMFFloatPoint2D AMF_STD_CALL AMFVariantGetFloatPoint2D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint2DValue; }
- static AMF_INLINE const AMFFloatPoint3D AMF_STD_CALL AMFVariantGetFloatPoint3D(const AMFVariantStruct* _variant) { return (_variant)->floatPoint3DValue; }
- static AMF_INLINE const AMFFloatVector4D AMF_STD_CALL AMFVariantGetFloatVector4D(const AMFVariantStruct* _variant) { return (_variant)->floatVector4DValue; }
- static AMF_INLINE const AMFRate AMF_STD_CALL AMFVariantGetRate (const AMFVariantStruct* _variant) { return (_variant)->rateValue; }
- static AMF_INLINE const AMFRatio AMF_STD_CALL AMFVariantGetRatio(const AMFVariantStruct* _variant) { return (_variant)->ratioValue; }
- static AMF_INLINE const AMFColor AMF_STD_CALL AMFVariantGetColor(const AMFVariantStruct* _variant) { return (_variant)->colorValue; }
- #endif // #if defined(__cplusplus)
- #define AMFVariantEmpty(_variant) 0
- #define AMFVariantBool(_variant) (_variant)->boolValue
- #define AMFVariantInt64(_variant) (_variant)->int64Value
- #define AMFVariantDouble(_variant) (_variant)->doubleValue
- #define AMFVariantFloat(_variant) (_variant)->floatValue
- #define AMFVariantRect(_variant) (_variant)->rectValue
- #define AMFVariantSize(_variant) (_variant)->sizeValue
- #define AMFVariantPoint(_variant) (_variant)->pointValue
- #define AMFVariantFloatSize(_variant) (_variant)->floatSizeValue
- #define AMFVariantFloatPoint2D(_variant) (_variant)->floatPoint2DValue
- #define AMFVariantFloatPoint3D(_variant) (_variant)->floatPoint3DValue
- #define AMFVariantFloatVector4D(_variant) (_variant)->floatVector4DValue
- #define AMFVariantRate(_variant) (_variant)->rateValue
- #define AMFVariantRatio(_variant) (_variant)->ratioValue
- #define AMFVariantColor(_variant) (_variant)->colorValue
- #define AMFVariantString(_variant) (_variant)->stringValue
- #define AMFVariantWString(_variant) (_variant)->wstringValue
- #define AMFVariantInterface(_variant) (_variant)->pInterface
- //----------------------------------------------------------------------------------------------
- // variant hleper functions
- //----------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* equal);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value);
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize(AMFVariantStruct* pDest, const AMFSize& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate(AMFVariantStruct* pDest, const AMFRate& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value);
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType);
- #endif
- static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from);
- static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from);
- static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from);
- static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from);
- #if defined(__cplusplus)
- //----------------------------------------------------------------------------------------------
- // AMF_INLINE Variant helper class
- //----------------------------------------------------------------------------------------------
- class AMFVariant : public AMFVariantStruct
- {
- public:
- class String;
- class WString;
- public:
- AMFVariant() { AMFVariantInit(this); }
- explicit AMFVariant(const AMFVariantStruct& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other)); }
- explicit AMFVariant(const AMFVariantStruct* pOther);
- template<typename T>
- explicit AMFVariant(const AMFInterfacePtr_T<T>& pValue);
- AMFVariant(const AMFVariant& other) { AMFVariantInit(this); AMFVariantCopy(this, const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other))); }
- explicit AMF_INLINE AMFVariant(amf_bool value) { AMFVariantInit(this); AMFVariantAssignBool(this, value); }
- explicit AMF_INLINE AMFVariant(amf_int64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
- explicit AMF_INLINE AMFVariant(amf_uint64 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, (amf_int64)value); }
- explicit AMF_INLINE AMFVariant(amf_int32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
- explicit AMF_INLINE AMFVariant(amf_uint32 value) { AMFVariantInit(this); AMFVariantAssignInt64(this, value); }
- explicit AMF_INLINE AMFVariant(amf_double value) { AMFVariantInit(this); AMFVariantAssignDouble(this, value); }
- explicit AMF_INLINE AMFVariant(amf_float value) { AMFVariantInit(this); AMFVariantAssignFloat(this, value); }
- explicit AMF_INLINE AMFVariant(const AMFRect & value) { AMFVariantInit(this); AMFVariantAssignRect(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFSize & value) { AMFVariantInit(this); AMFVariantAssignSize(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFPoint& value) { AMFVariantInit(this); AMFVariantAssignPoint(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFFloatSize& value) { AMFVariantInit(this); AMFVariantAssignFloatSize(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFFloatPoint2D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint2D(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFFloatPoint3D& value) { AMFVariantInit(this); AMFVariantAssignFloatPoint3D(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFFloatVector4D& value) { AMFVariantInit(this); AMFVariantAssignFloatVector4D(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFRate & value) { AMFVariantInit(this); AMFVariantAssignRate(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFRatio& value) { AMFVariantInit(this); AMFVariantAssignRatio(this, &value); }
- explicit AMF_INLINE AMFVariant(const AMFColor& value) { AMFVariantInit(this); AMFVariantAssignColor(this, &value); }
- explicit AMF_INLINE AMFVariant(const char* value) { AMFVariantInit(this); AMFVariantAssignString(this, value); }
- explicit AMF_INLINE AMFVariant(const wchar_t* value) { AMFVariantInit(this); AMFVariantAssignWString(this, value); }
- explicit AMF_INLINE AMFVariant(AMFInterface* pValue) { AMFVariantInit(this); AMFVariantAssignInterface(this, pValue); }
- ~AMFVariant() { AMFVariantClear(this); }
- AMFVariant& operator=(const AMFVariantStruct& other);
- AMFVariant& operator=(const AMFVariantStruct* pOther);
- AMFVariant& operator=(const AMFVariant& other);
- AMFVariant& operator=(amf_bool value) { AMFVariantAssignBool(this, value); return *this;}
- AMFVariant& operator=(amf_int64 value) { AMFVariantAssignInt64(this, value); return *this;}
- AMFVariant& operator=(amf_uint64 value) { AMFVariantAssignInt64(this, (amf_int64)value); return *this;}
- AMFVariant& operator=(amf_int32 value) { AMFVariantAssignInt64(this, value); return *this;}
- AMFVariant& operator=(amf_uint32 value) { AMFVariantAssignInt64(this, value); return *this;}
- AMFVariant& operator=(amf_double value) { AMFVariantAssignDouble(this, value); return *this;}
- AMFVariant& operator=(amf_float value) { AMFVariantAssignFloat(this, value); return *this; }
- AMFVariant& operator=(const AMFRect & value) { AMFVariantAssignRect(this, &value); return *this;}
- AMFVariant& operator=(const AMFSize & value) { AMFVariantAssignSize(this, &value); return *this;}
- AMFVariant& operator=(const AMFPoint& value) { AMFVariantAssignPoint(this, &value); return *this;}
- AMFVariant& operator=(const AMFFloatSize& value) { AMFVariantAssignFloatSize(this, &value); return *this; }
- AMFVariant& operator=(const AMFFloatPoint2D& value) { AMFVariantAssignFloatPoint2D(this, &value); return *this; }
- AMFVariant& operator=(const AMFFloatPoint3D& value) { AMFVariantAssignFloatPoint3D(this, &value); return *this; }
- AMFVariant& operator=(const AMFFloatVector4D& value) { AMFVariantAssignFloatVector4D(this, &value); return *this; }
- AMFVariant& operator=(const AMFRate & value) { AMFVariantAssignRate(this, &value); return *this;}
- AMFVariant& operator=(const AMFRatio& value) { AMFVariantAssignRatio(this, &value); return *this;}
- AMFVariant& operator=(const AMFColor& value) { AMFVariantAssignColor(this, &value); return *this;}
- AMFVariant& operator=(const char* value) { AMFVariantAssignString(this, value); return *this;}
- AMFVariant& operator=(const wchar_t* value) { AMFVariantAssignWString(this, value); return *this;}
- AMFVariant& operator=(AMFInterface* value) { AMFVariantAssignInterface(this, value); return *this;}
- template<typename T> AMFVariant& operator=(const AMFInterfacePtr_T<T>& value);
- operator amf_bool() const { return ToBool(); }
- operator amf_int64() const { return ToInt64(); }
- operator amf_uint64() const { return ToUInt64(); }
- operator amf_int32() const { return ToInt32(); }
- operator amf_uint32() const { return ToUInt32(); }
- operator amf_double() const { return ToDouble(); }
- operator amf_float() const { return ToFloat(); }
- operator AMFRect () const { return ToRect (); }
- operator AMFSize () const { return ToSize (); }
- operator AMFPoint() const { return ToPoint(); }
- operator AMFFloatSize() const { return ToFloatSize(); }
- operator AMFFloatPoint2D() const { return ToFloatPoint2D(); }
- operator AMFFloatPoint3D() const { return ToFloatPoint3D(); }
- operator AMFFloatVector4D() const { return ToFloatVector4D(); }
- operator AMFRate () const { return ToRate (); }
- operator AMFRatio() const { return ToRatio(); }
- operator AMFColor() const { return ToColor(); }
- operator AMFInterface*() const { return ToInterface(); }
- AMF_INLINE amf_bool ToBool() const { return Empty() ? false : GetValue<amf_bool, AMF_VARIANT_BOOL>(AMFVariantGetBool); }
- AMF_INLINE amf_int64 ToInt64() const { return Empty() ? 0 : GetValue<amf_int64, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
- AMF_INLINE amf_uint64 ToUInt64() const { return Empty() ? 0 : GetValue<amf_uint64, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
- AMF_INLINE amf_int32 ToInt32() const { return Empty() ? 0 : GetValue<amf_int32, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
- AMF_INLINE amf_uint32 ToUInt32() const { return Empty() ? 0 : GetValue<amf_uint32, AMF_VARIANT_INT64>(AMFVariantGetInt64); }
- AMF_INLINE amf_double ToDouble() const { return Empty() ? 0 : GetValue<amf_double, AMF_VARIANT_DOUBLE>(AMFVariantGetDouble); }
- AMF_INLINE amf_float ToFloat() const { return Empty() ? 0 : GetValue<amf_float, AMF_VARIANT_FLOAT>(AMFVariantGetFloat); }
- AMF_INLINE AMFRect ToRect () const { return Empty() ? AMFRect() : GetValue<AMFRect, AMF_VARIANT_RECT>(AMFVariantGetRect); }
- AMF_INLINE AMFSize ToSize () const { return Empty() ? AMFSize() : GetValue<AMFSize, AMF_VARIANT_SIZE>(AMFVariantGetSize); }
- AMF_INLINE AMFPoint ToPoint() const { return Empty() ? AMFPoint() : GetValue<AMFPoint, AMF_VARIANT_POINT>(AMFVariantGetPoint); }
- AMF_INLINE AMFFloatSize ToFloatSize() const { return Empty() ? AMFFloatSize() : GetValue<AMFFloatSize, AMF_VARIANT_FLOAT_SIZE>(AMFVariantGetFloatSize); }
- AMF_INLINE AMFFloatPoint2D ToFloatPoint2D() const { return Empty() ? AMFFloatPoint2D() : GetValue<AMFFloatPoint2D, AMF_VARIANT_FLOAT_POINT2D>(AMFVariantGetFloatPoint2D); }
- AMF_INLINE AMFFloatPoint3D ToFloatPoint3D() const { return Empty() ? AMFFloatPoint3D() : GetValue<AMFFloatPoint3D, AMF_VARIANT_FLOAT_POINT3D>(AMFVariantGetFloatPoint3D); }
- AMF_INLINE AMFFloatVector4D ToFloatVector4D() const { return Empty() ? AMFFloatVector4D() : GetValue<AMFFloatVector4D, AMF_VARIANT_FLOAT_VECTOR4D>(AMFVariantGetFloatVector4D); }
- AMF_INLINE AMFRate ToRate () const { return Empty() ? AMFRate() : GetValue<AMFRate, AMF_VARIANT_RATE>(AMFVariantGetRate); }
- AMF_INLINE AMFRatio ToRatio() const { return Empty() ? AMFRatio() : GetValue<AMFRatio, AMF_VARIANT_RATIO>(AMFVariantGetRatio); }
- AMF_INLINE AMFColor ToColor() const { return Empty() ? AMFColor() : GetValue<AMFColor, AMF_VARIANT_COLOR>(AMFVariantGetColor); }
- AMF_INLINE AMFInterface* ToInterface() const { return AMFVariantGetType(this) == AMF_VARIANT_INTERFACE ? this->pInterface : NULL; }
- AMF_INLINE String ToString() const;
- AMF_INLINE WString ToWString() const;
- bool operator==(const AMFVariantStruct& other) const;
- bool operator==(const AMFVariantStruct* pOther) const;
- bool operator!=(const AMFVariantStruct& other) const;
- bool operator!=(const AMFVariantStruct* pOther) const;
- void Clear() { AMFVariantClear(this); }
- void Attach(AMFVariantStruct& variant);
- AMFVariantStruct Detach();
- AMFVariantStruct& GetVariant();
- void ChangeType(AMF_VARIANT_TYPE type, const AMFVariant* pSrc = NULL);
- bool Empty() const;
- private:
- template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter>
- ReturnType GetValue(Getter getter) const;
- };
- //----------------------------------------------------------------------------------------------
- // helper String class
- //----------------------------------------------------------------------------------------------
- class AMFVariant::String
- {
- friend class AMFVariant;
- private:
- void Free()
- {
- if (m_Str != NULL)
- {
- AMFVariantFreeString(m_Str);
- m_Str = NULL;
- }
- }
- public:
- String() :m_Str(NULL){}
- String(const char* str) : m_Str(NULL)
- {
- m_Str = AMFVariantDuplicateString(str);
- }
- String(const String& p_other) : m_Str(NULL)
- {
- operator=(p_other);
- }
- #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
- String(String&& p_other) : m_Str(NULL)
- {
- operator=(p_other);
- }
- #endif
- ~String()
- {
- Free();
- }
- char& operator[](size_t index)
- {
- if (index >= size())
- {
- resize(index);
- }
- return m_Str[index];
- }
- String& operator=(const String& p_other)
- {
- Free();
- m_Str = AMFVariantDuplicateString(p_other.m_Str);
- return *this;
- }
- #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
- String& operator=(String&& p_other)
- {
- Free();
- m_Str = p_other.m_Str;
- p_other.m_Str = NULL; // Transfer the ownership
- return *this;
- }
- #endif
- bool operator==(const String& p_other) const
- {
- if (m_Str == NULL && p_other.m_Str == NULL)
- {
- return true;
- }
- else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL))
- {
- return false;
- }
- return strcmp(c_str(), p_other.c_str()) == 0;
- }
- const char* c_str() const { return m_Str; }
- size_t size() const
- {
- if(m_Str == NULL)
- {
- return 0;
- }
- return (size_t)strlen(m_Str);
- }
- AMF_INLINE size_t length() const { return size(); }
-
- void resize(size_t sizeAlloc)
- {
- if(sizeAlloc == 0)
- {
- Free();
- return;
- }
- char* str = (char*)amf_variant_alloc(sizeof(char)*(sizeAlloc + 1));
- if(m_Str != NULL)
- {
- size_t copySize = sizeAlloc;
- if(copySize > size())
- {
- copySize = size();
- }
- memcpy(str, m_Str, copySize * sizeof(char));
- Free();
- str[sizeAlloc] = 0;
- }
- m_Str = str;
- }
- private:
- char* m_Str;
- };
- //----------------------------------------------------------------------------------------------
- // helper WString class
- //----------------------------------------------------------------------------------------------
- class AMFVariant::WString
- {
- friend class AMFVariant;
- private:
- void Free()
- {
- if (m_Str != NULL)
- {
- AMFVariantFreeWString(m_Str);
- m_Str = NULL;
- }
- }
- public:
- WString() :m_Str(NULL){}
- WString(const wchar_t* str) : m_Str(NULL)
- {
- m_Str = AMFVariantDuplicateWString(str);
- }
- WString(const WString& p_other) : m_Str(NULL)
- {
- operator=(p_other);
- }
- #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
- WString(WString&& p_other) : m_Str(NULL)
- {
- operator=(p_other);
- }
- #endif
- ~WString()
- {
- Free();
- }
- WString& operator=(const WString& p_other)
- {
- Free();
- m_Str = AMFVariantDuplicateWString(p_other.m_Str);
- return *this;
- }
- #if (__cplusplus == 201103L) || defined(__GXX_EXPERIMENTAL_CXX0X) || (_MSC_VER >= 1600)
- WString& operator=(WString&& p_other)
- {
- Free();
- m_Str = p_other.m_Str;
- p_other.m_Str = NULL; // Transfer the ownership
- return *this;
- }
- #endif
- wchar_t& operator[](size_t index)
- {
- if (index >= size())
- {
- resize(index);
- }
- return m_Str[index];
- }
- bool operator==(const WString& p_other) const
- {
- if (m_Str == NULL && p_other.m_Str == NULL)
- {
- return true;
- }
- else if ((m_Str == NULL && p_other.m_Str != NULL) || (m_Str != NULL && p_other.m_Str == NULL))
- {
- return false;
- }
- return wcscmp(c_str(), p_other.c_str()) == 0;
- }
- const wchar_t* c_str() const { return m_Str; }
- size_t size() const
- {
- if(m_Str == NULL)
- {
- return 0;
- }
- return (size_t)wcslen(m_Str);
- }
- AMF_INLINE size_t length() const { return size(); }
-
- void resize(size_t sizeAlloc)
- {
- if(sizeAlloc == 0)
- {
- Free();
- return;
- }
- wchar_t* str = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(sizeAlloc + 1));
- if(m_Str != NULL)
- {
- size_t copySize = sizeAlloc;
- if(copySize > size())
- {
- copySize = size();
- }
- memcpy(str, m_Str, copySize * sizeof(wchar_t));
- Free();
- str[sizeAlloc] = 0;
- }
- m_Str = str;
- }
- private:
- wchar_t* m_Str;
- };
- //-------------------------------------------------------------------------------------------------
- AMFVariant::String AMFVariant::ToString() const
- {
- String temp = GetValue<String, AMF_VARIANT_STRING>(AMFVariantGetString);
- return String(temp.c_str());
- }
- //-------------------------------------------------------------------------------------------------
- AMFVariant::WString AMFVariant::ToWString() const
- {
- WString temp = GetValue<WString, AMF_VARIANT_WSTRING>(AMFVariantGetWString);
- return WString(temp.c_str());
- }
- #endif // defined(__cplusplus)
- //----------------------------------------------------------------------------------------------
- // AMF_INLINE implementation of helper functions
- //----------------------------------------------------------------------------------------------
- #define AMF_VARIANT_RETURN_IF_INVALID_POINTER(p) \
- { \
- if(p == NULL) \
- { \
- return AMF_INVALID_POINTER; \
- } \
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantInit(AMFVariantStruct* pVariant)
- {
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant);
- pVariant->type = AMF_VARIANT_EMPTY;
- return AMF_OK;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantClear(AMFVariantStruct* pVariant)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pVariant);
- switch(AMFVariantGetType(pVariant))
- {
- case AMF_VARIANT_STRING:
- amf_variant_free(AMFVariantString(pVariant));
- pVariant->type = AMF_VARIANT_EMPTY;
- break;
- case AMF_VARIANT_WSTRING:
- amf_variant_free(AMFVariantWString(pVariant));
- pVariant->type = AMF_VARIANT_EMPTY;
- break;
- case AMF_VARIANT_INTERFACE:
- if(AMFVariantInterface(pVariant) != NULL)
- {
- #if defined(__cplusplus)
- AMFVariantInterface(pVariant)->Release();
- #else
- AMFVariantInterface(pVariant)->pVtbl->Release(AMFVariantInterface(pVariant));
- #endif
- AMFVariantInterface(pVariant) = NULL;
- }
- pVariant->type = AMF_VARIANT_EMPTY;
- break;
- default:
- pVariant->type = AMF_VARIANT_EMPTY;
- break;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCompare(const AMFVariantStruct* pFirst, const AMFVariantStruct* pSecond, amf_bool* bEqual)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pFirst);
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSecond);
-
- if(pFirst == pSecond)
- {
- *bEqual = true;
- }
- else if(AMFVariantGetType(pFirst) != AMFVariantGetType(pSecond))
- {
- *bEqual = false;
- }
- else
- {
- switch(AMFVariantGetType(pFirst))
- {
- case AMF_VARIANT_EMPTY:
- *bEqual = true;
- break;
- case AMF_VARIANT_BOOL:
- *bEqual = AMFVariantGetBool(pFirst) == AMFVariantBool(pSecond);
- break;
- case AMF_VARIANT_INT64:
- *bEqual = AMFVariantGetInt64(pFirst) == AMFVariantInt64(pSecond);
- break;
- case AMF_VARIANT_DOUBLE:
- *bEqual = AMFVariantGetDouble(pFirst) == AMFVariantDouble(pSecond);
- break;
- case AMF_VARIANT_FLOAT:
- *bEqual = AMFVariantGetFloat(pFirst) == AMFVariantFloat(pSecond);
- break;
- case AMF_VARIANT_RECT:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetRect(pFirst) == AMFVariantGetRect(pSecond);
- #else
- *bEqual = memcmp(&pFirst->rectValue, &pSecond->rectValue, sizeof(AMFRect)) == 0;
- #endif
- break;
- case AMF_VARIANT_SIZE:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetSize(pFirst) == AMFVariantGetSize(pSecond);
- #else
- *bEqual = memcmp(&pFirst->sizeValue, &pSecond->sizeValue, sizeof(AMFSize)) == 0;
- #endif
- break;
- case AMF_VARIANT_POINT:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetPoint(pFirst) == AMFVariantGetPoint(pSecond);
- #else
- *bEqual = memcmp(&pFirst->pointValue, &pSecond->pointValue, sizeof(AMFPoint)) == 0;
- #endif
- break;
- case AMF_VARIANT_FLOAT_SIZE:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetFloatSize(pFirst) == AMFVariantGetFloatSize(pSecond);
- #else
- *bEqual = memcmp(&pFirst->floatSizeValue, &pSecond->floatSizeValue, sizeof(AMFFloatPoint2D)) == 0;
- #endif
- break;
- case AMF_VARIANT_FLOAT_POINT2D:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetFloatPoint2D(pFirst) == AMFVariantGetFloatPoint2D(pSecond);
- #else
- *bEqual = memcmp(&pFirst->floatPoint2DValue, &pSecond->floatPoint2DValue, sizeof(AMFFloatPoint2D)) == 0;
- #endif
- break;
- case AMF_VARIANT_FLOAT_POINT3D:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetFloatPoint3D(pFirst) == AMFVariantGetFloatPoint3D(pSecond);
- #else
- *bEqual = memcmp(&pFirst->floatPoint3DValue, &pSecond->floatPoint3DValue, sizeof(AMFFloatPoint3D)) == 0;
- #endif
- break;
- case AMF_VARIANT_FLOAT_VECTOR4D:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetFloatVector4D(pFirst) == AMFVariantGetFloatVector4D(pSecond);
- #else
- *bEqual = memcmp(&pFirst->floatVector4DValue, &pSecond->floatVector4DValue, sizeof(AMFFloatPoint3D)) == 0;
- #endif
- break;
- case AMF_VARIANT_RATE:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetRate(pFirst) == AMFVariantGetRate(pSecond);
- #else
- *bEqual = memcmp(&pFirst->rateValue, &pSecond->rateValue, sizeof(AMFRate)) == 0;
- #endif
- break;
- case AMF_VARIANT_RATIO:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetRatio(pFirst) == AMFVariantGetRatio(pSecond);
- #else
- *bEqual = memcmp(&pFirst->ratioValue, &pSecond->ratioValue, sizeof(AMFRatio)) == 0;
- #endif
- break;
- case AMF_VARIANT_COLOR:
- #if defined(__cplusplus)
- *bEqual = AMFVariantGetColor(pFirst) == AMFVariantGetColor(pSecond);
- #else
- *bEqual = memcmp(&pFirst->colorValue, &pSecond->colorValue, sizeof(AMFColor)) == 0;
- #endif
- break;
- case AMF_VARIANT_STRING:
- *bEqual = strcmp(AMFVariantString(pFirst), AMFVariantString(pSecond)) == 0;
- break;
- case AMF_VARIANT_WSTRING:
- *bEqual = wcscmp(AMFVariantWString(pFirst), AMFVariantWString(pSecond)) == 0;
- break;
- case AMF_VARIANT_INTERFACE:
- *bEqual = AMFVariantInterface(pFirst) == AMFVariantInterface(pSecond);
- break;
- default:
- errRet = AMF_INVALID_ARG;
- break;
- }
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantCopy(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pSrc);
- if(pDest != pSrc)
- {
- switch(AMFVariantGetType(pSrc))
- {
- case AMF_VARIANT_EMPTY:
- errRet = AMFVariantClear(pDest);
- break;
- case AMF_VARIANT_BOOL:
- errRet = AMFVariantAssignBool(pDest, AMFVariantBool(pSrc));
- break;
- case AMF_VARIANT_INT64:
- errRet = AMFVariantAssignInt64(pDest, AMFVariantInt64(pSrc));
- break;
- case AMF_VARIANT_DOUBLE:
- errRet = AMFVariantAssignDouble(pDest, AMFVariantDouble(pSrc));
- break;
- case AMF_VARIANT_FLOAT:
- errRet = AMFVariantAssignFloat(pDest, AMFVariantFloat(pSrc));
- break;
- case AMF_VARIANT_RECT:
- errRet = AMFVariantAssignRect(pDest, &pSrc->rectValue);
- break;
- case AMF_VARIANT_SIZE:
- errRet = AMFVariantAssignSize(pDest, &pSrc->sizeValue);
- break;
- case AMF_VARIANT_POINT:
- errRet = AMFVariantAssignPoint(pDest, &pSrc->pointValue);
- break;
- case AMF_VARIANT_FLOAT_SIZE:
- errRet = AMFVariantAssignFloatSize(pDest, &pSrc->floatSizeValue);
- break;
- case AMF_VARIANT_FLOAT_POINT2D:
- errRet = AMFVariantAssignFloatPoint2D(pDest, &pSrc->floatPoint2DValue);
- break;
- case AMF_VARIANT_FLOAT_POINT3D:
- errRet = AMFVariantAssignFloatPoint3D(pDest, &pSrc->floatPoint3DValue);
- break;
- case AMF_VARIANT_FLOAT_VECTOR4D:
- errRet = AMFVariantAssignFloatVector4D(pDest, &pSrc->floatVector4DValue);
- break;
- case AMF_VARIANT_RATE:
- errRet = AMFVariantAssignRate(pDest, &pSrc->rateValue);
- break;
- case AMF_VARIANT_RATIO:
- errRet = AMFVariantAssignRatio(pDest, &pSrc->ratioValue);
- break;
- case AMF_VARIANT_COLOR:
- errRet = AMFVariantAssignColor(pDest, &pSrc->colorValue);
- break;
- case AMF_VARIANT_STRING:
- errRet = AMFVariantAssignString(pDest, AMFVariantString(pSrc));
- break;
- case AMF_VARIANT_WSTRING:
- errRet = AMFVariantAssignWString(pDest, AMFVariantWString(pSrc));
- break;
- case AMF_VARIANT_INTERFACE:
- errRet = AMFVariantAssignInterface(pDest, AMFVariantInterface(pSrc));
- break;
- default:
- errRet = AMF_INVALID_ARG;
- break;
- }
- }
- return errRet;
- }
- #define AMFVariantTypeEmpty AMF_VARIANT_EMPTY
- #define AMFVariantTypeBool AMF_VARIANT_BOOL
- #define AMFVariantTypeInt64 AMF_VARIANT_INT64
- #define AMFVariantTypeDouble AMF_VARIANT_DOUBLE
- #define AMFVariantTypeFloat AMF_VARIANT_FLOAT
- #define AMFVariantTypeRect AMF_VARIANT_RECT
- #define AMFVariantTypeSize AMF_VARIANT_SIZE
- #define AMFVariantTypePoint AMF_VARIANT_POINT
- #define AMFVariantTypeFloatPoint2D AMF_VARIANT_FLOAT_POINT2D
- #define AMFVariantTypeFloatPoint3D AMF_VARIANT_FLOAT_POINT3D
- #define AMFVariantTypeFloatVector4D AMF_VARIANT_FLOAT_VECTOR4D
-
- #define AMFVariantTypeRate AMF_VARIANT_RATE
- #define AMFVariantTypeRatio AMF_VARIANT_RATIO
- #define AMFVariantTypeColor AMF_VARIANT_COLOR
- #define AMFVariantTypeString AMF_VARIANT_STRING
- #define AMFVariantTypeWString AMF_VARIANT_WSTRING
- #define AMFVariantTypeInterface AMF_VARIANT_INTERFACE
- #if defined(__cplusplus)
-
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const AMFVariant::String& value)
- {
- return AMFVariantAssignString(pDest, value.c_str());
- }
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const AMFVariant::WString& value)
- {
- return AMFVariantAssignWString(pDest, value.c_str());
- }
-
- static AMF_INLINE amf_bool AMFConvertEmptyToBool(void*, AMF_RESULT& res) { res = AMF_OK; return false; }
- static AMF_INLINE amf_int64 AMFConvertEmptyToInt64(void*, AMF_RESULT& res) {res = AMF_OK; return 0; }
- static AMF_INLINE amf_double AMFConvertEmptyToDouble(void*, AMF_RESULT& res) {res = AMF_OK; return 0; }
- static AMF_INLINE amf_float AMFConvertEmptyToFloat(void*, AMF_RESULT& res) { res = AMF_OK; return 0; }
-
- static AMF_INLINE AMFVariant::String AMFConvertEmptyToString(void*, AMF_RESULT& res) {res = AMF_OK; return ""; }
- static AMF_INLINE AMFVariant::WString AMFConvertEmptyToWString(void*, AMF_RESULT& res) {res = AMF_OK; return L""; }
- static AMF_INLINE amf_int64 AMFConvertBoolToInt64(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1 : 0;}
- static AMF_INLINE amf_double AMFConvertBoolToDouble(bool value, AMF_RESULT& res){res = AMF_OK; return value ? 1.0 : 0.0;}
- static AMF_INLINE amf_float AMFConvertBoolToFloat(bool value, AMF_RESULT& res) { res = AMF_OK; return value ? 1.0f : 0.0f; }
- static AMF_INLINE AMFVariant::String AMFConvertBoolToString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? "true" : "false";}
- static AMF_INLINE AMFVariant::WString AMFConvertBoolToWString(bool value, AMF_RESULT& res){res = AMF_OK; return value ? L"true" : L"false";}
- static AMF_INLINE bool AMFConvertInt64ToBool(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return value != 0;}
- static AMF_INLINE amf_double AMFConvertInt64ToDouble(amf_int64 value, AMF_RESULT& res){res = AMF_OK;return (amf_double)value;}
- static AMF_INLINE amf_float AMFConvertInt64ToFloat(amf_int64 value, AMF_RESULT& res) { res = AMF_OK; return (amf_float)value; }
- static AMF_INLINE AMFVariant::String AMFConvertInt64ToString(amf_int64 value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%" AMFPRId64, (long long)value);
- return buff;
- }
- static AMF_INLINE AMFVariant::WString AMFConvertInt64ToWString(amf_int64 value, AMF_RESULT& res)
- {
- res = AMF_OK;
- wchar_t buff[0xFF];
- swprintf(buff, 0xFF, L"%" LPRId64, (long long)value);
- return buff;
- }
- static AMF_INLINE bool AMFConvertDoubleToBool(amf_double value, AMF_RESULT& res){res = AMF_OK;return value != 0;}
- static AMF_INLINE bool AMFConvertFloatToBool(amf_float value, AMF_RESULT& res) { res = AMF_OK; return value != 0; }
- static AMF_INLINE amf_int64 AMFConvertDoubleToInt64(amf_double value, AMF_RESULT& res){res = AMF_OK;return amf_int64(value);}
- static AMF_INLINE amf_int64 AMFConvertFloatToInt64(amf_float value, AMF_RESULT& res) { res = AMF_OK; return amf_int64(value); }
- static AMF_INLINE AMFVariant::String AMFConvertDoubleToString(amf_double value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%lf", value);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMFConvertFloatToString(amf_float value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%f", value);
- return buff;
- }
- static AMF_INLINE AMFVariant::WString AMFConvertDoubleToWString(amf_double value, AMF_RESULT& res)
- {
- res = AMF_OK;
- wchar_t buff[0xFF];
- swprintf(buff, 0xFF, L"%lf", value);
- return buff;
- }
- static AMF_INLINE AMFVariant::WString AMFConvertFloatToWString(amf_float value, AMF_RESULT& res)
- {
- res = AMF_OK;
- wchar_t buff[0xFF];
- swprintf(buff, 0xFF, L"%f", value);
- return buff;
- }
- static AMF_INLINE bool AMFConvertStringToBool(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFVariant::String tmp = value;
- if(( tmp == "true") || ( tmp == "True") || ( tmp == "TRUE") || ( tmp == "1") )
- {
- return true;
- }
- else
- {
- if(( tmp == "false") || ( tmp == "False") || ( tmp == "FALSE") || ( tmp == "0") )
- {
- return false;
- }
- }
- res = AMF_INVALID_ARG;
- return false;
- }
- static AMF_INLINE amf_int64 AMFConvertStringToInt64(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- long long tmp = 0;
- int readElements = 0;
- if(value.size() > 2 && ( value.c_str()[0] == '0') && ( value.c_str()[1] == 'x') )
- {
- readElements = sscanf(value.c_str(), "0x%" AMFPRIx64, &tmp);
- }
- else if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%" AMFPRId64, &tmp);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return 0;
- }
- static AMF_INLINE amf_double AMFConvertStringToDouble(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- amf_double tmp = 0;
- int readElements = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%lf", &tmp);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return 0;
- }
- static AMF_INLINE amf_float AMFConvertStringToFloat(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- amf_float tmp = 0;
- int readElements = 0;
- if (value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%f", &tmp);
- }
- if (readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return 0;
- }
- static AMF_INLINE AMFVariant::WString AMFConvertStringToWString(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- // return amf_from_utf8_to_unicode(value);
- AMFVariant::WString result;
- if(0 == value.size())
- {
- return result;
- }
- const char* pUtf8Buff = value.c_str();
- #if defined(_WIN32)
- _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
- int UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, NULL, 0);
- if(0 == UnicodeBuffSize)
- {
- return result;
- }
- UnicodeBuffSize += 8; // get some extra space
- result.resize(UnicodeBuffSize);
- UnicodeBuffSize = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Buff, -1, (LPWSTR)result.c_str(), UnicodeBuffSize);
- UnicodeBuffSize--;
- #elif defined(__ANDROID__)
- // on android mbstowcs cannot be used to define length
- char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
- mbstate_t mbs;
- mbrlen(NULL, 0, &mbs);
- int len = value.size();
- const char* pt = pUtf8Buff;
- int UnicodeBuffSize = 0;
- while(len > 0)
- {
- size_t length = mbrlen (pt, len, &mbs); //MM TODO Android always return 1
- if((length == 0) || (length > len))
- {
- break;
- }
- UnicodeBuffSize++;
- len -= length;
- pt += length;
- }
- UnicodeBuffSize += 8; // get some extra space
- result.resize(UnicodeBuffSize);
- mbrlen (NULL, 0, &mbs);
- len = value.size();
- pt = pUtf8Buff;
- UnicodeBuffSize = 0;
- while(len > 0)
- {
- size_t length = mbrlen (pt, len, &mbs);
- if((length == 0) || (length > len))
- {
- break;
- }
- mbrtowc(&((wchar_t*)(result.c_str()))[UnicodeBuffSize], pt, length, &mbs); //MM TODO Android always return 1 char
- UnicodeBuffSize++;
- len -= length;
- pt += length;
- }
- setlocale(LC_CTYPE, old_locale);
- #else
- char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
- size_t UnicodeBuffSize = mbstowcs(NULL, pUtf8Buff, 0);
- if(0 == UnicodeBuffSize)
- {
- return result;
- }
- UnicodeBuffSize += 8; // get some extra space
- result.resize(UnicodeBuffSize);
- UnicodeBuffSize = mbstowcs((wchar_t*)result.c_str(), pUtf8Buff, UnicodeBuffSize + 1);
- setlocale(LC_CTYPE, old_locale);
- #endif
- result.resize(UnicodeBuffSize);
- return result;
- }
- static AMF_INLINE AMFVariant::String AMFConvertWStringToString(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- // return amf_from_unicode_to_utf8(value);
- AMFVariant::String result;
- if(0 == value.size())
- {
- return result;
- }
- const wchar_t* pwBuff = value.c_str();
- #if defined(_WIN32)
- _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
- int Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, NULL, 0, NULL, NULL);
- if(0 == Utf8BuffSize)
- {
- return result;
- }
- Utf8BuffSize += 8; // get some extra space
- result.resize(Utf8BuffSize);
- Utf8BuffSize = ::WideCharToMultiByte(CP_UTF8, 0, pwBuff, -1, (LPSTR)result.c_str(), Utf8BuffSize, NULL, NULL);
- Utf8BuffSize--;
- #elif defined(__ANDROID__)
- char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
- int Utf8BuffSize = value.length();
- if(0 == Utf8BuffSize)
- {
- return result;
- }
- Utf8BuffSize += 8; // get some extra space
- result.resize(Utf8BuffSize);
- mbstate_t mbs;
- mbrlen(NULL, 0, &mbs);
- Utf8BuffSize = 0;
- for( int i = 0; i < value.length(); i++)
- {
- //MM TODO Android - not implemented
- //int written = wcrtomb(&result[Utf8BuffSize], pwBuff[i], &mbs);
- ((char*)(result.c_str()))[Utf8BuffSize] = (char)(pwBuff[i]);
- int written = 1;
- // temp replacement
- Utf8BuffSize += written;
- }
- setlocale(LC_CTYPE, old_locale);
- #else
- char* old_locale = setlocale(LC_CTYPE, "en_US.UTF8");
- size_t Utf8BuffSize = wcstombs(NULL, pwBuff, 0);
- if(0 == Utf8BuffSize)
- {
- return result;
- }
- Utf8BuffSize += 8; // get some extra space
- result.resize(Utf8BuffSize);
- Utf8BuffSize = wcstombs((char*)result.c_str(), pwBuff, Utf8BuffSize + 1);
- setlocale(LC_CTYPE, old_locale);
- #endif
- result.resize(Utf8BuffSize);
- return result;
- }
- static AMF_INLINE bool AMFConvertWStringToBool(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToBool(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE amf_int64 AMFConvertWStringToInt64(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToInt64(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE amf_double AMFConvertWStringToDouble(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToDouble(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE amf_float AMFConvertWStringToFloat(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToFloat(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRectToString(const AMFRect& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d,%d,%d", value.left, value.top, value.right, value.bottom);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertSizeToString(const AMFSize& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d", value.width, value.height);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertPointToString(const AMFPoint& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d", value.x, value.y);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatSizeToString(const AMFFloatSize& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%f,%f", value.width, value.height);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint2DToString(const AMFFloatPoint2D& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%f,%f", value.x, value.y);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatPoint3DToString(const AMFFloatPoint3D& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%f,%f,%f", value.x, value.y, value.z);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertFloatVector4DToString(const AMFFloatVector4D& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%f,%f,%f,%f", value.x, value.y, value.z, value.w);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRateToString(const AMFRate& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d", value.num, value.den);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertRatioToString(const AMFRatio& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d", value.num, value.den);
- return buff;
- }
- static AMF_INLINE AMFVariant::String AMF_STD_CALL AMFConvertColorToString(const AMFColor& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- char buff[0xFF];
- sprintf(buff, "%d,%d,%d,%d", value.r, value.g, value.b, value.a);
- return buff;
- }
- static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertStringToRect(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFRect tmp = {};
- int readElements = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%d,%d,%d,%d", &tmp.left, &tmp.top, &tmp.right, &tmp.bottom);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertStringToSize(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFSize tmp = {};
- int readElements = 0;
- if(value.size() > 0)
- {
- if(strchr(value.c_str(), ',') != nullptr)
- {
- readElements = sscanf(value.c_str(), "%d,%d", &tmp.width, &tmp.height);
- }
- else if (strchr(value.c_str(), 'x') != nullptr)
- {
- readElements = sscanf(value.c_str(), "%dx%d", &tmp.width, &tmp.height);
- }
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertStringToPoint(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFPoint tmp = {};
- int readElements = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%d,%d", &tmp.x, &tmp.y);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertStringToFloatSize(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFFloatSize tmp = {};
- int readElements = 0;
- if (value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%f,%f", &tmp.width, &tmp.height);
- }
- if (readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertStringToFloatPoint2D(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFFloatPoint2D tmp = {};
- int readElements = 0;
- if (value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%f,%f", &tmp.x, &tmp.y);
- }
- if (readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertStringToFloatPoint3D(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFFloatPoint3D tmp = {};
- int readElements = 0;
- if (value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%f,%f,%f", &tmp.x, &tmp.y, &tmp.z);
- }
- if (readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertStringToFloatVector4D(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFFloatVector4D tmp = {};
- int readElements = 0;
- if (value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%f,%f,%f,%f", &tmp.x, &tmp.y, &tmp.z, &tmp.w);
- }
- if (readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertStringToRate(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFRate tmp = {};
- int readElements = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertStringToRatio(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- AMFRatio tmp = {};
- int readElements = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%d,%d", &tmp.num, &tmp.den);
- }
- if(readElements)
- {
- return tmp;
- }
- res = AMF_INVALID_ARG;
- return tmp;
- }
- static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertStringToColor(const AMFVariant::String& value, AMF_RESULT& res)
- {
- res = AMF_OK;
- int readElements = 0;
- amf_uint32 r = 0;
- amf_uint32 g = 0;
- amf_uint32 b = 0;
- amf_uint32 a = 0;
- if(value.size() > 0)
- {
- readElements = sscanf(value.c_str(), "%u,%u,%u,%u", &r, &g, &b, &a);
- }
- if(readElements)
- {
- return AMFConstructColor((amf_uint8)r, (amf_uint8)g, (amf_uint8)b, (amf_uint8)a);
- }
- res = AMF_INVALID_ARG;
- return AMFConstructColor(0, 0, 0, 255);
- }
- ///////////////////////
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRectToWString(const AMFRect& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertRectToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertSizeToWString(const AMFSize& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertSizeToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertPointToWString(const AMFPoint& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertPointToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatSizeToWString(const AMFFloatSize& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertFloatSizeToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint2DToWString(const AMFFloatPoint2D& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertFloatPoint2DToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatPoint3DToWString(const AMFFloatPoint3D& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertFloatPoint3DToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertFloatVector4DToWString(const AMFFloatVector4D& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertFloatVector4DToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRateToWString(const AMFRate& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertRateToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertRatioToWString(const AMFRatio& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertRatioToString(value, res), res);
- }
- static AMF_INLINE AMFVariant::WString AMF_STD_CALL AMFConvertColorToWString(const AMFColor& value, AMF_RESULT& res)
- {
- return AMFConvertStringToWString(AMFConvertColorToString(value, res), res);
- }
- static AMF_INLINE AMFRect AMF_STD_CALL AMFConvertWStringToRect(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToRect(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFSize AMF_STD_CALL AMFConvertWStringToSize(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToSize(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFPoint AMF_STD_CALL AMFConvertWStringToPoint(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToPoint(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFFloatSize AMF_STD_CALL AMFConvertWStringToFloatSize(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToFloatSize(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFFloatPoint2D AMF_STD_CALL AMFConvertWStringToFloatPoint2D(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToFloatPoint2D(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFFloatPoint3D AMF_STD_CALL AMFConvertWStringToFloatPoint3D(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToFloatPoint3D(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFFloatVector4D AMF_STD_CALL AMFConvertWStringToFloatVector4D(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToFloatVector4D(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFRate AMF_STD_CALL AMFConvertWStringToRate(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToRate(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFRatio AMF_STD_CALL AMFConvertWStringToRatio(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToRatio(AMFConvertWStringToString(value, res), res);
- }
- static AMF_INLINE AMFColor AMF_STD_CALL AMFConvertWStringToColor(const AMFVariant::WString& value, AMF_RESULT& res)
- {
- return AMFConvertStringToColor(AMFConvertWStringToString(value, res), res);
- }
- //-------------------------------------------------------------------------------------------------
- #define AMFConvertTool(srcType, dstType)\
- if(AMFVariantGetType(pSrc) == AMFVariantType##srcType && newType == AMFVariantType##dstType)\
- {\
- AMF_RESULT res = AMF_OK;\
- AMFVariantAssign##dstType(pDest, AMFConvert##srcType##To##dstType(AMFVariant##srcType(pSrc), res));\
- return res;\
- }\
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantChangeType(AMFVariantStruct* pDest, const AMFVariantStruct* pSrc, AMF_VARIANT_TYPE newType)
- {
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- if(pSrc == 0)
- {
- pSrc = pDest;
- }
- if(AMFVariantGetType(pSrc) == newType)
- {
- if(pDest == pSrc)
- {
- return AMF_OK;
- }
- return AMFVariantCopy(pDest, pSrc);
- }
- AMFVariantClear(pDest);
- AMFConvertTool(Empty, Bool);
- AMFConvertTool(Empty, Int64);
- AMFConvertTool(Empty, Double);
- AMFConvertTool(Empty, Float);
- AMFConvertTool(Empty, String);
- AMFConvertTool(Empty, WString);
- AMFConvertTool(Bool, Int64);
- AMFConvertTool(Bool, Double);
- AMFConvertTool(Bool, Float);
- AMFConvertTool(Bool, String);
- AMFConvertTool(Bool, WString);
- AMFConvertTool(Int64, Bool);
- AMFConvertTool(Int64, Double);
- AMFConvertTool(Int64, Float);
- AMFConvertTool(Int64, String);
- AMFConvertTool(Int64, WString);
- AMFConvertTool(Double, Bool);
- AMFConvertTool(Double, Int64);
- AMFConvertTool(Double, String);
- AMFConvertTool(Double, String);
- AMFConvertTool(Float, Bool);
- AMFConvertTool(Float, Int64);
- AMFConvertTool(Float, String);
- AMFConvertTool(Float, String);
- AMFConvertTool(String, Bool);
- AMFConvertTool(String, Int64);
- AMFConvertTool(String, Double);
- AMFConvertTool(String, Float);
- AMFConvertTool(String, WString);
- AMFConvertTool(WString, Bool);
- AMFConvertTool(WString, Int64);
- AMFConvertTool(WString, Double);
- AMFConvertTool(WString, Float);
- AMFConvertTool(WString, String);
- AMFConvertTool(String, Rect);
- AMFConvertTool(String, Size);
- AMFConvertTool(String, Point);
- AMFConvertTool(String, Rate);
- AMFConvertTool(String, Ratio);
- AMFConvertTool(String, Color);
- AMFConvertTool(Rect , String);
- AMFConvertTool(Size , String);
- AMFConvertTool(Point, String);
- AMFConvertTool(Rate , String);
- AMFConvertTool(Ratio, String);
- AMFConvertTool(Color, String);
- AMFConvertTool(WString, Rect);
- AMFConvertTool(WString, Size);
- AMFConvertTool(WString, Point);
- AMFConvertTool(WString, Rate);
- AMFConvertTool(WString, Ratio);
- AMFConvertTool(WString, Color);
- AMFConvertTool(Rect , WString);
- AMFConvertTool(Size , WString);
- AMFConvertTool(Point, WString);
- AMFConvertTool(Rate , WString);
- AMFConvertTool(Ratio, WString);
- AMFConvertTool(Color, WString);
- return AMF_INVALID_ARG;
- }
- #endif // #if defined(__cplusplus)
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignBool(AMFVariantStruct* pDest, amf_bool value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_BOOL;
- AMFVariantBool(pDest) = value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInt64(AMFVariantStruct* pDest, amf_int64 value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_INT64;
- AMFVariantInt64(pDest) = value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignDouble(AMFVariantStruct* pDest, amf_double value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_DOUBLE;
- AMFVariantDouble(pDest) = value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloat(AMFVariantStruct* pDest, amf_float value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if (errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_FLOAT;
- AMFVariantFloat(pDest) = value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignString(AMFVariantStruct* pDest, const char* pValue)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- const size_t size = (strlen(pValue) + 1);
- pDest->type = AMF_VARIANT_STRING;
- AMFVariantString(pDest) = (char*)amf_variant_alloc(size * sizeof(char));
- if(AMFVariantString(pDest))
- {
- memcpy(AMFVariantString(pDest), pValue, size * sizeof(char));
- }
- else
- {
- errRet = AMF_OUT_OF_MEMORY;
- }
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignWString(AMFVariantStruct* pDest, const wchar_t* pValue)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- const size_t size = (wcslen(pValue) + 1);
- pDest->type = AMF_VARIANT_WSTRING;
- AMFVariantWString(pDest) = (wchar_t*)amf_variant_alloc(size * sizeof(wchar_t));
- if(AMFVariantWString(pDest))
- {
- memcpy(AMFVariantWString(pDest), pValue, size * sizeof(wchar_t));
- }
- else
- {
- errRet = AMF_OUT_OF_MEMORY;
- }
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignInterface(AMFVariantStruct* pDest, AMFInterface* pValue)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- //AMF_VARIANT_RETURN_IF_INVALID_POINTER(pValue);//can be NULL
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_INTERFACE;
- AMFVariantInterface(pDest) = pValue;
- if(AMFVariantInterface(pDest))
- {
- #if defined(__cplusplus)
- AMFVariantInterface(pDest)->Acquire();
- #else
- AMFVariantInterface(pDest)->pVtbl->Acquire(AMFVariantInterface(pDest));
- #endif
- }
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect(AMFVariantStruct* pDest, const AMFRect& value)
- {
- return AMFVariantAssignRect(pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRect (AMFVariantStruct* pDest, const AMFRect* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_RECT;
- AMFVariantRect(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize& value)
- {
- return AMFVariantAssignSize (pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignSize (AMFVariantStruct* pDest, const AMFSize* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_SIZE;
- AMFVariantSize(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint& value)
- {
- return AMFVariantAssignPoint(pDest, &value);
- }
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize& value)
- {
- return AMFVariantAssignFloatSize(pDest, &value);
- }
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D& value)
- {
- return AMFVariantAssignFloatPoint2D(pDest, &value);
- }
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D& value)
- {
- return AMFVariantAssignFloatPoint3D(pDest, &value);
- }
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D& value)
- {
- return AMFVariantAssignFloatVector4D(pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignPoint(AMFVariantStruct* pDest, const AMFPoint* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_POINT;
- AMFVariantPoint(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatSize(AMFVariantStruct* pDest, const AMFFloatSize* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if (errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_FLOAT_SIZE;
- AMFVariantFloatSize(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint2D(AMFVariantStruct* pDest, const AMFFloatPoint2D* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if (errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_FLOAT_POINT2D;
- AMFVariantFloatPoint2D(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatPoint3D(AMFVariantStruct* pDest, const AMFFloatPoint3D* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if (errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_FLOAT_POINT3D;
- AMFVariantFloatPoint3D(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignFloatVector4D(AMFVariantStruct* pDest, const AMFFloatVector4D* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if (errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_FLOAT_VECTOR4D;
- AMFVariantFloatVector4D(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate& value)
- {
- return AMFVariantAssignRate (pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRate (AMFVariantStruct* pDest, const AMFRate* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_RATE;
- AMFVariantRate(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio& value)
- {
- return AMFVariantAssignRatio(pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignRatio(AMFVariantStruct* pDest, const AMFRatio* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_RATIO;
- AMFVariantRatio(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor& value)
- {
- return AMFVariantAssignColor(pDest, &value);
- }
- #endif
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE AMF_RESULT AMF_CDECL_CALL AMFVariantAssignColor(AMFVariantStruct* pDest, const AMFColor* value)
- {
- AMF_RESULT errRet = AMF_OK;
- AMF_VARIANT_RETURN_IF_INVALID_POINTER(pDest);
- errRet = AMFVariantClear(pDest);
- if(errRet == AMF_OK)
- {
- pDest->type = AMF_VARIANT_COLOR;
- AMFVariantColor(pDest) = *value;
- }
- return errRet;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE char* AMF_CDECL_CALL AMFVariantDuplicateString(const char* from)
- {
- char* ret = 0;
- if(from)
- {
- ret = (char*)amf_variant_alloc(sizeof(char)*(strlen(from) + 1));
- if(ret)
- {
- strcpy(ret, from);
- }
- }
- return ret;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeString(char* from)
- {
- amf_variant_free(from);
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE wchar_t* AMF_CDECL_CALL AMFVariantDuplicateWString(const wchar_t* from)
- {
- wchar_t* ret = 0;
- if(from)
- {
- ret = (wchar_t*)amf_variant_alloc(sizeof(wchar_t)*(wcslen(from) + 1));
- if(ret)
- {
- wcscpy(ret, from);
- }
- }
- return ret;
- }
- //-------------------------------------------------------------------------------------------------
- static AMF_INLINE void AMF_CDECL_CALL AMFVariantFreeWString(wchar_t* from)
- {
- amf_variant_free(from);
- }
- //----------------------------------------------------------------------------------------------
- // AMF_INLINE implementation of AMFVariant class
- //----------------------------------------------------------------------------------------------
- #if defined(__cplusplus)
- AMF_INLINE AMFVariant::AMFVariant(const AMFVariantStruct* pOther)
- {
- AMFVariantInit(this);
- if(pOther != NULL)
- {
- AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther));
- }
- }
- //-------------------------------------------------------------------------------------------------
- template<typename T>
- AMFVariant::AMFVariant(const AMFInterfacePtr_T<T>& pValue)
- {
- AMFVariantInit(this);
- AMFVariantAssignInterface(this, pValue);
- }
- //-------------------------------------------------------------------------------------------------
- template<class ReturnType, AMF_VARIANT_TYPE variantType, typename Getter>
- ReturnType AMFVariant::GetValue(Getter getter) const
- {
- ReturnType str = ReturnType();
- if(AMFVariantGetType(this) == variantType)
- {
- str = static_cast<ReturnType>(getter(this));
- }
- else
- {
- AMFVariant varDest;
- varDest.ChangeType(variantType, this);
- if(varDest.type != AMF_VARIANT_EMPTY)
- {
- str = static_cast<ReturnType>(getter(&varDest));
- }
- }
- return str;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct& other)
- {
- AMFVariantCopy(this, const_cast<AMFVariantStruct*>(&other));
- return *this;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariantStruct* pOther)
- {
- if(pOther != NULL)
- {
- AMFVariantCopy(this, const_cast<AMFVariantStruct*>(pOther));
- }
- return *this;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE AMFVariant& AMFVariant::operator=(const AMFVariant& other)
- {
- AMFVariantCopy(this,
- const_cast<AMFVariantStruct*>(static_cast<const AMFVariantStruct*>(&other)));
- return *this;
- }
- //-------------------------------------------------------------------------------------------------
- template<typename T>
- AMFVariant& AMFVariant::operator=(const AMFInterfacePtr_T<T>& value)
- {
- AMFVariantAssignInterface(this, value);
- return *this;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct& other) const
- {
- return *this == &other;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE bool AMFVariant::operator==(const AMFVariantStruct* pOther) const
- {
- //TODO: double check
- amf_bool ret = false;
- if(pOther == NULL)
- {
- ret = false;
- }
- else
- {
- AMFVariantCompare(this, pOther, &ret);
- }
- return ret;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct& other) const
- {
- return !(*this == &other);
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE bool AMFVariant::operator!=(const AMFVariantStruct* pOther) const
- {
- return !(*this == pOther);
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE void AMFVariant::Attach(AMFVariantStruct& variant)
- {
- Clear();
- memcpy(this, &variant, sizeof(variant));
- AMFVariantGetType(&variant) = AMF_VARIANT_EMPTY;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE AMFVariantStruct AMFVariant::Detach()
- {
- AMFVariantStruct varResult = *this;
- AMFVariantGetType(this) = AMF_VARIANT_EMPTY;
- return varResult;
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE AMFVariantStruct& AMFVariant::GetVariant()
- {
- return *static_cast<AMFVariantStruct*>(this);
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE void AMFVariant::ChangeType(AMF_VARIANT_TYPE newType, const AMFVariant* pSrc)
- {
- AMFVariantChangeType(this, pSrc, newType);
- }
- //-------------------------------------------------------------------------------------------------
- AMF_INLINE bool AMFVariant::Empty() const
- {
- return type == AMF_VARIANT_EMPTY;
- }
- //-------------------------------------------------------------------------------------------------
- #endif // #if defined(__cplusplus)
- #if defined(__cplusplus)
- } //namespace amf
- #endif
- #endif //#ifndef AMF_Variant_h
|