diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:15:16 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:15:16 +0200 |
commit | bd6336c629841c6db3a6ca53a936d629d34db53b (patch) | |
tree | 3721ef997864108df175ce677a8a7d4342a6f1d2 /shared/com_ptr.h | |
parent | 4.0 (diff) | |
download | FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.gz FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.tar.bz2 FreeFileSync-bd6336c629841c6db3a6ca53a936d629d34db53b.zip |
4.1
Diffstat (limited to 'shared/com_ptr.h')
-rw-r--r-- | shared/com_ptr.h | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/shared/com_ptr.h b/shared/com_ptr.h deleted file mode 100644 index be1776fd..00000000 --- a/shared/com_ptr.h +++ /dev/null @@ -1,125 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** - -#ifndef SMART_COM_PTR_H -#define SMART_COM_PTR_H - -#include <Objbase.h> -#include <algorithm> - -namespace util -{ -/* -ComPtr: RAII class handling COM objects - -Example: - -------- - ComPtr<IUPnPDeviceFinder> devFinder; - if (FAILED(::CoCreateInstance(CLSID_UPnPDeviceFinder, - NULL, - CLSCTX_ALL, - IID_PPV_ARGS(devFinder.init())))) - return -1; - - ComPtr<IEnumUnknown> devEnum = com_dynamic_cast<IEnumUnknown>(devColl); - if (!devEnum) - return -1; -*/ - -template <class T> -class ComPtr -{ -public: - 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() - - - - - - - - - - - - - - - - - - - - - - - - - -//################# 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 -void swap(util::ComPtr<T>& lhs, util::ComPtr<T>& rhs) -{ - lhs.swap(rhs); -} - - -template <class S, class T> inline -ComPtr<S> com_dynamic_cast(const ComPtr<T>& other) //throw() -{ - ComPtr<S> outPtr; - if (other) - other->QueryInterface(IID_PPV_ARGS(outPtr.init())); - return outPtr; -} -} - - -#endif //SMART_COM_PTR_H
\ No newline at end of file |