From b338e29fd3eaf700f8c8360aa0310048ba941d54 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:12:46 +0200 Subject: 3.19 --- shared/com_ptr.h | 142 +++++++++++++------------------------------------------ 1 file changed, 34 insertions(+), 108 deletions(-) (limited to 'shared/com_ptr.h') 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 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 -ComPtr com_dynamic_cast(const ComPtr& 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().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 +ComPtr com_dynamic_cast(const ComPtr& other); //throw() @@ -79,112 +85,33 @@ ComPtr com_dynamic_cast(const ComPtr& other); //throw() -//################# Inline Implementation ############################# -template -inline -ComPtr::ComPtr() : ptr(NULL) {} -template -inline -ComPtr::ComPtr(const ComPtr& rhs) : ptr(rhs.ptr) -{ - if (ptr) - ptr->AddRef(); -} -template -inline -ComPtr& ComPtr::operator=(const ComPtr& rhs) -{ - ComPtr(rhs).swap(*this); - return *this; -} -template -inline -ComPtr::~ComPtr() -{ - if (ptr) - ptr->Release(); -} -template -inline -T** ComPtr::init() //get pointer for use with ::CoCreateInstance() -{ - ComPtr().swap(*this); - return &ptr; -} -template -inline -T* ComPtr::get() const -{ - return ptr; -} -template -inline -T* ComPtr::release() //throw() -{ - T* tmp = ptr; - ptr = NULL; - return tmp; -} -template -inline -void ComPtr::swap(ComPtr& 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 -inline +template inline void swap(util::ComPtr& lhs, util::ComPtr& rhs) { lhs.swap(rhs); } -template -inline -T* ComPtr::operator->() const -{ - return ptr; -} - - -/* -template -inline -ComPtr::operator bool() const -{ - return ptr != NULL; -} -*/ - - -template -inline -ComPtr::operator int ComPtr::ConversionToBool::* () const -{ - return ptr != NULL ? &ConversionToBool::dummy : NULL; -} - - -template -inline +template inline ComPtr com_dynamic_cast(const ComPtr& other) //throw() { ComPtr outPtr; @@ -192,7 +119,6 @@ ComPtr com_dynamic_cast(const ComPtr& other) //throw() other->QueryInterface(IID_PPV_ARGS(outPtr.init())); return outPtr; } - } -- cgit