forked from Alepha/Alepha
Apply the newer namespace rules and layout/formatting.
This commit is contained in:
115
AutoRAII.h
115
AutoRAII.h
@ -9,78 +9,73 @@ static_assert( __cplusplus > 2020'99 );
|
||||
|
||||
#include <boost/noncopyable.hpp>
|
||||
|
||||
namespace Alepha::Hydrogen
|
||||
namespace Alepha::Hydrogen ::detail:: AutoRAII_m
|
||||
{
|
||||
inline namespace exports { inline namespace AutoRAII_m {} }
|
||||
|
||||
namespace detail::AutoRAII_m
|
||||
inline namespace exports
|
||||
{
|
||||
inline namespace exports
|
||||
template< typename T, typename Dtor= std::function< void ( T ) > >
|
||||
class AutoRAII : boost::noncopyable
|
||||
{
|
||||
template< typename T, typename Dtor= std::function< void ( T ) > >
|
||||
class AutoRAII : boost::noncopyable
|
||||
{
|
||||
private:
|
||||
Dtor dtor;
|
||||
T value;
|
||||
private:
|
||||
Dtor dtor;
|
||||
T value;
|
||||
|
||||
public:
|
||||
~AutoRAII()
|
||||
public:
|
||||
~AutoRAII()
|
||||
{
|
||||
if constexpr( std::is_same_v< Dtor, std::function< void ( T ) > > )
|
||||
{
|
||||
if constexpr( std::is_same_v< Dtor, std::function< void ( T ) > > )
|
||||
{
|
||||
if( dtor == nullptr ) return;
|
||||
}
|
||||
dtor( value );
|
||||
if( dtor == nullptr ) return;
|
||||
}
|
||||
dtor( value );
|
||||
}
|
||||
|
||||
template< typename Ctor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor dtor ) : dtor( std::move( dtor ) ), value( ctor() ) {}
|
||||
template< typename Ctor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor dtor ) : dtor( std::move( dtor ) ), value( ctor() ) {}
|
||||
|
||||
operator const T &() const { return value; }
|
||||
operator const T &() const { return value; }
|
||||
|
||||
decltype( auto )
|
||||
operator *() const
|
||||
requires( std::is_pointer_v< T > )
|
||||
decltype( auto )
|
||||
operator *() const
|
||||
requires( std::is_pointer_v< T > )
|
||||
{
|
||||
return *value;
|
||||
}
|
||||
|
||||
decltype( auto )
|
||||
operator->() const
|
||||
requires( std::is_pointer_v< T > )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
||||
template< typename Dtor >
|
||||
class AutoRAII< void, Dtor > : boost::noncopyable
|
||||
{
|
||||
private:
|
||||
Dtor dtor;
|
||||
|
||||
public:
|
||||
~AutoRAII()
|
||||
{
|
||||
if constexpr( std::is_same_v< Dtor, std::function< void () > > )
|
||||
{
|
||||
return *value;
|
||||
if( dtor == nullptr ) return;
|
||||
}
|
||||
|
||||
decltype( auto )
|
||||
operator->() const
|
||||
requires( std::is_pointer_v< T > )
|
||||
{
|
||||
return value;
|
||||
}
|
||||
};
|
||||
dtor();
|
||||
}
|
||||
|
||||
template< typename Dtor >
|
||||
class AutoRAII< void, Dtor > : boost::noncopyable
|
||||
{
|
||||
private:
|
||||
Dtor dtor;
|
||||
template< typename Ctor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor dtor ) : dtor( std::move( dtor ) ) { ctor(); }
|
||||
};
|
||||
|
||||
public:
|
||||
~AutoRAII()
|
||||
{
|
||||
if constexpr( std::is_same_v< Dtor, std::function< void () > > )
|
||||
{
|
||||
if( dtor == nullptr ) return;
|
||||
}
|
||||
dtor();
|
||||
}
|
||||
|
||||
template< typename Ctor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor dtor ) : dtor( std::move( dtor ) ) { ctor(); }
|
||||
};
|
||||
|
||||
template< typename Ctor, typename Dtor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor ) -> AutoRAII< decltype( ctor() ), Dtor >;
|
||||
}
|
||||
}
|
||||
|
||||
namespace exports::AutoRAII_m
|
||||
{
|
||||
using namespace detail::AutoRAII_m::exports;
|
||||
template< typename Ctor, typename Dtor >
|
||||
explicit AutoRAII( Ctor ctor, Dtor ) -> AutoRAII< decltype( ctor() ), Dtor >;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Alepha::Hydrogen::inline exports::inline AutoRAII_m
|
||||
{
|
||||
using namespace detail::AutoRAII_m::exports;
|
||||
}
|
||||
|
Reference in New Issue
Block a user