1
0
forked from Alepha/Alepha

Apply the newer namespace rules and layout/formatting.

This commit is contained in:
2024-04-02 23:32:02 -04:00
parent 53a4d91a23
commit 373b07e1c4
31 changed files with 501 additions and 536 deletions

View File

@ -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;
}