21#include "cc_tools_qt/details/ToolsFieldBase.h"
22#include "cc_tools_qt/field/ToolsStringField.h"
24#include "comms/field/String.h"
38template <
typename TField>
39class ToolsStringFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>
41 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>;
45 using SerialisedSeq =
typename Base::SerialisedSeq;
46 using Ptr =
typename Base::Ptr;
47 using ActPtr =
typename Base::ActPtr;
49 explicit ToolsStringFieldImpl(Field& fieldRef)
54 ToolsStringFieldImpl(
const ToolsStringFieldImpl&) =
default;
55 ToolsStringFieldImpl(ToolsStringFieldImpl&&) =
default;
56 virtual ~ToolsStringFieldImpl() noexcept = default;
58 ToolsStringFieldImpl& operator=(const ToolsStringFieldImpl&) = delete;
62 virtual QString getValueImpl()
const override
64 auto& strField = Base::field();
65 return QString::fromUtf8(strField.getValue().c_str(),
static_cast<int>(strField.getValue().size()));
68 virtual void setValueImpl(
const QString& val)
override
72 Field::hasFixedValue(),
77 setValueInternal(val, Tag());
80 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
82 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
83 assert(Must_not_be_called);
87 virtual int maxSizeImpl()
const override
89 return maxSizeInternal(SizeExistanceTag());
92 virtual Ptr cloneImpl()
override
94 return ActPtr(
new ToolsStringFieldImpl<TField>(Base::field()));
98 struct SizeFieldExistsTag {};
99 struct SerLengthFieldExistsTag {};
100 struct NoSizeFieldTag {};
101 struct HasFeatureTag {};
102 struct NoFeatureTag {};
104 using SizeExistanceTag =
106 Field::hasSizeFieldPrefix(),
109 Field::hasSerLengthFieldPrefix(),
110 SerLengthFieldExistsTag,
115 template <
typename TPrefixField>
116 static int maxSizeByPrefix()
118 if (
sizeof(
int) <= TPrefixField::maxLength()) {
119 return std::numeric_limits<int>::max();
123 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
125 return static_cast<int>((1U << shift) - 1);
128 static int maxSizeInternal(SizeFieldExistsTag)
130 using SizeField =
typename Field::SizeFieldPrefix;
131 return maxSizeByPrefix<SizeField>();
134 static int maxSizeInternal(SerLengthFieldExistsTag)
136 using LengthField =
typename Field::SerLengthFieldPrefix;
137 return maxSizeByPrefix<LengthField>();
140 int maxSizeInternal(NoSizeFieldTag)
const
145 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
146 Base::field().getValue().max_size()));
149 void setValueInternal(
const QString& val, HasFeatureTag)
151 Base::field().setValue(val.toStdString().c_str());
154 void setValueInternal([[maybe_unused]]
const QString& val, NoFeatureTag)
156 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
157 assert(Must_not_be_called);
161template <
typename TField>
162auto makeStringField(TField& field)
164 return std::make_unique<ToolsStringFieldImpl<TField>>(field);