21#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
22#include "cc_tools_qt/field/ToolsIntField.h"
24#include "comms/field/IntValue.h"
37template <
typename TField>
38class ToolsIntFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>
40 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>;
42 static_assert(comms::field::isIntValue<Field>(),
"Must be of comms::field::IntValue 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 ToolsIntFieldImpl(Field& fieldRef)
56 ToolsIntFieldImpl(
const ToolsIntFieldImpl&) =
default;
57 ToolsIntFieldImpl(ToolsIntFieldImpl&&) =
default;
58 virtual ~ToolsIntFieldImpl() noexcept = default;
60 ToolsIntFieldImpl& operator=(const ToolsIntFieldImpl&) = delete;
63 virtual UnderlyingType minValueImpl()
const override
65 return std::numeric_limits<typename Field::ValueType>::min();
68 virtual UnderlyingType maxValueImpl()
const override
70 return std::numeric_limits<typename Field::ValueType>::max();
73 virtual double getScaledImpl()
const override
75 return Base::field().template scaleAs<double>();
78 virtual void setScaledImpl(
double value)
override
82 Field::hasFixedValue(),
87 setScaledInternal(value, Tag());
90 virtual double scaleValueImpl(UnderlyingType value)
const override
94 Field::hasFixedValue(),
98 return scaleValueInternal(value, Tag());
101 virtual bool isSignedImpl()
const override
103 return std::is_signed<typename Field::ValueType>::value;
106 virtual std::size_t valueTypeSizeImpl()
const override
108 return sizeof(
typename Field::ValueType);
111 virtual Ptr cloneImpl()
override
113 return ActPtr(
new ToolsIntFieldImpl<TField>(Base::field()));
116 virtual const SpecialsList& specialsImpl()
const override
120 Field::hasSpecials(),
125 return specialsInternal(Tag());
128 virtual int scaledDecimalsImpl()
const override
137 return scaledDecimalsInternal(Tag());
140 virtual UnderlyingType getDisplayValueImpl()
const override
142 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
145 virtual void setDisplayValueImpl(UnderlyingType value)
override
149 Field::hasFixedValue(),
154 setDisplayValueInternal(value, Tag());
158 struct HasFeatureTag{};
159 struct NoFeatureTag{};
161 static const SpecialsList& specialsInternal(HasFeatureTag)
163 static const SpecialsList List = createSpecialsList();
167 static const SpecialsList& specialsInternal(NoFeatureTag)
169 static const SpecialsList List;
173 static int scaledDecimalsInternal(HasFeatureTag)
175 return Field::displayDecimals();
178 static int scaledDecimalsInternal(NoFeatureTag)
183 static SpecialsList createSpecialsList()
186 auto mapInfo = Field::specialNamesMap();
187 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
188 auto& sInfo = mapInfo.first[idx];
189 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
195 void setScaledInternal(
double value, HasFeatureTag)
197 Base::field().setScaled(value);
200 void setScaledInternal([[maybe_unused]]
double value, NoFeatureTag)
202 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
203 assert(Must_not_be_called);
206 static double scaleValueInternal(UnderlyingType value, HasFeatureTag)
209 fieldTmp.setValue(value);
210 return fieldTmp.template scaleAs<double>();
213 static double scaleValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
215 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
216 assert(Must_not_be_called);
220 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
222 Base::field().setDisplayValue(value);
225 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
227 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
228 assert(Must_not_be_called);
233template <
typename TField>
234auto makeIntField(TField& field)
236 return std::make_unique<ToolsIntFieldImpl<TField>>(field);