20#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
21#include "cc_tools_qt/field/ToolsUnsignedLongField.h"
23#include "comms/field/IntValue.h"
36template <
typename TField>
37class ToolsUnsignedLongFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>
39 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>;
41 static_assert(comms::field::isIntValue<Field>(),
"Must be of IntValueField type");
44 using UnderlyingType =
typename Base::UnderlyingType;
45 using Ptr =
typename Base::Ptr;
46 using ActPtr =
typename Base::ActPtr;
47 using SpecialsList =
typename Base::SpecialsList;
49 explicit ToolsUnsignedLongFieldImpl(Field& fieldRef)
54 ToolsUnsignedLongFieldImpl(
const ToolsUnsignedLongFieldImpl&) =
default;
55 ToolsUnsignedLongFieldImpl(ToolsUnsignedLongFieldImpl&&) =
default;
56 virtual ~ToolsUnsignedLongFieldImpl() noexcept = default;
58 ToolsUnsignedLongFieldImpl& operator=(const ToolsUnsignedLongFieldImpl&) = delete;
61 virtual UnderlyingType minValueImpl()
const override
63 return std::numeric_limits<typename Field::ValueType>::min();
66 virtual UnderlyingType maxValueImpl()
const override
68 return std::numeric_limits<typename Field::ValueType>::max();
71 virtual double getScaledImpl()
const override
73 return Base::field().template scaleAs<double>();
76 virtual void setScaledImpl(
double value)
override
78 Base::field().setScaled(value);
81 virtual double scaleValueImpl(UnderlyingType value)
const override
84 fieldTmp.setValue(value);
85 return fieldTmp.template scaleAs<double>();
88 virtual bool isSignedImpl()
const override
90 return std::is_signed<typename Field::ValueType>::value;
93 virtual std::size_t valueTypeSizeImpl()
const override
95 return sizeof(
typename Field::ValueType);
98 virtual Ptr cloneImpl()
override
100 return ActPtr(
new ToolsUnsignedLongFieldImpl<TField>(Base::field()));
103 virtual const SpecialsList& specialsImpl()
const override
107 Field::hasSpecials(),
112 return specialsInternal(Tag());
115 virtual int scaledDecimalsImpl()
const override
124 return scaledDecimalsInternal(Tag());
127 virtual UnderlyingType getDisplayValueImpl()
const override
129 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
132 virtual void setDisplayValueImpl(UnderlyingType value)
override
136 Field::hasFixedValue(),
141 setDisplayValueInternal(value, Tag());
145 struct HasFeatureTag{};
146 struct NoFeatureTag{};
148 static const SpecialsList& specialsInternal(HasFeatureTag)
150 static const SpecialsList List = createSpecialsList();
154 static const SpecialsList& specialsInternal(NoFeatureTag)
156 static const SpecialsList List;
160 static int scaledDecimalsInternal(HasFeatureTag)
162 return Field::displayDecimals();
165 static int scaledDecimalsInternal(NoFeatureTag)
170 static SpecialsList createSpecialsList()
173 auto mapInfo = Field::specialNamesMap();
174 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
175 auto& sInfo = mapInfo.first[idx];
176 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
182 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
184 Base::field().setDisplayValue(value);
187 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
189 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
190 assert(Must_not_be_called);
194template <
typename TField>
195auto makeUnsignedLongField(TField& field)
197 return std::make_unique<ToolsUnsignedLongFieldImpl<TField>>(field);