20#include "cc_tools_qt/details/ToolsFieldBase.h"
21#include "cc_tools_qt/field/ToolsRawDataField.h"
23#include "comms/field/ArrayList.h"
36template <
typename TField>
37class ToolsRawDataFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>
39 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>;
43 using SerialisedSeq =
typename Base::SerialisedSeq;
44 using Ptr =
typename Base::Ptr;
45 using ActPtr =
typename Base::ActPtr;
47 explicit ToolsRawDataFieldImpl(Field& fieldRef)
52 ToolsRawDataFieldImpl(
const ToolsRawDataFieldImpl&) =
default;
53 ToolsRawDataFieldImpl(ToolsRawDataFieldImpl&&) =
default;
54 virtual ~ToolsRawDataFieldImpl() noexcept = default;
56 ToolsRawDataFieldImpl& operator=(const ToolsRawDataFieldImpl&) = delete;
60 virtual QString getValueImpl()
const override
63 auto& dataField = Base::field();
64 auto& data = dataField.value();
66 int maxLen =
static_cast<int>(Base::length() * 2);
67 if (Base::isTruncated()) {
68 maxLen =
static_cast<decltype(maxLen)
>(Base::TruncateLength * 2);
71 for (
auto byte : data) {
72 if (maxLen <= retStr.size()) {
76 retStr.append(QString(
"%1").arg(
static_cast<uint
>(
byte), 2, 16, QChar(
'0')));
81 virtual void setValueImpl(
const QString& val)
override
87 [&data, &byteStr]()
mutable
90 auto intVal = byteStr.toInt(&ok, 16);
95 data.push_back(
static_cast<typename SerialisedSeq::value_type
>(intVal));
100 if (((ch <
'0') || (
'9' < ch)) &&
101 ((ch.toLower() <
'a') || (
'f' < ch.toLower()))) {
107 if (2 <= byteStr.size()) {
112 if (!byteStr.isEmpty()) {
117 Base::setSerialisedValueImpl(data);
120 virtual SerialisedSeq getSerialisedValueImpl()
const override
122 auto serValue = Base::getSerialisedValueImpl();
123 if (Base::isTruncated()) {
124 serValue.resize(Base::TruncateLength);
130 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
132 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
133 assert(Must_not_be_called);
137 virtual int maxSizeImpl()
const override
139 return maxSizeInternal(SizeExistanceTag());
142 virtual int minSizeImpl()
const override
144 return minSizeInternal(SizeExistanceTag());
147 virtual Ptr cloneImpl()
override
149 return ActPtr(
new ToolsRawDataFieldImpl<TField>(Base::field()));
153 struct SizeFieldExistsTag {};
154 struct SerLengthFieldExistsTag {};
155 struct FixedSizeTag {};
156 struct NoLimitsTag {};
158 using SizeExistanceTag =
160 Field::hasSizeFieldPrefix(),
163 Field::hasSerLengthFieldPrefix(),
164 SerLengthFieldExistsTag,
166 Field::hasFixedSize(),
173 template <
typename TPrefixField>
174 static int maxSizeByPrefix()
176 if (
sizeof(
int) <= TPrefixField::maxLength()) {
177 return std::numeric_limits<int>::max();
181 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
183 return static_cast<int>((1U << shift) - 1);
186 static int maxSizeInternal(SizeFieldExistsTag)
188 using PrefixField =
typename Field::SizeFieldPrefix;
189 return maxSizeByPrefix<PrefixField>();
192 static int maxSizeInternal(SerLengthFieldExistsTag)
194 using PrefixField =
typename Field::SerLengthFieldPrefix;
195 return maxSizeByPrefix<PrefixField>();
198 static int maxSizeInternal(FixedSizeTag)
200 return static_cast<int>(Field::fixedSize());
203 int maxSizeInternal(NoLimitsTag)
const
208 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
209 Base::field().value().max_size()));
212 static int minSizeInternal(SizeFieldExistsTag)
217 static int minSizeInternal(SerLengthFieldExistsTag)
222 static int minSizeInternal(FixedSizeTag)
224 return static_cast<int>(Field::fixedSize());
227 int minSizeInternal(NoLimitsTag)
const
233template <
typename TField>
234auto makeRawDataField(TField& field)
236 return std::make_unique<ToolsRawDataFieldImpl<TField>>(field);