1
0
forked from Alepha/Alepha

Conceptualize free spaceship_lens.

This commit is contained in:
2025-08-28 00:24:41 -04:00
parent bd1de0bba4
commit 9987e962a3

View File

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