forked from Alepha/Alepha
Conceptualize free spaceship_lens.
This commit is contained in:
@ -49,20 +49,20 @@ namespace Alepha::Hydrogen
|
||||
return t.spaceship_lens();
|
||||
}
|
||||
|
||||
template< typename T, typename= void >
|
||||
struct supports_spaceship_lens : std::false_type {};
|
||||
|
||||
template< typename T >
|
||||
struct supports_spaceship_lens< T, std::void_t< decltype( spaceship_lens( std::declval< const T & >() ) ) > > : std::true_type {};
|
||||
|
||||
template< typename T >
|
||||
constexpr bool supports_spaceship_lens_v= supports_spaceship_lens< T >::value;
|
||||
concept SpaceshipLensed=
|
||||
LensComparable< T >
|
||||
and
|
||||
requires( const T &lhs, const T &rhs )
|
||||
{
|
||||
{ spaceship_lens( lhs ) <=> rhs.spaceship_lens( rhs ) } -> SameAs< std::strong_ordering >;
|
||||
};
|
||||
|
||||
template< typename T >
|
||||
constexpr decltype( auto )
|
||||
make_spaceship_lens( T &t )
|
||||
{
|
||||
if constexpr( supports_spaceship_lens_v< T > ) return spaceship_lens( t );
|
||||
if constexpr( SpaceshipLensed< T > ) return spaceship_lens( t );
|
||||
//else if constexpr( supports_default_lens_v< T > ) return default_lens( t );
|
||||
else static_assert( Meta::dep_value< false, T > );
|
||||
}
|
||||
@ -84,14 +84,8 @@ namespace Alepha::Hydrogen
|
||||
return t.value_lens();
|
||||
}
|
||||
|
||||
template
|
||||
<
|
||||
LensComparable T,
|
||||
typename= std::enable_if_t< supports_spaceship_lens_v< T > >,
|
||||
overload< __LINE__ > = nullptr
|
||||
>
|
||||
constexpr decltype( auto )
|
||||
value_lens( T &t )
|
||||
value_lens( const SpaceshipLensed auto &t )
|
||||
{
|
||||
return spaceship_lens( t );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user