20#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
21#include "cc_tools_qt/field/ToolsEnumField.h"
23#include "comms/field/EnumValue.h"
36template <
typename TField>
37class ToolsEnumFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>
39 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>;
42 static_assert(comms::field::isEnumValue<Field>(),
"Must be of EnumValueField type");
44 using ValueType =
typename Field::ValueType;
45 using UnderlyingType =
typename Base::UnderlyingType;
46 static_assert(
sizeof(ValueType) <=
sizeof(UnderlyingType),
"This class cannot handle provided field.");
51 using ValueInfosList =
typename Base::ValueInfosList;
52 using Ptr =
typename Base::Ptr;
53 using ActPtr =
typename Base::ActPtr;
55 explicit ToolsEnumFieldImpl(Field& fieldRef)
60 ToolsEnumFieldImpl(
const ToolsEnumFieldImpl&) =
default;
61 ToolsEnumFieldImpl(ToolsEnumFieldImpl&&) =
default;
62 virtual ~ToolsEnumFieldImpl() noexcept = default;
64 ToolsEnumFieldImpl& operator=(const ToolsEnumFieldImpl&) = delete;
67 virtual Ptr cloneImpl()
override
69 return ActPtr(
new ToolsEnumFieldImpl<TField>(Base::field()));
72 const ValueInfosList& valuesImpl()
const override
76 std::is_same_v<typename Field::ValueNameInfo, const char*>,
81 static const ValueInfosList List(createValues(Tag()));
86 struct SeqValuesTag{};
87 struct SparseValuesTag{};
89 static ValueInfosList createValues(SeqValuesTag)
91 ValueInfosList result;
92 auto namesMap = Field::valueNamesMap();
93 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
94 auto* name = namesMap.first[idx];
95 if (name ==
nullptr) {
99 result.append(qMakePair(name,
static_cast<long long>(idx)));
104 static ValueInfosList createValues(SparseValuesTag)
106 ValueInfosList result;
107 auto namesMap = Field::valueNamesMap();
108 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
109 auto& info = namesMap.first[idx];
110 result.append(qMakePair(info.second,
static_cast<long long>(info.first)));
116template <
typename TField>
117auto makeEnumField(TField& field)
119 return std::make_unique<ToolsEnumFieldImpl<TField>>(field);