21#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
22#include "cc_tools_qt/field/ToolsFloatField.h"
24#include "comms/field/FloatValue.h"
37template <
typename TField>
38class ToolsFloatFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsFloatField, TField>
40 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsFloatField, TField>;
42 static_assert(comms::field::isFloatValue<Field>(),
"Must be of FloatValueField type");
45 using UnderlyingType =
typename Base::UnderlyingType;
46 using Ptr =
typename Base::Ptr;
47 using ActPtr =
typename Base::ActPtr;
48 using SpecialsList =
typename Base::SpecialsList;
50 explicit ToolsFloatFieldImpl(Field& fieldRef)
55 ToolsFloatFieldImpl(
const ToolsFloatFieldImpl&) =
default;
56 ToolsFloatFieldImpl(ToolsFloatFieldImpl&&) =
default;
57 virtual ~ToolsFloatFieldImpl() noexcept = default;
59 ToolsFloatFieldImpl& operator=(const ToolsFloatFieldImpl&) = delete;
62 virtual Ptr cloneImpl()
override
64 return ActPtr(
new ToolsFloatFieldImpl<TField>(Base::field()));
67 virtual bool isNanImpl()
const override
69 return std::isnan(Base::field().getValue());
72 virtual void setNanImpl()
override
74 setFieldValueInternal(std::numeric_limits<typename TField::ValueType>::quiet_NaN());
77 virtual bool isInfImpl()
const override
79 return std::isinf(Base::field().getValue()) && (0 < Base::field().getValue());
82 virtual void setInfImpl()
override
84 setFieldValueInternal(std::numeric_limits<typename TField::ValueType>::infinity());
87 virtual bool isMinusInfImpl()
const override
89 return std::isinf(Base::field().getValue()) && (Base::field().getValue() < 0);
92 virtual void setMinusInfImpl()
override
94 setFieldValueInternal(-std::numeric_limits<typename TField::ValueType>::infinity());
97 virtual double getEpsilonImpl()
const override
99 return static_cast<double>(std::numeric_limits<typename TField::ValueType>::epsilon());
102 virtual const SpecialsList& specialsImpl()
const override
106 Field::hasSpecials(),
111 return specialsInternal(Tag());
114 virtual int decimalsImpl()
const override
116 return Field::displayDecimals();
120 struct HasFeatureTag{};
121 struct NoFeatureTag{};
123 void setFieldValueInternal(
typename TField::ValueType val)
127 Field::hasFixedValue(),
132 setFieldValueInternal(val, Tag());
135 void setFieldValueInternal(
typename TField::ValueType val, HasFeatureTag)
137 Base::field().setValue(val);
140 void setFieldValueInternal([[maybe_unused]]
typename TField::ValueType val, NoFeatureTag)
142 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
143 assert(Must_not_be_called);
146 static const SpecialsList& specialsInternal(HasFeatureTag)
148 static const SpecialsList List = createSpecialsList();
152 static const SpecialsList& specialsInternal(NoFeatureTag)
154 static const SpecialsList List;
158 static SpecialsList createSpecialsList()
161 auto mapInfo = Field::specialNamesMap();
162 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
163 auto& sInfo = mapInfo.first[idx];
164 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
171template <
typename TField>
172auto makeFloatField(TField& field)
174 return std::make_unique<ToolsFloatFieldImpl<TField>>(field);