DNA Calib 1.1
Project brief
Classes | Public Types | Public Member Functions | Private Attributes | Friends | List of all members
pma::ScopedPtr< T, TDestroyer > Class Template Reference

Takes ownership over the given pointer and handles it's lifetime. More...

#include <ScopedPtr.h>

Inheritance diagram for pma::ScopedPtr< T, TDestroyer >:
Inheritance graph
Collaboration diagram for pma::ScopedPtr< T, TDestroyer >:
Collaboration graph

Classes

struct  inspect
 
struct  inspect< U[]>
 

Public Types

using pointer = typename inspect< T >::pointer_type
 
using element_type = typename inspect< T >::element_type
 
using destroyer_type = TDestroyer
 

Public Member Functions

 ScopedPtr ()
 
 ScopedPtr (pointer ptr_)
 
 ScopedPtr (pointer ptr_, destroyer_type &&destroyer)
 
 ~ScopedPtr ()
 
 ScopedPtr (std::nullptr_t)
 
ScopedPtroperator= (std::nullptr_t)
 
 ScopedPtr (const ScopedPtr &)=delete
 
ScopedPtroperator= (const ScopedPtr &)=delete
 
 ScopedPtr (ScopedPtr &&rhs) noexcept
 
ScopedPtroperator= (ScopedPtr &&rhs) noexcept
 
template<typename U , class UDestroyer >
 ScopedPtr (ScopedPtr< U, UDestroyer > &&rhs) noexcept
 
template<typename U , class UDestroyer >
ScopedPtroperator= (ScopedPtr< U, UDestroyer > &&rhs) noexcept
 
template<typename U = T, typename IA = typename inspect<U>::is_array>
std::enable_if< IA::value, element_type & >::type operator[] (std::size_t index) const noexcept
 
template<typename U = T, typename IA = typename inspect<U>::is_array>
std::enable_if<!IA::value, element_type & >::type operator* () const noexcept
 
pointer operator-> () const noexcept
 
 operator bool () const noexcept
 
pointer get () const noexcept
 
pointer release () noexcept
 
void reset (pointer rhs=pointer()) noexcept
 
void swap (ScopedPtr &rhs) noexcept
 

Private Attributes

pointer ptr
 

Friends

template<typename U , class UDestroyer >
class ScopedPtr
 

Detailed Description

template<class T, class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
class pma::ScopedPtr< T, TDestroyer >

Takes ownership over the given pointer and handles it's lifetime.

Note
As ScopedPtr inherits the specified destroyer type, stateless lifetime managers are zero-cost, but it's also possible to use stateful lifetime managers (such as lambdas with captures and what-not). For stateful lifetime managers, a dedicated constructor exists that receives the destroyer instance and initializes the inherited destroyer type with it.
See also
makeScoped
New
Delete
FactoryCreate
FactoryDestroy
DefaultInstanceCreator
DefaultInstanceDestroyer

Member Typedef Documentation

◆ destroyer_type

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
using pma::ScopedPtr< T, TDestroyer >::destroyer_type = TDestroyer

◆ element_type

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
using pma::ScopedPtr< T, TDestroyer >::element_type = typename inspect<T>::element_type

◆ pointer

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
using pma::ScopedPtr< T, TDestroyer >::pointer = typename inspect<T>::pointer_type

Constructor & Destructor Documentation

