21#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
22#include "cc_tools_qt/field/ToolsBitmaskField.h"
24#include "comms/field/BitmaskValue.h"
38template <
typename TField>
39class ToolsBitmaskFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>
41 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>;
43 static_assert(comms::field::isBitmaskValue<Field>(),
"Must be of BitmaskValueField type");
45 using ValueType =
typename Field::ValueType;
46 using MaskType =
typename Base::UnderlyingType;
47 static_assert(
sizeof(ValueType) <=
sizeof(MaskType),
"This class cannot handle provided field.");
50 using Ptr =
typename Base::Ptr;
51 using ActPtr =
typename Base::ActPtr;
53 explicit ToolsBitmaskFieldImpl(Field& fieldRef)
58 ToolsBitmaskFieldImpl(
const ToolsBitmaskFieldImpl&) =
default;
59 ToolsBitmaskFieldImpl(ToolsBitmaskFieldImpl&&) =
default;
60 virtual ~ToolsBitmaskFieldImpl() noexcept = default;
62 ToolsBitmaskFieldImpl& operator=(const ToolsBitmaskFieldImpl&) = delete;
65 virtual
bool bitValueImpl(
unsigned idx)
const override
67 return Base::field().getBitValue(idx);
70 virtual void setBitValueImpl(
unsigned idx,
bool value)
override
74 Field::hasFixedValue(),
79 setBitValueInternal(idx, value, Tag());
82 virtual unsigned bitIdxLimitImpl()
const override
84 return std::numeric_limits<ValueType>::digits;
87 virtual Ptr cloneImpl()
override
89 return ActPtr(
new ToolsBitmaskFieldImpl<TField>(Base::field()));
92 virtual const QStringList& bitsImpl()
const override
94 static const QStringList Bits = createBitsList();
99 struct HasFeatureTag {};
100 struct NoFeatureTag {};
102 static QStringList createBitsList()
105 for (
auto idx = 0U; idx < Field::BitIdx_numOfValues; ++idx) {
106 auto* name = Field::bitName(idx);
107 if (name ==
nullptr) {
108 result.append(QString());
117 void setBitValueInternal(
unsigned idx,
bool value, HasFeatureTag)
119 Base::field().setBitValue(idx, value);
122 void setBitValueInternal([[maybe_unused]]
unsigned idx, [[maybe_unused]]
bool value, NoFeatureTag)
124 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
125 assert(Must_not_be_called);
128template <
typename TField>
129auto makeBitmaskField(TField& field)
131 return std::make_unique<ToolsBitmaskFieldImpl<TField>>(field);