22#include "cc_tools_qt/details/ToolsNumericFieldImpl.h"
23#include "cc_tools_qt/field/ToolsEnumField.h"
25#include "comms/field/EnumValue.h"
38template <
typename TField>
39class ToolsEnumFieldImpl :
public ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>
41 using Base = ToolsNumericFieldImpl<cc_tools_qt::field::ToolsEnumField, TField>;
44 static_assert(comms::field::isEnumValue<Field>(),
"Must be of EnumValueField type");
46 using ValueType =
typename Field::ValueType;
47 using UnderlyingType =
typename Base::UnderlyingType;
48 static_assert(
sizeof(ValueType) <=
sizeof(UnderlyingType),
"This class cannot handle provided field.");
53 using ValueInfosList =
typename Base::ValueInfosList;
54 using Ptr =
typename Base::Ptr;
55 using ActPtr =
typename Base::ActPtr;
57 explicit ToolsEnumFieldImpl(Field& fieldRef)
62 ToolsEnumFieldImpl(
const ToolsEnumFieldImpl&) =
default;
63 ToolsEnumFieldImpl(ToolsEnumFieldImpl&&) =
default;
64 virtual ~ToolsEnumFieldImpl() noexcept = default;
66 ToolsEnumFieldImpl& operator=(const ToolsEnumFieldImpl&) = delete;
69 virtual Ptr cloneImpl()
override
71 return ActPtr(
new ToolsEnumFieldImpl<TField>(Base::field()));
74 const ValueInfosList& valuesImpl()
const override
78 std::is_same_v<typename Field::ValueNameInfo, const char*>,
83 static const ValueInfosList List(createValues(Tag()));
88 struct SeqValuesTag{};
89 struct SparseValuesTag{};
91 static ValueInfosList createValues(SeqValuesTag)
93 ValueInfosList result;
94 auto namesMap = Field::valueNamesMap();
95 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
96 auto* name = namesMap.first[idx];
97 if (name ==
nullptr) {
101 result.append(qMakePair(name,
static_cast<long long>(idx)));
106 static ValueInfosList createValues(SparseValuesTag)
108 ValueInfosList result;
109 auto namesMap = Field::valueNamesMap();
110 for (
auto idx = 0U; idx < namesMap.second; ++idx) {
111 auto& info = namesMap.first[idx];
112 result.append(qMakePair(info.second,
static_cast<long long>(info.first)));
118template <
typename TField>
119auto makeEnumField(TField& field)
121 return std::make_unique<ToolsEnumFieldImpl<TField>>(field);