#pragma once /* ABSTRACT DEVICE COMPONENTS LIBRARY */ #include "../common/adc_value.h" namespace adc { template class AdcDeviceAttribute : public AdcSerializingValueHolder { using base_t = AdcSerializingValueHolder; template using ret_value_t = base_t::template ret_value_t; public: typedef IdentT ident_t; typedef SerializedT serialized_t; enum AccessType { ReadOnly, WriteOnly, ReadWrite }; template constexpr static T DummyGetter() { return std::declval(); } template constexpr static void DummySetter(const T&) { } template constexpr static SerializedT DummySerializer(const T&) { return std::declval(); } template constexpr static T DummyDeserializer(const SerializedT&) { return std::declval(); } /* CONSTRUCTORS AND DESTRUCTOR */ // general read-write attribute constructor template , typename VT = decltype(AdcValueHolder::AdcValueHolderDummyValidator), typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize), typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize)> AdcDeviceAttribute(const IdentT& ident, AccessType access_type, GT&& getter, ST&& setter, VT&& validator = AdcValueHolder::AdcValueHolderDummyValidator, SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize, DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) requires std::invocable && std::invocable && std::predicate && std::invocable && std::invocable : base_t(std::forward(getter), std::forward(setter), std::forward(validator), std::forward(serializer), std::forward(deserializer)), _ident(ident), _accessType(access_type) { } // read-only attribute constructor template , typename SRT = decltype(utils::AdcDefaultValueConverter<>::serialize)> AdcDeviceAttribute(const IdentT& ident, GT&& getter, SRT&& serializer = utils::AdcDefaultValueConverter<>::serialize) requires std::invocable && std::invocable : AdcDeviceAttribute(ident, ReadOnly, std::forward(getter), AdcDeviceAttribute::DummySetter, AdcValueHolder::AdcValueHolderDummyValidator, std::forward(serializer), AdcDeviceAttribute::DummyDeserializer) { } // write-only attribute constructor template >, typename DSRT = decltype(utils::AdcDefaultValueConverter<>::deserialize)> AdcDeviceAttribute(const IdentT& ident, ST&& setter, std::predicate auto&& validator, DSRT&& deserializer = utils::AdcDefaultValueConverter<>::deserialize) requires std::invocable : AdcDeviceAttribute(ident, WriteOnly, AdcDeviceAttribute::DummyGetter, std::forward(setter), std::forward(validator), AdcDeviceAttribute::DummySerializer, std::forward(deserializer)) { } // constructor of attribute with trivially casting type converters template AdcDeviceAttribute(const std::tuple&, Ts&&... ctor_args) : AdcDeviceAttribute(std::forward(ctor_args)...) { } virtual ~AdcDeviceAttribute() = default; IdentT ident() const { return _ident; } AccessType accessType() const { return _accessType; } using base_t::operator=; protected: IdentT _ident; AccessType _accessType; }; } // namespace adc