//--------------------------------------------------------------------------- // Greenplum Database // Copyright (C) 2009 Greenplum, Inc. // // @filename: // CAutoRef.h // // @doc: // Basic auto pointer for ref-counted objects //--------------------------------------------------------------------------- #ifndef GPOS_CAutoRef_H #define GPOS_CAutoRef_H #include "gpos/base.h" #include "gpos/common/CAutoP.h" #include "gpos/common/CRefCount.h" namespace gpos { //--------------------------------------------------------------------------- // @class: // CAutoRef // // @doc: // Wrapps pointer of type T which is a subtype of CRefCount // //--------------------------------------------------------------------------- template class CAutoRef : public CAutoP { private: public: CAutoRef(const CAutoRef &) = delete; // ctor explicit CAutoRef() : CAutoP() { } // ctor explicit CAutoRef(T *object) : CAutoP(object) { } ~CAutoRef() override; // simple assignment CAutoRef const & operator=(T *object) { CAutoP::m_object = object; return *this; } }; // class CAutoRef //--------------------------------------------------------------------------- // @function: // CAutoRef::~CAutoRef // // @doc: // Dtor // //--------------------------------------------------------------------------- template CAutoRef::~CAutoRef() { if (nullptr != CAutoP::m_object) { reinterpret_cast(CAutoP::m_object)->Release(); } // null out pointer before ~CAutoP() gets called CAutoP::m_object = nullptr; } } // namespace gpos #endif // !GPOS_CAutoRef_H // EOF