21#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
22#include "cc_tools_qt/field/ToolsUnsignedLongField.h"
24#include "comms/field/IntValue.h"
37template <
typename TField>
38class ToolsUnsignedLongFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>
40 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsUnsignedLongField, TField>;
42 static_assert(comms::field::isIntValue<Field>(),
"Must be of IntValueField 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 ToolsUnsignedLongFieldImpl(Field& fieldRef)
55 ToolsUnsignedLongFieldImpl(
const ToolsUnsignedLongFieldImpl&) =
default;
56 ToolsUnsignedLongFieldImpl(ToolsUnsignedLongFieldImpl&&) =
default;
57 virtual ~ToolsUnsignedLongFieldImpl() noexcept = default;
59 ToolsUnsignedLongFieldImpl& operator=(const ToolsUnsignedLongFieldImpl&) = 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
79 Base::field().setScaled(value);
82 virtual double scaleValueImpl(UnderlyingType value)
const override
85 fieldTmp.setValue(value);
86 return fieldTmp.template scaleAs<double>();
89 virtual bool isSignedImpl()
const override
91 return std::is_signed<typename Field::ValueType>::value;
94 virtual std::size_t valueTypeSizeImpl()
const override
96 return sizeof(
typename Field::ValueType);
99 virtual Ptr cloneImpl()
override
101 return ActPtr(
new ToolsUnsignedLongFieldImpl<TField>(Base::field()));
104 virtual const SpecialsList& specialsImpl()
const override
108 Field::hasSpecials(),
113 return specialsInternal(Tag());
116 virtual int scaledDecimalsImpl()
const override
125 return scaledDecimalsInternal(Tag());
128 virtual UnderlyingType getDisplayValueImpl()
const override
130 return static_cast<UnderlyingType
>(Base::field().getDisplayValue());
133 virtual void setDisplayValueImpl(UnderlyingType value)
override
137 Field::hasFixedValue(),
142 setDisplayValueInternal(value, Tag());
146 struct HasFeatureTag{};
147 struct NoFeatureTag{};
149 static const SpecialsList& specialsInternal(HasFeatureTag)
151 static const SpecialsList List = createSpecialsList();
155 static const SpecialsList& specialsInternal(NoFeatureTag)
157 static const SpecialsList List;
161 static int scaledDecimalsInternal(HasFeatureTag)
163 return Field::displayDecimals();
166 static int scaledDecimalsInternal(NoFeatureTag)
171 static SpecialsList createSpecialsList()
174 auto mapInfo = Field::specialNamesMap();
175 for (
auto idx = 0U; idx < mapInfo.second; ++idx) {
176 auto& sInfo = mapInfo.first[idx];
177 result.append(qMakePair(sInfo.second,
static_cast<UnderlyingType
>(sInfo.first)));
183 void setDisplayValueInternal(UnderlyingType value, HasFeatureTag)
185 Base::field().setDisplayValue(value);
188 void setDisplayValueInternal([[maybe_unused]] UnderlyingType value, NoFeatureTag)
190 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
191 assert(Must_not_be_called);
195template <
typename TField>
196auto makeUnsignedLongField(TField& field)
198 return std::make_unique<ToolsUnsignedLongFieldImpl<TField>>(field);