23#include "comms/comms.h"
25#include "cc_tools_qt/details/ToolsArrayListFieldImpl.h"
26#include "cc_tools_qt/details/ToolsBitfieldFieldImpl.h"
27#include "cc_tools_qt/details/ToolsBitmaskFieldImpl.h"
28#include "cc_tools_qt/details/ToolsBundleFieldImpl.h"
29#include "cc_tools_qt/details/ToolsEnumFieldImpl.h"
30#include "cc_tools_qt/details/ToolsFloatFieldImpl.h"
31#include "cc_tools_qt/details/ToolsIntFieldImpl.h"
32#include "cc_tools_qt/details/ToolsOptionalFieldImpl.h"
33#include "cc_tools_qt/details/ToolsRawDataFieldImpl.h"
34#include "cc_tools_qt/details/ToolsStringFieldImpl.h"
35#include "cc_tools_qt/details/ToolsUnknownFieldImpl.h"
36#include "cc_tools_qt/details/ToolsUnsignedLongFieldImpl.h"
37#include "cc_tools_qt/details/ToolsVariantFieldImpl.h"
47class ToolsFieldCreator
50 using ToolsFieldPtr = cc_tools_qt::ToolsFieldPtr;
51 using FieldsList = std::vector<ToolsFieldPtr>;
53 explicit ToolsFieldCreator(FieldsList& fields) : m_fields(fields) {}
55 template <
typename TField>
56 static ToolsFieldPtr createField(TField& field)
58 using DecayedField =
typename std::decay<
decltype(field)>::type;
59 using Tag =
typename DecayedField::CommsTag;
60 return createFieldInternal(field, Tag());
63 template <
typename TField>
64 void operator()(TField& field)
66 m_fields.push_back(createField(field));
69 using IntValueTag = comms::field::tag::Int;
70 using BitmaskValueTag = comms::field::tag::Bitmask;
71 using EnumValueTag = comms::field::tag::Enum;
72 using StringTag = comms::field::tag::String;
73 using BitfieldTag = comms::field::tag::Bitfield;
74 using OptionalTag = comms::field::tag::Optional;
75 using BundleTag = comms::field::tag::Bundle;
76 using RawDataArrayListTag = comms::field::tag::RawArrayList;
77 using FieldsArrayListTag = comms::field::tag::ArrayList;
78 using FloatValueTag = comms::field::tag::Float;
79 using VariantTag = comms::field::tag::Variant;
81 struct RegularIntTag {};
82 struct BigUnsignedTag {};
84 class SubfieldsCreateHelper
87 using FieldCreateFunc = std::function <void (ToolsFieldPtr)>;
88 SubfieldsCreateHelper(FieldCreateFunc&& dispatchOp)
89 : m_dispatchOp(std::move(dispatchOp))
93 template <
typename TField>
94 void operator()(TField&& field)
97 ToolsFieldCreator::createField(std::forward<TField>(field));
98 m_dispatchOp(std::move(fieldWidget));
101 template <std::
size_t TIdx,
typename TField>
102 void operator()(TField&& field)
104 return operator()(field);
108 FieldCreateFunc m_dispatchOp;
112 template <
typename TField>
113 static ToolsFieldPtr createFieldInternal(TField& field, IntValueTag)
115 using FieldType = std::decay_t<
decltype(field)>;
116 using ValueType =
typename FieldType::ValueType;
118 static_assert(std::is_integral<ValueType>::value,
119 "ValueType is expected to be integral");
123 std::is_signed_v<ValueType> || (
sizeof(ValueType) <
sizeof(std::uint64_t)),
128 return createFieldInternal(field, Tag());
131 template <
typename TField>
132 static ToolsFieldPtr createFieldInternal(TField& field, RegularIntTag)
134 return makeIntField(field);
137 template <
typename TField>
138 static ToolsFieldPtr createFieldInternal(TField& field, BigUnsignedTag)
140 return makeUnsignedLongField(field);
143 template <
typename TField>
144 static ToolsFieldPtr createFieldInternal(TField& field, BitmaskValueTag)
146 return makeBitmaskField(field);
149 template <
typename TField>
150 static ToolsFieldPtr createFieldInternal(TField& field, EnumValueTag)
152 return makeEnumField(field);
155 template <
typename TField>
156 static ToolsFieldPtr createFieldInternal(TField& field, StringTag)
158 return makeStringField(field);
161 template <
typename TField>
162 static ToolsFieldPtr createFieldInternal(TField& field, BitfieldTag)
164 auto toolsField = makeBitfieldField(field);
166 using FieldPtrType = std::decay_t<
decltype(toolsField)>;
167 using FieldType =
typename FieldPtrType::element_type;
168 using MembersListType =
typename FieldType::Members;
170 MembersListType subFields;
171 auto& memberFields = field.value();
172 comms::util::tupleForEach(
174 SubfieldsCreateHelper(
175 [&subFields](ToolsFieldPtr fieldParam)
177 subFields.push_back(std::move(fieldParam));
180 toolsField->setMembers(std::move(subFields));
184 template <
typename TField>
185 static ToolsFieldPtr createFieldInternal(TField& field, OptionalTag)
187 auto toolsField = makeOptionalField(field);
188 auto& wrappedField = field.field();
189 auto wrappedToolsField = createField(wrappedField);
190 toolsField->setField(std::move(wrappedToolsField));
194 template <
typename TField>
195 static ToolsFieldPtr createFieldInternal(TField& field, BundleTag)
197 auto toolsField = makeBundleField(field);
199 using FieldPtrType = std::decay_t<
decltype(toolsField)>;
200 using FieldType =
typename FieldPtrType::element_type;
201 using MemberFieldsList =
typename FieldType::Members;
203 MemberFieldsList subFields;
204 auto& memberFields = field.value();
205 comms::util::tupleForEach(
207 SubfieldsCreateHelper(
208 [&subFields](ToolsFieldPtr fieldParam)
210 subFields.push_back(std::move(fieldParam));
213 toolsField->setMembers(std::move(subFields));
217 template <
typename TField>
218 static ToolsFieldPtr createFieldInternal(TField& field, RawDataArrayListTag)
220 return makeRawDataField(field);
223 template <
typename TField>
224 static ToolsFieldPtr createFieldInternal(TField& field, FieldsArrayListTag)
226 using DecayedField = std::decay_t<
decltype(field)>;
227 using CollectionType =
typename DecayedField::ValueType;
228 using ElementType =
typename CollectionType::value_type;
230 auto toolsField = makeArrayListField(field);
231 if (toolsField->hasFixedSize()) {
232 toolsField->adjustFixedSize();
235 toolsField->setWrapFieldCallback(
236 [](ElementType& memField) -> ToolsFieldPtr
238 return ToolsFieldCreator::createField(memField);
241 toolsField->refreshMembers();
245 template <
typename TField>
246 static ToolsFieldPtr createFieldInternal(TField& field, FloatValueTag)
248 return makeFloatField(field);
251 template <
typename TField>
252 static ToolsFieldPtr createFieldInternal(TField& field, VariantTag)
254 auto toolsField = makeVariantField(field);
256 toolsField->setMemberCreateCallback(
257 [&field]() -> ToolsFieldPtr
260 if (field.currentFieldValid()) {
261 field.currentFieldExec(
262 SubfieldsCreateHelper(
263 [&ptr](ToolsFieldPtr wrappedToolsField) noexcept
265 ptr = std::move(wrappedToolsField);
271 if (field.currentFieldValid()) {
272 field.currentFieldExec(
273 SubfieldsCreateHelper(
274 [&toolsField](ToolsFieldPtr wrappedToolsField)
276 toolsField->setCurrent(std::move(wrappedToolsField));
280 toolsField->setCurrent(ToolsFieldPtr());
286 template <
typename TField,
typename TTag>
287 static ToolsFieldPtr createFieldInternal(TField& field, TTag)
289 return makeUnknownField(field);
293 FieldsList& m_fields;