◆ ScopedPtr() [1/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( )
inline
141 : ptr{nullptr} {
142 }
pointer ptr
Definition: ScopedPtr.h:232

◆ ScopedPtr() [2/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( pointer  ptr_)
inlineexplicit
144 : ptr{ptr_} {
145 }

◆ ScopedPtr() [3/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( pointer  ptr_,
destroyer_type &&  destroyer 
)
inline
147 : destroyer_type{std::move(destroyer)}, ptr{ptr_} {
148 }
TDestroyer destroyer_type
Definition: ScopedPtr.h:135

◆ ~ScopedPtr()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::~ScopedPtr ( )
inline
150 {
151 if (ptr) {
152 destroyer_type::operator()(ptr);
153 ptr = pointer{};
154 }
155 }
typename inspect< T >::pointer_type pointer
Definition: ScopedPtr.h:133

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ ScopedPtr() [4/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( std::nullptr_t  )
inline
157 : ptr{nullptr} {
158 }

◆ ScopedPtr() [5/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( const ScopedPtr< T, TDestroyer > &  )
delete

◆ ScopedPtr() [6/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( ScopedPtr< T, TDestroyer > &&  rhs)
inlinenoexcept
168 : ptr{nullptr} {
169 rhs.swap(*this);
170 }

◆ ScopedPtr() [7/7]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
template<typename U , class UDestroyer >
pma::ScopedPtr< T, TDestroyer >::ScopedPtr ( ScopedPtr< U, UDestroyer > &&  rhs)
inlinenoexcept
178 : ptr{nullptr} {
179 ScopedPtr<T, destroyer_type> tmp{rhs.release(), static_cast<UDestroyer &&>(rhs)};
180 tmp.swap(*this);
181 }

Member Function Documentation

◆ get()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pointer pma::ScopedPtr< T, TDestroyer >::get ( ) const
inlinenoexcept
208 {
209 return ptr;
210 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ operator bool()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pma::ScopedPtr< T, TDestroyer >::operator bool ( ) const
inlinenoexcept
204 {
205 return ptr != nullptr;
206 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ operator*()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
template<typename U = T, typename IA = typename inspect<U>::is_array>
std::enable_if<!IA::value, element_type & >::type pma::ScopedPtr< T, TDestroyer >::operator* ( ) const
inlinenoexcept
196 {
197 return *ptr;
198 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ operator->()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pointer pma::ScopedPtr< T, TDestroyer >::operator-> ( ) const
inlinenoexcept
200 {
201 return ptr;
202 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ operator=() [1/4]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
ScopedPtr & pma::ScopedPtr< T, TDestroyer >::operator= ( const ScopedPtr< T, TDestroyer > &  )
delete

◆ operator=() [2/4]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
ScopedPtr & pma::ScopedPtr< T, TDestroyer >::operator= ( ScopedPtr< T, TDestroyer > &&  rhs)
inlinenoexcept
172 {
173 rhs.swap(*this);
174 return *this;
175 }

References pma::ScopedPtr< T, TDestroyer >::swap().

◆ operator=() [3/4]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
template<typename U , class UDestroyer >
ScopedPtr & pma::ScopedPtr< T, TDestroyer >::operator= ( ScopedPtr< U, UDestroyer > &&  rhs)
inlinenoexcept
184 {
185 ScopedPtr<T, destroyer_type> tmp{rhs.release(), static_cast<UDestroyer &&>(rhs)};
186 tmp.swap(*this);
187 return *this;
188 }

References pma::ScopedPtr< T, TDestroyer >::release().

◆ operator=() [4/4]

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
ScopedPtr & pma::ScopedPtr< T, TDestroyer >::operator= ( std::nullptr_t  )
inline
160 {
161 reset();
162 return *this;
163 }
void reset(pointer rhs=pointer()) noexcept
Definition: ScopedPtr.h:218

References pma::ScopedPtr< T, TDestroyer >::reset().

◆ operator[]()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
template<typename U = T, typename IA = typename inspect<U>::is_array>
std::enable_if< IA::value, element_type & >::type pma::ScopedPtr< T, TDestroyer >::operator[] ( std::size_t  index) const
inlinenoexcept
191 {
192 return ptr[index];
193 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

◆ release()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pointer pma::ScopedPtr< T, TDestroyer >::release ( )
inlinenoexcept
212 {
213 pointer result = nullptr;
214 std::swap(result, ptr);
215 return result;
216 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

Referenced by pma::ScopedPtr< T, TDestroyer >::operator=(), and pma::ScopedPtr< T, TDestroyer >::reset().

◆ reset()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
void pma::ScopedPtr< T, TDestroyer >::reset ( pointer  rhs = pointer())
inlinenoexcept
218 {
219 pointer old = release();
220 ptr = rhs;
221 if (old) {
222 destroyer_type::operator()(old);
223 }
224 }
pointer release() noexcept
Definition: ScopedPtr.h:212

References pma::ScopedPtr< T, TDestroyer >::ptr, and pma::ScopedPtr< T, TDestroyer >::release().

Referenced by pma::ScopedPtr< T, TDestroyer >::operator=().

◆ swap()

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
void pma::ScopedPtr< T, TDestroyer >::swap ( ScopedPtr< T, TDestroyer > &  rhs)
inlinenoexcept
226 {
227 std::swap(static_cast<destroyer_type&>(*this), static_cast<destroyer_type&>(rhs));
228 std::swap(ptr, rhs.ptr);
229 }

References pma::ScopedPtr< T, TDestroyer >::ptr.

Referenced by pma::ScopedPtr< T, TDestroyer >::operator=().

Friends And Related Function Documentation

◆ ScopedPtr

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
template<typename U , class UDestroyer >
friend class ScopedPtr
friend

Member Data Documentation

◆ ptr

template<class T , class TDestroyer = typename DefaultInstanceDestroyer<T>::type>
pointer pma::ScopedPtr< T, TDestroyer >::ptr
private

The documentation for this class was generated from the following file: