diff --git a/device/adc_device_attribute.h b/device/adc_device_attribute.h index bc2337e..be2f866 100644 --- a/device/adc_device_attribute.h +++ b/device/adc_device_attribute.h @@ -42,6 +42,60 @@ static constexpr std::tuple +concept adc_attr_getter_c = std::is_null_pointer_v || + (traits::adc_func_traits::arity == 0 && !std::same_as, void>); + + +// attribute setter concept +template +concept adc_attr_setter_c = std::is_null_pointer_v || (traits::adc_func_traits::arity == 1); + + +// internal-to-user and user-to-internal type conversional function concept +template +concept adc_attr_convfunc_c = std::is_null_pointer_v || + (traits::adc_func_traits::arity == 1 && !std::same_as, void>); + + +// deduce attribute type from getter and setter functions signatures +template +using attr_value_t = + std::conditional_t, + std::conditional_t, std::nullptr_t, traits::adc_func_arg1_t>, + traits::adc_retval_t>; + + + +// deduce attribute internal type from conversional functions signatures +template +using attr_internal_t = std::conditional_t< + std::is_null_pointer_v, + std::conditional_t, std::nullptr_t, traits::adc_retval_t>, + traits::adc_retval_t>; + + +// deduce user-defined type from conversional functions signatures +template +using attr_user_t = std::conditional_t< + std::is_null_pointer_v, + std::conditional_t, std::nullptr_t, traits::adc_retval_t>, + traits::adc_retval_t>; + + +// attribute serializer function concept +template +concept adc_serializer_c = std::invocable && !std::same_as>; + + +// attribute deserializer function concept +template +concept adc_deserializer_c = std::invocable && !std::same_as>; + + // a callable and it has exactly one argument template concept adc_is_setter = adc_func_traits::arity == 1;