//---------------------------------------------------------------------------- // EgalTech 2013-2023 //---------------------------------------------------------------------------- // File : EgtPointerOwner.h Data : 27.03.23 Versione : 2.5c3 // Contenuto : Dichiarazione classe template per puntatore con auto rilascio. // // // // Modifiche : 25.11.13 DS Creazione modulo. // 27.03.23 DS Aggiunta Set( PtrOwner& RPT). // //---------------------------------------------------------------------------- #pragma once //---------------------------------------------------------------------------- template class PtrOwner { public : explicit PtrOwner( void) : m_pT( nullptr) {} explicit PtrOwner( T* pT) : m_pT( pT) {} PtrOwner( PtrOwner&& RPT) noexcept : m_pT( Release( RPT)) {} PtrOwner( const PtrOwner& RPT) = delete ; ~PtrOwner( void) { Reset() ; } bool Set( T* pT) { Reset() ; m_pT = pT ; return ( m_pT != nullptr) ; } template bool Set( PtrOwner& RPT) { if ( (void*) this == (void*) &RPT) return true ; return Set( Release( RPT)) ; } void Reset( void) { if ( m_pT != nullptr) delete m_pT ; m_pT = nullptr ; } T& operator*() const { return *m_pT ; } T* operator->() const { return m_pT ; } operator T*() const { return m_pT ; } PtrOwner& operator=( PtrOwner&& RPT) { if ( this != &RPT) Set( Release( RPT)) ; return (*this) ; } PtrOwner& operator=( const PtrOwner& RPT) = delete ; private : T* m_pT ; template friend bool IsNull( PtrOwner& RPT) ; template friend T* Get( PtrOwner& RPT) ; template friend T* Release( PtrOwner& RPT) ; } ; //---------------------------------------------------------------------------- template bool IsNull( PtrOwner& RPT) { return ( RPT.m_pT == nullptr) ; } //---------------------------------------------------------------------------- template T* Get( PtrOwner& RPT) { return RPT.m_pT ; } //---------------------------------------------------------------------------- template T* Release( PtrOwner& RPT) { T* pT = RPT.m_pT ; RPT.m_pT = nullptr ; return pT ; }