21#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
22#include "cc_tools_qt/field/ToolsEnumField.h"
24#include "comms/field/EnumValue.h"
37template <
typename TField>
38class ToolsEnumFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>
40 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>;
43 static_assert(comms::field::isEnumValue<Field>(),
"Must be of EnumValueField type");
45 using ValueType =
typename Field::ValueType;
46 using UnderlyingType =
typename Base::UnderlyingType;
47 static_assert(
sizeof(ValueType) <=
sizeof(UnderlyingType),
"This class cannot handle provided field.");
52 using ValueInfosList =
typename Base::ValueInfosList;
53 using Ptr =
typename Base::Ptr;
54 using ActPtr =
typename Base::ActPtr;
56 explicit ToolsEnumFieldImpl(Field& fieldRef)
61 ToolsEnumFieldImpl(
const ToolsEnumFieldImpl&) =
default;
62 ToolsEnumFieldImpl(ToolsEnumFieldImpl&&) =
default;
63 virtual ~ToolsEnumFieldImpl() noexcept = default;
65 ToolsEnumFieldImpl& operator=(const ToolsEnumFieldImpl&) = delete;
68 virtual Ptr cloneImpl()
override
70 return ActPtr(
new ToolsEnumFieldImpl<TField>(Base::field()));
73 const ValueInfosList& valuesImpl()
const override
77 std::is_same_v<typename Field::ValueNameInfo, const char*>,
82 static const ValueInfosList List(createValues(Tag()));
87 struct SeqValuesTag{};
88 struct SparseValuesTag{};
90 static ValueInfosList createValues(SeqValuesTag)
92 ValueInfosList result;
93 auto namesMap = Field::valueNamesMap();
94 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
95 auto* name = namesMap.first[idx];
96 if (name ==
nullptr) {
100 result.append(qMakePair(name,
static_cast<long long>(idx)));
105 static ValueInfosList createValues(SparseValuesTag)
107 ValueInfosList result;
108 auto namesMap = Field::valueNamesMap();
109 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
110 auto& info = namesMap.first[idx];
111 result.append(qMakePair(info.second,
static_cast<long long>(info.first)));
117template <
typename TField>
118auto makeEnumField(TField& field)
120 return std::make_unique<ToolsEnumFieldImpl<TField>>(field);