22#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
23#include "cc_tools_qt/field/ToolsBitmaskField.h"
25#include "comms/field/BitmaskValue.h"
39template <
typename TField>
40class ToolsBitmaskFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>
42 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>;
44 static_assert(comms::field::isBitmaskValue<Field>(),
"Must be of BitmaskValueField type");
46 using ValueType =
typename Field::ValueType;
47 using MaskType =
typename Base::UnderlyingType;
48 static_assert(
sizeof(ValueType) <=
sizeof(MaskType),
"This class cannot handle provided field.");
51 using Ptr =
typename Base::Ptr;
52 using ActPtr =
typename Base::ActPtr;
54 explicit ToolsBitmaskFieldImpl(Field& fieldRef)
59 ToolsBitmaskFieldImpl(
const ToolsBitmaskFieldImpl&) =
default;
60 ToolsBitmaskFieldImpl(ToolsBitmaskFieldImpl&&) =
default;
61 virtual ~ToolsBitmaskFieldImpl() noexcept = default;
63 ToolsBitmaskFieldImpl& operator=(const ToolsBitmaskFieldImpl&) = delete;
66 virtual
bool bitValueImpl(
unsigned idx)
const override
68 return Base::field().getBitValue(idx);
71 virtual void setBitValueImpl(
unsigned idx,
bool value)
override
75 Field::hasFixedValue(),
80 setBitValueInternal(idx, value, Tag());
83 virtual unsigned bitIdxLimitImpl()
const override
85 return std::numeric_limits<ValueType>::digits;
88 virtual Ptr cloneImpl()
override
90 return ActPtr(
new ToolsBitmaskFieldImpl<TField>(Base::field()));
93 virtual const QStringList& bitsImpl()
const override
95 static const QStringList Bits = createBitsList();
100 struct HasFeatureTag {};
101 struct NoFeatureTag {};
103 static QStringList createBitsList()
106 for (
auto idx = 0U; idx < Field::BitIdx_numOfValues; ++idx) {
107 auto* name = Field::bitName(idx);
108 if (name ==
nullptr) {
109 result.append(QString());
118 void setBitValueInternal(
unsigned idx,
bool value, HasFeatureTag)
120 Base::field().setBitValue(idx, value);
123 void setBitValueInternal([[maybe_unused]]
unsigned idx, [[maybe_unused]]
bool value, NoFeatureTag)
125 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
126 assert(Must_not_be_called);
129template <
typename TField>
130auto makeBitmaskField(TField& field)
132 return std::make_unique<ToolsBitmaskFieldImpl<TField>>(field);