22#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
23#include "cc_tools_qt/field/ToolsFloatField.h"
25#include "comms/field/FloatValue.h"
38template <
typename TField>
39class ToolsFloatFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsFloatField, TField>
41 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsFloatField, TField>;
43 static_assert(comms::field::isFloatValue<Field>(),
"Must be of FloatValueField type");
46 using UnderlyingType =
typename Base::UnderlyingType;
47 using Ptr =
typename Base::Ptr;
48 using ActPtr =
typename Base::ActPtr;
49 using SpecialsList =
typename Base::SpecialsList;
51 explicit ToolsFloatFieldImpl(Field& fieldRef)
56 ToolsFloatFieldImpl(
const ToolsFloatFieldImpl&) =
default;
57 ToolsFloatFieldImpl(ToolsFloatFieldImpl&&) =
default;
58 virtual ~ToolsFloatFieldImpl() noexcept = default;
60 ToolsFloatFieldImpl& operator=(const ToolsFloatFieldImpl&) = delete;
63 virtual Ptr cloneImpl()
override
65 return ActPtr(
new ToolsFloatFieldImpl<TField>(Base::field()));
68 virtual bool isNanImpl()
const override
70 return std::isnan(Base::field().getValue());
73 virtual void setNanImpl()
override
75 setFieldValueInternal(std::numeric_limits<typename TField::ValueType>::quiet_NaN());
78 virtual bool isInfImpl()
const override
80 return std::isinf(Base::field().getValue()) && (0 < Base::field().getValue());
83 virtual void setInfImpl()
override
85 setFieldValueInternal(std::numeric_limits<typename TField::ValueType>::infinity());
88 virtual bool isMinusInfImpl()
const override
90 return std::isinf(Base::field().getValue()) && (Base::field().getValue() < 0);
93 virtual void setMinusInfImpl()
override
95 setFieldValueInternal(-std::numeric_limits<typename TField::ValueType>::infinity());
98 virtual double getEpsilonImpl()
const override
100 return static_cast<double>(std::numeric_limits<typename TField::ValueType>::epsilon());
103 virtual const SpecialsList& specialsImpl()
const override
107 Field::hasSpecials(),
112 return specialsInternal(Tag());
115 virtual int decimalsImpl()
const override
117 return Field::displayDecimals();
121 struct HasFeatureTag{};
122 struct NoFeatureTag{};
124 void setFieldValueInternal(
typename TField::ValueType val)
128 Field::hasFixedValue(),
133 setFieldValueInternal(val, Tag());
136 void setFieldValueInternal(
typename TField::ValueType val, HasFeatureTag)
138 Base::field().setValue(val);
141 void setFieldValueInternal([[maybe_unused]]
typename TField::ValueType val, NoFeatureTag)
143 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
144 assert(Must_not_be_called);
147 static const SpecialsList& specialsInternal(HasFeatureTag)
149 static const SpecialsList List = createSpecialsList();
153 static const SpecialsList& specialsInternal(NoFeatureTag)
155 static const SpecialsList List;
159 static SpecialsList createSpecialsList()
162 auto mapInfo = Field::specialNamesMap();
163 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
164 auto& sInfo = mapInfo.first[idx];
165 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
172template <
typename TField>
173auto makeFloatField(TField& field)
175 return std::make_unique<ToolsFloatFieldImpl<TField>>(field);