20#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
21#include "cc_tools_qt/field/ToolsBitmaskField.h"
23#include "comms/field/BitmaskValue.h"
37template <
typename TField>
38class ToolsBitmaskFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>
40 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsBitmaskField, TField>;
42 static_assert(comms::field::isBitmaskValue<Field>(),
"Must be of BitmaskValueField type");
44 using ValueType =
typename Field::ValueType;
45 using MaskType =
typename Base::UnderlyingType;
46 static_assert(
sizeof(ValueType) <=
sizeof(MaskType),
"This class cannot handle provided field.");
49 using Ptr =
typename Base::Ptr;
50 using ActPtr =
typename Base::ActPtr;
52 explicit ToolsBitmaskFieldImpl(Field& fieldRef)
57 ToolsBitmaskFieldImpl(
const ToolsBitmaskFieldImpl&) =
default;
58 ToolsBitmaskFieldImpl(ToolsBitmaskFieldImpl&&) =
default;
59 virtual ~ToolsBitmaskFieldImpl() noexcept = default;
61 ToolsBitmaskFieldImpl& operator=(const ToolsBitmaskFieldImpl&) = delete;
64 virtual
bool bitValueImpl(
unsigned idx)
const override
66 return Base::field().getBitValue(idx);
69 virtual void setBitValueImpl(
unsigned idx,
bool value)
override
73 Field::hasFixedValue(),
78 setBitValueInternal(idx, value, Tag());
81 virtual unsigned bitIdxLimitImpl()
const override
83 return std::numeric_limits<ValueType>::digits;
86 virtual Ptr cloneImpl()
override
88 return ActPtr(
new ToolsBitmaskFieldImpl<TField>(Base::field()));
91 virtual const QStringList& bitsImpl()
const override
93 static const QStringList Bits = createBitsList();
98 struct HasFeatureTag {};
99 struct NoFeatureTag {};
101 static QStringList createBitsList()
104 for (
auto idx = 0U; idx < Field::BitIdx_numOfValues; ++idx) {
105 auto* name = Field::bitName(idx);
106 if (name ==
nullptr) {
107 result.append(QString());
116 void setBitValueInternal(
unsigned idx,
bool value, HasFeatureTag)
118 Base::field().setBitValue(idx, value);
121 void setBitValueInternal([[maybe_unused]]
unsigned idx, [[maybe_unused]]
bool value, NoFeatureTag)
123 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
124 assert(Must_not_be_called);
127template <
typename TField>
128auto makeBitmaskField(TField& field)
130 return std::make_unique<ToolsBitmaskFieldImpl<TField>>(field);