56a10b43b4
- miglioramento e irrobustimento a PtrOwner.
77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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<T2>& RPT).
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
template <class T>
|
|
class PtrOwner
|
|
{
|
|
public :
|
|
explicit PtrOwner( void) : m_pT( nullptr) {}
|
|
explicit PtrOwner( T* pT) : m_pT( pT) {}
|
|
PtrOwner( PtrOwner<T>&& RPT) : m_pT( Release( RPT)) {}
|
|
PtrOwner( const PtrOwner<T>& RPT) = delete ;
|
|
~PtrOwner( void) { Reset() ; }
|
|
bool Set( T* pT) { Reset() ; m_pT = pT ; return ( m_pT != nullptr) ; }
|
|
template <class T2> bool Set( PtrOwner<T2>& 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<T>& operator=( PtrOwner<T>&& RPT)
|
|
{ if ( this != &RPT)
|
|
Set( Release( RPT)) ;
|
|
return (*this) ;
|
|
}
|
|
PtrOwner<T>& operator=( const PtrOwner<T>& RPT) = delete ;
|
|
|
|
private :
|
|
T* m_pT ;
|
|
|
|
template <class T> friend bool IsNull( PtrOwner<T>& RPT) ;
|
|
template <class T> friend T* Get( PtrOwner<T>& RPT) ;
|
|
template <class T> friend T* Release( PtrOwner<T>& RPT) ;
|
|
} ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
template <class T>
|
|
bool
|
|
IsNull( PtrOwner<T>& RPT)
|
|
{
|
|
return ( RPT.m_pT == nullptr) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
template <class T>
|
|
T*
|
|
Get( PtrOwner<T>& RPT)
|
|
{
|
|
return RPT.m_pT ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
template <class T>
|
|
T*
|
|
Release( PtrOwner<T>& RPT)
|
|
{
|
|
T* pT = RPT.m_pT ;
|
|
RPT.m_pT = nullptr ;
|
|
return pT ;
|
|
}
|