20#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
21#include "cc_tools_qt/field/ToolsIntField.h"
23#include "comms/field/IntValue.h"
36template <
typename TField>
37class ToolsIntFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>
39 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsIntField, TField>;
41 static_assert(comms::field::isIntValue<Field>(),
"Must be of comms::field::IntValue 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 ToolsIntFieldImpl(Field& fieldRef)
55 ToolsIntFieldImpl(
const ToolsIntFieldImpl&) =
default;
56 ToolsIntFieldImpl(ToolsIntFieldImpl&&) =
default;
57 virtual ~ToolsIntFieldImpl() noexcept = default;
59 ToolsIntFieldImpl& operator=(const ToolsIntFieldImpl&) = delete;
62 virtual UnderlyingType minValueImpl()
const override
64 return std::numeric_limits<typename Field::ValueType>::min();
67 virtual UnderlyingType maxValueImpl()
const override
69 return std::numeric_limits<typename Field::ValueType>::max();
72 virtual double getScaledImpl()
const override
74 return Base::field().template scaleAs<double>();
77 virtual void setScaledImpl(
double value)
override
81 Field::hasFixedValue(),
86 setScaledInternal(value, Tag());
89 virtual double scaleValueImpl(UnderlyingType value)
const override
93 Field::hasFixedValue(),
97 return scaleValueInternal(value, Tag());
100 virtual bool isSignedImpl()
const override
102 return std::is_signed<typename Field::ValueType>::value;
105 virtual std::size_t valueTypeSizeImpl()
const override
107 return sizeof(
typename Field::ValueType);
110 virtual Ptr cloneImpl()
override
112 return ActPtr(
new ToolsIntFieldImpl<TField>(Base::field()));
115 virtual const SpecialsList& specialsImpl()
const override
119 Field::hasSpecials(),
124 return specialsInternal(Tag());
127 virtual int scaledDecimalsImpl()
const override
136 return scaledDecimalsInternal(Tag());
139 virtual UnderlyingType getDisplayValueImpl()
const override
141 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
144 virtual void setDisplayValueImpl(UnderlyingType value)
override
148 Field::hasFixedValue(),
153 setDisplayValueInternal(value, Tag());
157 struct HasFeatureTag{};
158 struct NoFeatureTag{};
160 static const SpecialsList& specialsInternal(HasFeatureTag)
162 static const SpecialsList List = createSpecialsList();
166 static const SpecialsList& specialsInternal(NoFeatureTag)
168 static const SpecialsList List;
172 static int scaledDecimalsInternal(HasFeatureTag)
174 return Field::displayDecimals();
177 static int scaledDecimalsInternal(NoFeatureTag)
182 static SpecialsList createSpecialsList()
185 auto mapInfo = Field::specialNamesMap();
186 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
187 auto& sInfo = mapInfo.first[idx];
188 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
194 void setScaledInternal(
double value, HasFeatureTag)
196 Base::field().setScaled(value);
199 void setScaledInternal([[maybe_unused]]
double value, NoFeatureTag)
201 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
202 assert(Must_not_be_called);
205 static double scaleValueInternal(UnderlyingType value, HasFeatureTag)
208 fieldTmp.setValue(value);
209 return fieldTmp.template scaleAs<double>();
212 static double scaleValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
214 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
215 assert(Must_not_be_called);
219 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
221 Base::field().setDisplayValue(value);
224 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
226 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
227 assert(Must_not_be_called);
232template <
typename TField>
233auto makeIntField(TField& field)
235 return std::make_unique<ToolsIntFieldImpl<TField>>(field);