22#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
23#include "cc_tools_qt/field/ToolsUnsignedLongField.h"
25#include "comms/field/IntValue.h"
38template <
typename TField>
39class ToolsUnsignedLongFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>
41 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>;
43 static_assert(comms::field::isIntValue<Field>(),
"Must be of IntValueField 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 ToolsUnsignedLongFieldImpl(Field& fieldRef)
56 ToolsUnsignedLongFieldImpl(
const ToolsUnsignedLongFieldImpl&) =
default;
57 ToolsUnsignedLongFieldImpl(ToolsUnsignedLongFieldImpl&&) =
default;
58 virtual ~ToolsUnsignedLongFieldImpl() noexcept = default;
60 ToolsUnsignedLongFieldImpl& operator=(const ToolsUnsignedLongFieldImpl&) = 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
80 Base::field().setScaled(value);
83 virtual double scaleValueImpl(UnderlyingType value)
const override
86 fieldTmp.setValue(value);
87 return fieldTmp.template scaleAs<double>();
90 virtual bool isSignedImpl()
const override
92 return std::is_signed<typename Field::ValueType>::value;
95 virtual std::size_t valueTypeSizeImpl()
const override
97 return sizeof(
typename Field::ValueType);
100 virtual Ptr cloneImpl()
override
102 return ActPtr(
new ToolsUnsignedLongFieldImpl<TField>(Base::field()));
105 virtual const SpecialsList& specialsImpl()
const override
109 Field::hasSpecials(),
114 return specialsInternal(Tag());
117 virtual int scaledDecimalsImpl()
const override
126 return scaledDecimalsInternal(Tag());
129 virtual UnderlyingType getDisplayValueImpl()
const override
131 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
134 virtual void setDisplayValueImpl(UnderlyingType value)
override
138 Field::hasFixedValue(),
143 setDisplayValueInternal(value, Tag());
147 struct HasFeatureTag{};
148 struct NoFeatureTag{};
150 static const SpecialsList& specialsInternal(HasFeatureTag)
152 static const SpecialsList List = createSpecialsList();
156 static const SpecialsList& specialsInternal(NoFeatureTag)
158 static const SpecialsList List;
162 static int scaledDecimalsInternal(HasFeatureTag)
164 return Field::displayDecimals();
167 static int scaledDecimalsInternal(NoFeatureTag)
172 static SpecialsList createSpecialsList()
175 auto mapInfo = Field::specialNamesMap();
176 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
177 auto& sInfo = mapInfo.first[idx];
178 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
184 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
186 Base::field().setDisplayValue(value);
189 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
191 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
192 assert(Must_not_be_called);
196template <
typename TField>
197auto makeUnsignedLongField(TField& field)
199 return std::make_unique<ToolsUnsignedLongFieldImpl<TField>>(field);