From 635860845790a19bf50bbc51ba8fb66a96dde068 Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Thu, 5 Mar 2009 14:34:32 -0800 Subject: auto import from //depot/cupcake/@136594 --- WebKit/win/COMVariantSetter.h | 75 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 5 deletions(-) (limited to 'WebKit/win/COMVariantSetter.h') diff --git a/WebKit/win/COMVariantSetter.h b/WebKit/win/COMVariantSetter.h index 5c6b21c..76ca927 100644 --- a/WebKit/win/COMVariantSetter.h +++ b/WebKit/win/COMVariantSetter.h @@ -36,7 +36,15 @@ namespace WebCore { template struct COMVariantSetter {}; -template<> struct COMVariantSetter +template struct COMVariantSetterBase +{ + static inline VARENUM variantType(const T&) + { + return COMVariantSetter::VariantType; + } +}; + +template<> struct COMVariantSetter : COMVariantSetterBase { static const VARENUM VariantType = VT_BSTR; @@ -49,7 +57,7 @@ template<> struct COMVariantSetter } }; -template<> struct COMVariantSetter +template<> struct COMVariantSetter : COMVariantSetterBase { static const VARENUM VariantType = VT_UI8; @@ -62,7 +70,7 @@ template<> struct COMVariantSetter } }; -template<> struct COMVariantSetter +template<> struct COMVariantSetter : COMVariantSetterBase { static const VARENUM VariantType = VT_I4; @@ -75,7 +83,7 @@ template<> struct COMVariantSetter } }; -template struct COMVariantSetter > +template struct COMVariantSetter > : COMVariantSetterBase > { static const VARENUM VariantType = VT_UNKNOWN; @@ -90,7 +98,7 @@ template struct COMVariantSetter > }; template -struct COMIUnknownVariantSetter +struct COMIUnknownVariantSetter : COMVariantSetterBase { static const VARENUM VariantType = VT_UNKNOWN; @@ -103,4 +111,61 @@ struct COMIUnknownVariantSetter } }; +class COMVariant { +public: + COMVariant() + { + ::VariantInit(&m_variant); + } + + template + COMVariant(UnderlyingType value) + { + ::VariantInit(&m_variant); + COMVariantSetter::setVariant(&m_variant, value); + } + + ~COMVariant() + { + ::VariantClear(&m_variant); + } + + COMVariant(const COMVariant& other) + { + ::VariantInit(&m_variant); + other.copyTo(&m_variant); + } + + COMVariant& operator=(const COMVariant& other) + { + other.copyTo(&m_variant); + return *this; + } + + void copyTo(VARIANT* dest) const + { + ::VariantCopy(dest, const_cast(&m_variant)); + } + + VARENUM variantType() const { return static_cast(V_VT(&m_variant)); } + +private: + VARIANT m_variant; +}; + +template<> struct COMVariantSetter +{ + static inline VARENUM variantType(const COMVariant& value) + { + return value.variantType(); + } + + static void setVariant(VARIANT* variant, const COMVariant& value) + { + ASSERT(V_VT(variant) == VT_EMPTY); + + value.copyTo(variant); + } +}; + #endif // COMVariantSetter -- cgit v1.1