22#include "comms/comms.h"
24#include "cc_tools_qt/details/ToolsArrayListFieldImpl.h"
25#include "cc_tools_qt/details/ToolsBitfieldFieldImpl.h"
26#include "cc_tools_qt/details/ToolsBitmaskFieldImpl.h"
27#include "cc_tools_qt/details/ToolsBundleFieldImpl.h"
28#include "cc_tools_qt/details/ToolsEnumFieldImpl.h"
29#include "cc_tools_qt/details/ToolsFloatFieldImpl.h"
30#include "cc_tools_qt/details/ToolsIntFieldImpl.h"
31#include "cc_tools_qt/details/ToolsOptionalFieldImpl.h"
32#include "cc_tools_qt/details/ToolsRawDataFieldImpl.h"
33#include "cc_tools_qt/details/ToolsStringFieldImpl.h"
34#include "cc_tools_qt/details/ToolsUnknownFieldImpl.h"
35#include "cc_tools_qt/details/ToolsUnsignedLongFieldImpl.h"
36#include "cc_tools_qt/details/ToolsVariantFieldImpl.h"
46class ToolsFieldCreator
49 using ToolsFieldPtr = cc_tools_qt::ToolsFieldPtr;
50 using FieldsList = std::vector<ToolsFieldPtr>;
52 explicit ToolsFieldCreator(FieldsList& fields) : m_fields(fields) {}
54 template <
typename TField>
55 static ToolsFieldPtr createField(TField& field)
57 using DecayedField =
typename std::decay<
decltype(field)>::type;
58 using Tag =
typename DecayedField::CommsTag;
59 return createFieldInternal(field, Tag());
62 template <
typename TField>
63 void operator()(TField& field)
65 m_fields.push_back(createField(field));
68 using IntValueTag = comms::field::tag::Int;
69 using BitmaskValueTag = comms::field::tag::Bitmask;
70 using EnumValueTag = comms::field::tag::Enum;
71 using StringTag = comms::field::tag::String;
72 using BitfieldTag = comms::field::tag::Bitfield;
73 using OptionalTag = comms::field::tag::Optional;
74 using BundleTag = comms::field::tag::Bundle;
75 using RawDataArrayListTag = comms::field::tag::RawArrayList;
76 using FieldsArrayListTag = comms::field::tag::ArrayList;
77 using FloatValueTag = comms::field::tag::Float;
78 using VariantTag = comms::field::tag::Variant;
80 struct RegularIntTag {};
81 struct BigUnsignedTag {};
83 class SubfieldsCreateHelper
86 using FieldCreateFunc = std::function <void (ToolsFieldPtr)>;
87 SubfieldsCreateHelper(FieldCreateFunc&& dispatchOp)
88 : m_dispatchOp(std::move(dispatchOp))
92 template <
typename TField>
93 void operator()(TField&& field)
96 ToolsFieldCreator::createField(std::forward<TField>(field));
97 m_dispatchOp(std::move(fieldWidget));
100 template <std::
size_t TIdx,
typename TField>
101 void operator()(TField&& field)
103 return operator()(field);
107 FieldCreateFunc m_dispatchOp;
110 template <
typename TField>
111 static ToolsFieldPtr createFieldInternal(TField& field, IntValueTag)
113 using FieldType = std::decay_t<
decltype(field)>;
114 using ValueType =
typename FieldType::ValueType;
116 static_assert(std::is_integral<ValueType>::value,
117 "ValueType is expected to be integral");
121 std::is_signed_v<ValueType> || (
sizeof(ValueType) <
sizeof(std::uint64_t)),
126 return createFieldInternal(field, Tag());
129 template <
typename TField>
130 static ToolsFieldPtr createFieldInternal(TField& field, RegularIntTag)
132 return makeIntField(field);
135 template <
typename TField>
136 static ToolsFieldPtr createFieldInternal(TField& field, BigUnsignedTag)
138 return makeUnsignedLongField(field);
141 template <
typename TField>
142 static ToolsFieldPtr createFieldInternal(TField& field, BitmaskValueTag)
144 return makeBitmaskField(field);
147 template <
typename TField>
148 static ToolsFieldPtr createFieldInternal(TField& field, EnumValueTag)
150 return makeEnumField(field);
153 template <
typename TField>
154 static ToolsFieldPtr createFieldInternal(TField& field, StringTag)
156 return makeStringField(field);
159 template <
typename TField>
160 static ToolsFieldPtr createFieldInternal(TField& field, BitfieldTag)
162 auto toolsField = makeBitfieldField(field);
164 using FieldPtrType = std::decay_t<
decltype(toolsField)>;
165 using FieldType =
typename FieldPtrType::element_type;
166 using MembersListType =
typename FieldType::Members;
168 MembersListType subFields;
169 auto& memberFields = field.value();
170 comms::util::tupleForEach(
172 SubfieldsCreateHelper(
173 [&subFields](ToolsFieldPtr fieldParam)
175 subFields.push_back(std::move(fieldParam));
178 toolsField->setMembers(std::move(subFields));
182 template <
typename TField>
183 static ToolsFieldPtr createFieldInternal(TField& field, OptionalTag)
185 auto toolsField = makeOptionalField(field);
186 auto& wrappedField = field.field();
187 auto wrappedToolsField = createField(wrappedField);
188 toolsField->setField(std::move(wrappedToolsField));
192 template <
typename TField>
193 static ToolsFieldPtr createFieldInternal(TField& field, BundleTag)
195 auto toolsField = makeBundleField(field);
197 using FieldPtrType = std::decay_t<
decltype(toolsField)>;
198 using FieldType =
typename FieldPtrType::element_type;
199 using MemberFieldsList =
typename FieldType::Members;
201 MemberFieldsList subFields;
202 auto& memberFields = field.value();
203 comms::util::tupleForEach(
205 SubfieldsCreateHelper(
206 [&subFields](ToolsFieldPtr fieldParam)
208 subFields.push_back(std::move(fieldParam));
211 toolsField->setMembers(std::move(subFields));
215 template <
typename TField>
216 static ToolsFieldPtr createFieldInternal(TField& field, RawDataArrayListTag)
218 return makeRawDataField(field);
221 template <
typename TField>
222 static ToolsFieldPtr createFieldInternal(TField& field, FieldsArrayListTag)
224 using DecayedField = std::decay_t<
decltype(field)>;
225 using CollectionType =
typename DecayedField::ValueType;
226 using ElementType =
typename CollectionType::value_type;
228 auto toolsField = makeArrayListField(field);
229 if (toolsField->hasFixedSize()) {
230 toolsField->adjustFixedSize();
233 toolsField->setWrapFieldCallback(
234 [](ElementType& memField) -> ToolsFieldPtr
236 return ToolsFieldCreator::createField(memField);
239 toolsField->refreshMembers();
243 template <
typename TField>
244 static ToolsFieldPtr createFieldInternal(TField& field, FloatValueTag)
246 return makeFloatField(field);
249 template <
typename TField>
250 static ToolsFieldPtr createFieldInternal(TField& field, VariantTag)
252 auto toolsField = makeVariantField(field);
254 toolsField->setMemberCreateCallback(
255 [&field]() -> ToolsFieldPtr
258 if (field.currentFieldValid()) {
259 field.currentFieldExec(
260 SubfieldsCreateHelper(
261 [&ptr](ToolsFieldPtr wrappedToolsField) noexcept
263 ptr = std::move(wrappedToolsField);
269 if (field.currentFieldValid()) {
270 field.currentFieldExec(
271 SubfieldsCreateHelper(
272 [&toolsField](ToolsFieldPtr wrappedToolsField)
274 toolsField->setCurrent(std::move(wrappedToolsField));
278 toolsField->setCurrent(ToolsFieldPtr());
284 template <
typename TField,
typename TTag>
285 static ToolsFieldPtr createFieldInternal(TField& field, TTag)
287 return makeUnknownField(field);
291 FieldsList& m_fields;