22#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
23#include "cc_tools_qt/field/ToolsIntField.h"
25#include "comms/field/IntValue.h"
38template <
typename TField>
39class ToolsIntFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>
41 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>;
43 static_assert(comms::field::isIntValue<Field>(),
"Must be of comms::field::IntValue type");
47 using UnderlyingType =
typename Base::UnderlyingType;
48 using Ptr =
typename Base::Ptr;
49 using ActPtr =
typename Base::ActPtr;
50 using SpecialsList =
typename Base::SpecialsList;
52 explicit ToolsIntFieldImpl(Field& fieldRef)
57 ToolsIntFieldImpl(
const ToolsIntFieldImpl&) =
default;
58 ToolsIntFieldImpl(ToolsIntFieldImpl&&) =
default;
59 virtual ~ToolsIntFieldImpl() noexcept = default;
61 ToolsIntFieldImpl& operator=(const ToolsIntFieldImpl&) = delete;
64 virtual UnderlyingType minValueImpl()
const override
66 return std::numeric_limits<typename Field::ValueType>::min();
69 virtual UnderlyingType maxValueImpl()
const override
71 return std::numeric_limits<typename Field::ValueType>::max();
74 virtual double getScaledImpl()
const override
76 return Base::field().template scaleAs<double>();
79 virtual void setScaledImpl(
double value)
override
83 Field::hasFixedValue(),
88 setScaledInternal(value, Tag());
91 virtual double scaleValueImpl(UnderlyingType value)
const override
95 Field::hasFixedValue(),
99 return scaleValueInternal(value, Tag());
102 virtual bool isSignedImpl()
const override
104 return std::is_signed<typename Field::ValueType>::value;
107 virtual std::size_t valueTypeSizeImpl()
const override
109 return sizeof(
typename Field::ValueType);
112 virtual Ptr cloneImpl()
override
114 return ActPtr(
new ToolsIntFieldImpl<TField>(Base::field()));
117 virtual const SpecialsList& specialsImpl()
const override
121 Field::hasSpecials(),
126 return specialsInternal(Tag());
129 virtual int scaledDecimalsImpl()
const override
138 return scaledDecimalsInternal(Tag());
141 virtual UnderlyingType getDisplayValueImpl()
const override
143 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
146 virtual void setDisplayValueImpl(UnderlyingType value)
override
150 Field::hasFixedValue(),
155 setDisplayValueInternal(value, Tag());
159 struct HasFeatureTag{};
160 struct NoFeatureTag{};
162 static const SpecialsList& specialsInternal(HasFeatureTag)
164 static const SpecialsList List = createSpecialsList();
168 static const SpecialsList& specialsInternal(NoFeatureTag)
170 static const SpecialsList List;
174 static int scaledDecimalsInternal(HasFeatureTag)
176 return Field::displayDecimals();
179 static int scaledDecimalsInternal(NoFeatureTag)
184 static SpecialsList createSpecialsList()
187 auto mapInfo = Field::specialNamesMap();
188 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
189 auto& sInfo = mapInfo.first[idx];
190 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
196 void setScaledInternal(
double value, HasFeatureTag)
198 Base::field().setScaled(value);
201 void setScaledInternal([[maybe_unused]]
double value, NoFeatureTag)
203 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
204 assert(Must_not_be_called);
207 static double scaleValueInternal(UnderlyingType value, HasFeatureTag)
210 fieldTmp.setValue(value);
211 return fieldTmp.template scaleAs<double>();
214 static double scaleValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
216 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
217 assert(Must_not_be_called);
221 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
223 Base::field().setDisplayValue(value);
226 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
228 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
229 assert(Must_not_be_called);
234template <
typename TField>
235auto makeIntField(TField& field)
237 return std::make_unique<ToolsIntFieldImpl<TField>>(field);