summaryrefslogtreecommitdiff
path: root/shared/com_ptr.h
diff options
context:
space:
mode:
Diffstat (limited to 'shared/com_ptr.h')
-rw-r--r--shared/com_ptr.h142
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;
}
-
}
bgstack15