Files
Include/EgtPointerOwner.h
T
Dario Sassi 84ae21db77 Include :
- aggiornamento prototipi.
2026-03-13 13:36:31 +01:00

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) noexcept : 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 ;
}