22#include "cc_tools_qt/details/ToolsFieldBase.h"
23#include "cc_tools_qt/field/ToolsStringField.h"
25#include "comms/field/String.h"
39template <
typename TField>
40class ToolsStringFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>
42 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>;
46 using SerialisedSeq =
typename Base::SerialisedSeq;
47 using Ptr =
typename Base::Ptr;
48 using ActPtr =
typename Base::ActPtr;
50 explicit ToolsStringFieldImpl(Field& fieldRef)
55 ToolsStringFieldImpl(
const ToolsStringFieldImpl&) =
default;
56 ToolsStringFieldImpl(ToolsStringFieldImpl&&) =
default;
57 virtual ~ToolsStringFieldImpl() noexcept = default;
59 ToolsStringFieldImpl& operator=(const ToolsStringFieldImpl&) = delete;
63 virtual QString getValueImpl()
const override
65 auto& strField = Base::field();
66 return QString::fromUtf8(strField.getValue().c_str(),
static_cast<int>(strField.getValue().size()));
69 virtual void setValueImpl(
const QString& val)
override
73 Field::hasFixedValue(),
78 setValueInternal(val, Tag());
81 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
83 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
84 assert(Must_not_be_called);
88 virtual int maxSizeImpl()
const override
90 return maxSizeInternal(SizeExistanceTag());
93 virtual Ptr cloneImpl()
override
95 return ActPtr(
new ToolsStringFieldImpl<TField>(Base::field()));
99 struct SizeFieldExistsTag {};
100 struct SerLengthFieldExistsTag {};
101 struct NoSizeFieldTag {};
102 struct HasFeatureTag {};
103 struct NoFeatureTag {};
105 using SizeExistanceTag =
107 Field::hasSizeFieldPrefix(),
110 Field::hasSerLengthFieldPrefix(),
111 SerLengthFieldExistsTag,
116 template <
typename TPrefixField>
117 static int maxSizeByPrefix()
119 if (
sizeof(
int) <= TPrefixField::maxLength()) {
120 return std::numeric_limits<int>::max();
124 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
126 return static_cast<int>((1U << shift) - 1);
129 static int maxSizeInternal(SizeFieldExistsTag)
131 using SizeField =
typename Field::SizeFieldPrefix;
132 return maxSizeByPrefix<SizeField>();
135 static int maxSizeInternal(SerLengthFieldExistsTag)
137 using LengthField =
typename Field::SerLengthFieldPrefix;
138 return maxSizeByPrefix<LengthField>();
141 int maxSizeInternal(NoSizeFieldTag)
const
146 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
147 Base::field().getValue().max_size()));
150 void setValueInternal(
const QString& val, HasFeatureTag)
152 Base::field().setValue(val.toStdString().c_str());
155 void setValueInternal([[maybe_unused]]
const QString& val, NoFeatureTag)
157 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
158 assert(Must_not_be_called);
162template <
typename TField>
163auto makeStringField(TField& field)
165 return std::make_unique<ToolsStringFieldImpl<TField>>(field);