//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- #pragma once template class AutoPtr : public BasePtr { public: AutoPtr(T * ptr) : BasePtr(ptr) {} ~AutoPtr() { Clear(); } AutoPtr& operator=(T * ptr) { Clear(); this->ptr = ptr; return *this; } private: void Clear() { if (this->ptr != nullptr) { AllocatorDelete(HeapAllocatorT, &HeapAllocatorT::Instance, this->ptr); this->ptr = nullptr; } } }; template class AutoArrayPtr : public BasePtr { protected: size_t m_elementCount; public: AutoArrayPtr(T * ptr, size_t elementCount) : BasePtr(ptr), m_elementCount(elementCount) {} ~AutoArrayPtr() { Clear(); } void Set(T* ptr, int elementCount) { Clear(); this->ptr = ptr; this->m_elementCount = elementCount; } private: void Clear() { if (this->ptr != nullptr) { HeapDeleteArray(m_elementCount, this->ptr); this->ptr = nullptr; } } }; template class AutoArrayAndItemsPtr : public AutoArrayPtr { public: AutoArrayAndItemsPtr(T * ptr, size_t elementCount) : AutoArrayPtr(ptr, elementCount) {} ~AutoArrayAndItemsPtr() { Clear(); } private: void Clear() { if (this->ptr != nullptr){ for (size_t i = 0; i < this->m_elementCount; i++) { if (this->ptr[i] != nullptr) { this->ptr[i]->CleanUp(); this->ptr[i] = nullptr; } } HeapDeleteArray(this->m_elementCount, this->ptr); this->ptr = nullptr; } } }; template class AutoReleasePtr : public BasePtr { using BasePtr::ptr; public: AutoReleasePtr(T * ptr = nullptr) : BasePtr(ptr) {} ~AutoReleasePtr() { Release(); } void Release() { if (ptr != nullptr) { ptr->Release(); this->ptr = nullptr; } } }; template class AutoCOMPtr : public AutoReleasePtr { using BasePtr::ptr; public: AutoCOMPtr(T * ptr = nullptr) : AutoReleasePtr(ptr) { if (ptr != nullptr) { ptr->AddRef(); } } AutoCOMPtr(const AutoCOMPtr& other) { if ((ptr = other.ptr) != nullptr) { ptr->AddRef(); } } template HRESULT QueryInterface(Q** pp) const { return ptr->QueryInterface(__uuidof(Q), (void**)pp); } void Attach(T* p2) { if (ptr) { ptr->Release(); } ptr = p2; } operator T*() const { return (T*)ptr; } T& operator*() const { Assert(ptr != nullptr); return *ptr; } T* operator=(T* lp) { return (T*)ComPtrAssign((IUnknown**)&ptr, lp); } T** operator&() { return &ptr; } void SetPtr(T* ptr) { this->ptr = ptr; } private: static IUnknown* ComPtrAssign(IUnknown** pp, IUnknown* lp) { if (pp == nullptr) { return nullptr; } if (lp != nullptr) { lp->AddRef(); } if (*pp) { (*pp)->Release(); } *pp = lp; return lp; } }; template class AutoDiscardPTR : public BasePtr { public: AutoDiscardPTR(T * ptr) : BasePtr(ptr) {} ~AutoDiscardPTR() { Clear(); } AutoDiscardPTR& operator=(T * ptr) { Clear(); this->ptr = ptr; return *this; } private: void Clear() { if (this->ptr != nullptr) { this->ptr->Discard(); this->ptr = nullptr; } } }; template class AutoCoTaskMemFreePtr : public BasePtr { public: AutoCoTaskMemFreePtr(T* ptr) : BasePtr(ptr) {} ~AutoCoTaskMemFreePtr() { Clear(); } private: void Clear() { if (this->ptr != nullptr) { CoTaskMemFree(this->ptr); this->ptr = nullptr; } } };