20#include "cc_tools_qt/details/ToolsFieldBase.h"
21#include "cc_tools_qt/field/ToolsStringField.h"
23#include "comms/field/String.h"
37template <
typename TField>
38class ToolsStringFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>
40 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsStringField, TField>;
44 using SerialisedSeq =
typename Base::SerialisedSeq;
45 using Ptr =
typename Base::Ptr;
46 using ActPtr =
typename Base::ActPtr;
48 explicit ToolsStringFieldImpl(Field& fieldRef)
53 ToolsStringFieldImpl(
const ToolsStringFieldImpl&) =
default;
54 ToolsStringFieldImpl(ToolsStringFieldImpl&&) =
default;
55 virtual ~ToolsStringFieldImpl() noexcept = default;
57 ToolsStringFieldImpl& operator=(const ToolsStringFieldImpl&) = delete;
61 virtual QString getValueImpl()
const override
63 auto& strField = Base::field();
64 return QString::fromUtf8(strField.getValue().c_str(),
static_cast<int>(strField.getValue().size()));
67 virtual void setValueImpl(
const QString& val)
override
71 Field::hasFixedValue(),
76 setValueInternal(val, Tag());
79 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
81 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
82 assert(Must_not_be_called);
86 virtual int maxSizeImpl()
const override
88 return maxSizeInternal(SizeExistanceTag());
91 virtual Ptr cloneImpl()
override
93 return ActPtr(
new ToolsStringFieldImpl<TField>(Base::field()));
97 struct SizeFieldExistsTag {};
98 struct SerLengthFieldExistsTag {};
99 struct NoSizeFieldTag {};
100 struct HasFeatureTag {};
101 struct NoFeatureTag {};
103 using SizeExistanceTag =
105 Field::hasSizeFieldPrefix(),
108 Field::hasSerLengthFieldPrefix(),
109 SerLengthFieldExistsTag,
114 template <
typename TPrefixField>
115 static int maxSizeByPrefix()
117 if (
sizeof(
int) <= TPrefixField::maxLength()) {
118 return std::numeric_limits<int>::max();
122 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
124 return static_cast<int>((1U << shift) - 1);
127 static int maxSizeInternal(SizeFieldExistsTag)
129 using SizeField =
typename Field::SizeFieldPrefix;
130 return maxSizeByPrefix<SizeField>();
133 static int maxSizeInternal(SerLengthFieldExistsTag)
135 using LengthField =
typename Field::SerLengthFieldPrefix;
136 return maxSizeByPrefix<LengthField>();
139 int maxSizeInternal(NoSizeFieldTag)
const
144 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
145 Base::field().getValue().max_size()));
148 void setValueInternal(
const QString& val, HasFeatureTag)
150 Base::field().setValue(val.toStdString().c_str());
153 void setValueInternal([[maybe_unused]]
const QString& val, NoFeatureTag)
155 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
156 assert(Must_not_be_called);
160template <
typename TField>
161auto makeStringField(TField& field)
163 return std::make_unique<ToolsStringFieldImpl<TField>>(field);