This commit is contained in:
Timur A. Fatkhullin 2024-05-18 20:21:41 +03:00
parent 5dcc57707b
commit 2661a60b47

View File

@ -42,6 +42,60 @@ static constexpr std::tuple<bool,
namespace traits
{
/* concepts */
// attribute setter concept
template <typename T>
concept adc_attr_getter_c = std::is_null_pointer_v<T> ||
(traits::adc_func_traits<T>::arity == 0 && !std::same_as<traits::adc_retval_t<T>, void>);
// attribute setter concept
template <typename T>
concept adc_attr_setter_c = std::is_null_pointer_v<T> || (traits::adc_func_traits<T>::arity == 1);
// internal-to-user and user-to-internal type conversional function concept
template <typename T>
concept adc_attr_convfunc_c = std::is_null_pointer_v<T> ||
(traits::adc_func_traits<T>::arity == 1 && !std::same_as<traits::adc_retval_t<T>, void>);
// deduce attribute type from getter and setter functions signatures
template <adc_attr_getter_c GT, adc_attr_setter_c ST>
using attr_value_t =
std::conditional_t<std::is_null_pointer_v<GT>,
std::conditional_t<std::is_null_pointer_v<ST>, std::nullptr_t, traits::adc_func_arg1_t<ST>>,
traits::adc_retval_t<GT>>;
// deduce attribute internal type from conversional functions signatures
template <adc_attr_convfunc_c FromFuncT, adc_attr_convfunc_c ToFuncT>
using attr_internal_t = std::conditional_t<
std::is_null_pointer_v<ToFuncT>,
std::conditional_t<std::is_null_pointer_v<FromFuncT>, std::nullptr_t, traits::adc_retval_t<FromFuncT>>,
traits::adc_retval_t<ToFuncT>>;
// deduce user-defined type from conversional functions signatures
template <adc_attr_convfunc_c FromFuncT, adc_attr_convfunc_c ToFuncT>
using attr_user_t = std::conditional_t<
std::is_null_pointer_v<FromFuncT>,
std::conditional_t<std::is_null_pointer_v<ToFuncT>, std::nullptr_t, traits::adc_retval_t<ToFuncT>>,
traits::adc_retval_t<FromFuncT>>;
// attribute serializer function concept
template <typename T, typename VT>
concept adc_serializer_c = std::invocable<T, const VT&> && !std::same_as<void, traits::adc_retval_t<T>>;
// attribute deserializer function concept
template <typename T, typename ST>
concept adc_deserializer_c = std::invocable<T, const ST&> && !std::same_as<void, traits::adc_retval_t<T>>;
// a callable and it has exactly one argument
template <typename T>
concept adc_is_setter = adc_func_traits<T>::arity == 1;