1
0
forked from Alepha/Alepha

Start migrating some C++17 traits work to Concepts.

This commit is contained in:
2023-10-25 22:23:17 -04:00
parent a62335960e
commit ae5151c913
3 changed files with 27 additions and 32 deletions

View File

@ -56,6 +56,8 @@ namespace Alepha::Hydrogen ::detail:: core_concepts
and ConvertibleTo< T, Target > and ConvertibleTo< T, Target >
; ;
template< typename T >
concept EmptyType= std::is_empty_v< T >;
// Stream related concepts... // Stream related concepts...
template< typename T > template< typename T >

View File

@ -8,6 +8,8 @@ static_assert( __cplusplus > 2020'00 );
#include <utility> #include <utility>
#include <type_traits> #include <type_traits>
#include <Alepha/Concepts.h>
#include <Alepha/Reflection/detail/config.h> #include <Alepha/Reflection/detail/config.h>
#include <Alepha/Reflection/aggregate_initialization.h> #include <Alepha/Reflection/aggregate_initialization.h>
@ -82,15 +84,15 @@ namespace Alepha::Hydrogen::Reflection
template< typename Aggregate > template< typename Aggregate >
struct empty_base struct empty_base
{ {
template template< typename T >
< requires
typename T, (
true
//typename= typename checker< std::decay_t< T > >::type, //typename= typename checker< std::decay_t< T > >::type,
typename= std::enable_if_t< std::is_empty_v< std::decay_t< T > > >, and EmptyType< std::decay_t< T > >
typename= std::enable_if_t< not std::is_same_v< std::decay_t< T >, Aggregate > >, and not SameAs< std::decay_t< T >, Aggregate >
typename= std::enable_if_t< std::is_base_of_v< std::decay_t< T >, Aggregate > >, and DerivedFrom< Aggregate, std::decay_t< T > >
overload< __LINE__ > = nullptr )
>
constexpr operator T (); constexpr operator T ();
//template< typename T > constexpr operator T ()= delete; //template< typename T > constexpr operator T ()= delete;
@ -130,22 +132,16 @@ namespace Alepha::Hydrogen::Reflection
} }
} }
template< typename T, typename Tuple, typename= void > template< typename T, typename Tuple >
struct is_constructible_from_tuple : std::false_type {}; constexpr bool is_constructible_from_tuple_v= false;
template< typename T, typename ... TupleArgs > template< typename T, typename ... TupleArgs >
struct is_constructible_from_tuple constexpr bool is_constructible_from_tuple_v< T, std::tuple< TupleArgs... > >
< {
T, ConstructibleFrom< T, TupleArgs... >
std::tuple< TupleArgs... >, };
std::void_t< decltype( T{ std::declval< TupleArgs >()... } ) >
> template< Aggregate T, typename InitTuple, std::size_t index= 0 >
: std::true_type {};
template< typename T, typename Tuple >
constexpr bool is_constructible_from_tuple_v= is_constructible_from_tuple< T, Tuple >::value;
template< typename T, typename InitTuple, std::size_t index= 0, typename= std::enable_if_t< std::is_aggregate_v< T > > >
constexpr auto constexpr auto
build_base_tuple() build_base_tuple()
{ {
@ -174,7 +170,7 @@ namespace Alepha::Hydrogen::Reflection
return 0; return 0;
} }
template< typename T, std::size_t index= 0, typename= std::enable_if_t< std::is_aggregate_v< T > > > template< Aggregate T, std::size_t index= 0 >
constexpr std::size_t constexpr std::size_t
count_empty_bases() count_empty_bases()
{ {

View File

@ -17,21 +17,18 @@ namespace Alepha::Hydrogen::Reflection
{ {
inline namespace exports {} inline namespace exports {}
template< typename T, typename= void >
struct has_salient_members_constant : std::false_type {};
template< typename T > template< typename T >
struct has_salient_members_constant< T, std::void_t< decltype( T::salient_members ) > > concept SalientMembers=
: std::true_type {}; requires( const T &t )
{
template< typename T > { T::salient_members } -> ConvertibleTo< std::size_t >;
constexpr bool has_salient_members_constant_v= has_salient_members_constant< T >::value; };
template< typename T > template< typename T >
constexpr std::size_t constexpr std::size_t
compute_salient_members_count_impl() compute_salient_members_count_impl()
{ {
if constexpr( has_salient_members_constant_v< T > ) return T::salient_members; if constexpr( SalientMembers< T > ) return T::salient_members;
else return aggregate_member_count_v< std::decay_t< T > >; else return aggregate_member_count_v< std::decay_t< T > >;
} }