#pragma once #include namespace adc::interfaces { // ADC device attribute concept template concept adc_device_attr_c = requires(T t, const T const_t) { typename T::ident_t; typename T::default_serialized_t; { const_t.ident() } -> std::same_as; // serializer and desiarializer must return/accept at least a value of type T::default_serialized_t { t.serialize() } -> std::convertible_to; t.deserialize(std::declval()); }; // ADC device command concept template concept adc_device_cmd_c = requires(T t, const T const_t) { typename T::ident_t; { const_t.ident() } -> std::same_as; t(); // operator()() }; // ADC device concept template concept adc_device_c = requires(T t, const T const_t) { typename T::ident_t; requires adc_device_attr_c; requires adc_device_cmd_c; typename T::attr_ident_t; typename T::cmd_ident_t; { const_t.ident() } -> std::same_as; t(std::declval()); // operator()(cmd_ident_t) { t[std::declval()] } -> std::same_as; // attribute_t& operator[](attr_ident_t) }; } // namespace adc::interfaces