forked from Alepha/Alepha
Start migrating some C++17 traits work to Concepts.
This commit is contained in:
@ -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 >
|
||||||
|
@ -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()
|
||||||
{
|
{
|
||||||
|
@ -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 > >;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user