diff options
Diffstat (limited to 'shared/com_ptr.h')
-rw-r--r-- | shared/com_ptr.h | 142 |
1 files changed, 34 insertions, 108 deletions
diff --git a/shared/com_ptr.h b/shared/com_ptr.h index d7178fbe..fa1b3e8f 100644 --- a/shared/com_ptr.h +++ b/shared/com_ptr.h @@ -33,43 +33,49 @@ template <class T> class ComPtr { public: - ComPtr(); - ComPtr(const ComPtr& rhs); - ComPtr& operator=(const ComPtr& rhs); - ~ComPtr(); - T** init(); //get pointer for use with ::CoCreateInstance() - T* get() const; - T* release(); //throw() - void swap(ComPtr& rhs); //throw() - T* operator->() const; - -private: - T* ptr; - - struct ConversionToBool { int dummy; }; -public: - operator int ConversionToBool::* () const; //use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) -}; - - -template <class S, class T> -ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw() - - - - + ComPtr() : ptr(NULL) {} + ComPtr(const ComPtr& rhs) : ptr(rhs.ptr) { if (ptr) ptr->AddRef(); } + ComPtr& operator=(const ComPtr& rhs) + { + ComPtr(rhs).swap(*this); + return *this; + } + ~ComPtr() { if (ptr) ptr->Release(); } + T** init() //get pointer for use with ::CoCreateInstance() + { + ComPtr<T>().swap(*this); + return &ptr; + } + T* get() const { return ptr; } + T* release() //throw() + { + T* tmp = ptr; + ptr = NULL; + return tmp; + } + void swap(ComPtr& rhs) { std::swap(ptr, rhs.ptr); } //throw() + T* operator->() const { return ptr; } +private: + T* ptr; + struct ConversionToBool { int dummy; }; +public: + //use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) + operator int ConversionToBool::* () const { return ptr != NULL ? &ConversionToBool::dummy : NULL; } +}; +template <class S, class T> +ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw() @@ -79,112 +85,33 @@ ComPtr<S> com_dynamic_cast(const ComPtr<T>& other); //throw() -//################# Inline Implementation ############################# -template <class T> -inline -ComPtr<T>::ComPtr() : ptr(NULL) {} -template <class T> -inline -ComPtr<T>::ComPtr(const ComPtr& rhs) : ptr(rhs.ptr) -{ - if (ptr) - ptr->AddRef(); -} -template <class T> -inline -ComPtr<T>& ComPtr<T>::operator=(const ComPtr<T>& rhs) -{ - ComPtr(rhs).swap(*this); - return *this; -} -template <class T> -inline -ComPtr<T>::~ComPtr() -{ - if (ptr) - ptr->Release(); -} -template <class T> -inline -T** ComPtr<T>::init() //get pointer for use with ::CoCreateInstance() -{ - ComPtr<T>().swap(*this); - return &ptr; -} -template <class T> -inline -T* ComPtr<T>::get() const -{ - return ptr; -} -template <class T> -inline -T* ComPtr<T>::release() //throw() -{ - T* tmp = ptr; - ptr = NULL; - return tmp; -} -template <class T> -inline -void ComPtr<T>::swap(ComPtr<T>& rhs) //throw() -{ - std::swap(ptr, rhs.ptr); -} +//################# Inline Implementation ############################# //we cannot specialize std::swap() for a class template and are not allowed to overload it => offer swap in own namespace -template <class T> -inline +template <class T> inline void swap(util::ComPtr<T>& lhs, util::ComPtr<T>& rhs) { lhs.swap(rhs); } -template <class T> -inline -T* ComPtr<T>::operator->() const -{ - return ptr; -} - - -/* -template <class T> -inline -ComPtr<T>::operator bool() const -{ - return ptr != NULL; -} -*/ - - -template <class T> -inline -ComPtr<T>::operator int ComPtr<T>::ConversionToBool::* () const -{ - return ptr != NULL ? &ConversionToBool::dummy : NULL; -} - - -template <class S, class T> -inline +template <class S, class T> inline ComPtr<S> com_dynamic_cast(const ComPtr<T>& other) //throw() { ComPtr<S> outPtr; @@ -192,7 +119,6 @@ ComPtr<S> com_dynamic_cast(const ComPtr<T>& other) //throw() other->QueryInterface(IID_PPV_ARGS(outPtr.init())); return outPtr; } - } |