21#include "cc_tools_qt/details/ToolsFieldBase.h"
22#include "cc_tools_qt/field/ToolsRawDataField.h"
24#include "comms/field/ArrayList.h"
37template <
typename TField>
38class ToolsRawDataFieldImpl :
public ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>
40 using Base = ToolsFieldBase<cc_tools_qt::field::ToolsRawDataField, TField>;
44 using SerialisedSeq =
typename Base::SerialisedSeq;
45 using Ptr =
typename Base::Ptr;
46 using ActPtr =
typename Base::ActPtr;
48 explicit ToolsRawDataFieldImpl(Field& fieldRef)
53 ToolsRawDataFieldImpl(
const ToolsRawDataFieldImpl&) =
default;
54 ToolsRawDataFieldImpl(ToolsRawDataFieldImpl&&) =
default;
55 virtual ~ToolsRawDataFieldImpl() noexcept = default;
57 ToolsRawDataFieldImpl& operator=(const ToolsRawDataFieldImpl&) = delete;
61 virtual QString getValueImpl()
const override
64 auto& dataField = Base::field();
65 auto& data = dataField.value();
67 int maxLen =
static_cast<int>(Base::length() * 2);
68 if (Base::isTruncated()) {
69 maxLen =
static_cast<decltype(maxLen)
>(Base::TruncateLength * 2);
72 for (
auto byte : data) {
73 if (maxLen <= retStr.size()) {
77 retStr.append(QString(
"%1").arg(
static_cast<uint
>(
byte), 2, 16, QChar(
'0')));
82 virtual void setValueImpl(
const QString& val)
override
88 [&data, &byteStr]()
mutable
91 auto intVal = byteStr.toInt(&ok, 16);
96 data.push_back(
static_cast<typename SerialisedSeq::value_type
>(intVal));
100 for (
auto ch : val) {
101 if (((ch <
'0') || (
'9' < ch)) &&
102 ((ch.toLower() <
'a') || (
'f' < ch.toLower()))) {
108 if (2 <= byteStr.size()) {
113 if (!byteStr.isEmpty()) {
118 Base::setSerialisedValueImpl(data);
121 virtual SerialisedSeq getSerialisedValueImpl()
const override
123 auto serValue = Base::getSerialisedValueImpl();
124 if (Base::isTruncated()) {
125 serValue.resize(Base::TruncateLength);
131 virtual bool setSerialisedValueImpl([[maybe_unused]]
const SerialisedSeq& value)
override
133 [[maybe_unused]]
static constexpr bool Must_not_be_called =
false;
134 assert(Must_not_be_called);
138 virtual int maxSizeImpl()
const override
140 return maxSizeInternal(SizeExistanceTag());
143 virtual int minSizeImpl()
const override
145 return minSizeInternal(SizeExistanceTag());
148 virtual Ptr cloneImpl()
override
150 return ActPtr(
new ToolsRawDataFieldImpl<TField>(Base::field()));
154 struct SizeFieldExistsTag {};
155 struct SerLengthFieldExistsTag {};
156 struct FixedSizeTag {};
157 struct NoLimitsTag {};
159 using SizeExistanceTag =
161 Field::hasSizeFieldPrefix(),
164 Field::hasSerLengthFieldPrefix(),
165 SerLengthFieldExistsTag,
167 Field::hasFixedSize(),
174 template <
typename TPrefixField>
175 static int maxSizeByPrefix()
177 if (
sizeof(
int) <= TPrefixField::maxLength()) {
178 return std::numeric_limits<int>::max();
182 TPrefixField::maxLength() * std::numeric_limits<std::uint8_t>::digits;
184 return static_cast<int>((1U << shift) - 1);
187 static int maxSizeInternal(SizeFieldExistsTag)
189 using PrefixField =
typename Field::SizeFieldPrefix;
190 return maxSizeByPrefix<PrefixField>();
193 static int maxSizeInternal(SerLengthFieldExistsTag)
195 using PrefixField =
typename Field::SerLengthFieldPrefix;
196 return maxSizeByPrefix<PrefixField>();
199 static int maxSizeInternal(FixedSizeTag)
201 return static_cast<int>(Field::fixedSize());
204 int maxSizeInternal(NoLimitsTag)
const
209 static_cast<std::size_t
>(std::numeric_limits<int>::max()),
210 Base::field().value().max_size()));
213 static int minSizeInternal(SizeFieldExistsTag)
218 static int minSizeInternal(SerLengthFieldExistsTag)
223 static int minSizeInternal(FixedSizeTag)
225 return static_cast<int>(Field::fixedSize());
228 int minSizeInternal(NoLimitsTag)
const
234template <
typename TField>
235auto makeRawDataField(TField& field)
237 return std::make_unique<ToolsRawDataFieldImpl<TField>>(field);