22#include "cc_tools_qt/details/ToolsFieldBase.h"
23#include "cc_tools_qt/field/ToolsRawDataField.h"
25#include "comms/field/ArrayList.h"
38template <
typename TField>
39class ToolsRawDataFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>
41 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>;
45 using SerialisedSeq =
typename Base::SerialisedSeq;
46 using Ptr =
typename Base::Ptr;
47 using ActPtr =
typename Base::ActPtr;
49 explicit ToolsRawDataFieldImpl(Field& fieldRef)
54 ToolsRawDataFieldImpl(
const ToolsRawDataFieldImpl&) =
default;
55 ToolsRawDataFieldImpl(ToolsRawDataFieldImpl&&) =
default;
56 virtual ~ToolsRawDataFieldImpl() noexcept = default;
58 ToolsRawDataFieldImpl& operator=(const ToolsRawDataFieldImpl&) = delete;
62 virtual QString getValueImpl()
const override
65 auto& dataField = Base::field();
66 auto& data = dataField.value();
68 int maxLen =
static_cast<int>(Base::length() * 2);
69 if (Base::isTruncated()) {
70 maxLen =
static_cast<decltype(maxLen)
>(Base::TruncateLength * 2);
73 for (
auto byte : data) {
74 if (maxLen <= retStr.size()) {
78 retStr.append(QString(
"%1").arg(
static_cast<uint
>(
byte), 2, 16, QChar(
'0')));
83 virtual void setValueImpl(
const QString& val)
override
89 [&data, &byteStr]()
mutable
92 auto intVal = byteStr.toInt(&ok, 16);
97 data.push_back(
static_cast<typename SerialisedSeq::value_type
>(intVal));
101 for (
auto ch : val) {
102 if (((ch <
'0') || (
'9' < ch)) &&
103 ((ch.toLower() <
'a') || (
'f' < ch.toLower()))) {
109 if (2 <= byteStr.size()) {
114 if (!byteStr.isEmpty()) {
119 Base::setSerialisedValueImpl(data);
122 virtual SerialisedSeq getSerialisedValueImpl()
const override
124 auto serValue = Base::getSerialisedValueImpl();
125 if (Base::isTruncated()) {
126 serValue.resize(Base::TruncateLength);
132 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
134 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
135 assert(Must_not_be_called);
139 virtual int maxSizeImpl()
const override
141 return maxSizeInternal(SizeExistanceTag());
144 virtual int minSizeImpl()
const override
146 return minSizeInternal(SizeExistanceTag());
149 virtual Ptr cloneImpl()
override
151 return ActPtr(
new ToolsRawDataFieldImpl<TField>(Base::field()));
155 struct SizeFieldExistsTag {};
156 struct SerLengthFieldExistsTag {};
157 struct FixedSizeTag {};
158 struct NoLimitsTag {};
160 using SizeExistanceTag =
162 Field::hasSizeFieldPrefix(),
165 Field::hasSerLengthFieldPrefix(),
166 SerLengthFieldExistsTag,
168 Field::hasFixedSize(),
175 template <
typename TPrefixField>
176 static int maxSizeByPrefix()
178 if (
sizeof(
int) <= TPrefixField::maxLength()) {
179 return std::numeric_limits<int>::max();
183 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
185 return static_cast<int>((1U << shift) - 1);
188 static int maxSizeInternal(SizeFieldExistsTag)
190 using PrefixField =
typename Field::SizeFieldPrefix;
191 return maxSizeByPrefix<PrefixField>();
194 static int maxSizeInternal(SerLengthFieldExistsTag)
196 using PrefixField =
typename Field::SerLengthFieldPrefix;
197 return maxSizeByPrefix<PrefixField>();
200 static int maxSizeInternal(FixedSizeTag)
202 return static_cast<int>(Field::fixedSize());
205 int maxSizeInternal(NoLimitsTag)
const
210 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
211 Base::field().value().max_size()));
214 static int minSizeInternal(SizeFieldExistsTag)
219 static int minSizeInternal(SerLengthFieldExistsTag)
224 static int minSizeInternal(FixedSizeTag)
226 return static_cast<int>(Field::fixedSize());
229 int minSizeInternal(NoLimitsTag)
const
235template <
typename TField>
236auto makeRawDataField(TField& field)
238 return std::make_unique<ToolsRawDataFieldImpl<TField>>(field);