38 UnsignedInteger = 0x00,
39 NegativeInteger = 0x20,
41 ByteArray = ByteString,
57 enum StringResultCode {
62 template <
typename Container>
struct StringResult {
64 StringResultCode status = Error;
66 Q_ENUM(StringResultCode)
69 QCborStreamReader(
const char *data, qsizetype len);
70 QCborStreamReader(
const quint8 *data, qsizetype len);
71 explicit QCborStreamReader(
const QByteArray &data);
72 explicit QCborStreamReader(QIODevice *device);
74 Q_DISABLE_COPY(QCborStreamReader)
76 void setDevice(QIODevice *device);
77 QIODevice *device()
const;
78 void addData(
const QByteArray &data);
79 void addData(
const char *data, qsizetype len);
80 void addData(
const quint8 *data, qsizetype len)
81 { addData(
reinterpret_cast<
const char *>(data), len); }
86#if QT_CORE_REMOVED_SINCE(6
, 7
)
87 QCborError lastError();
89 QCborError lastError()
const;
91 qint64 currentOffset()
const;
93 bool isValid()
const {
return !isInvalid(); }
95 int containerDepth()
const;
96 QCborStreamReader::Type parentContainerType()
const;
97 Q_DECL_PURE_FUNCTION
bool hasNext()
const noexcept;
98 bool next(
int maxRecursion = 10000);
100 Type type()
const {
return QCborStreamReader::Type(type_); }
101 bool isUnsignedInteger()
const {
return type() == UnsignedInteger; }
102 bool isNegativeInteger()
const {
return type() == NegativeInteger; }
103 bool isInteger()
const {
return quint8(type()) <= quint8(NegativeInteger); }
104 bool isByteArray()
const {
return type() == ByteArray; }
105 bool isString()
const {
return type() == String; }
106 bool isArray()
const {
return type() == Array; }
107 bool isMap()
const {
return type() == Map; }
108 bool isTag()
const {
return type() == Tag; }
109 bool isSimpleType()
const {
return type() == SimpleType; }
110 bool isFloat16()
const {
return type() == Float16; }
111 bool isFloat()
const {
return type() == Float; }
112 bool isDouble()
const {
return type() == Double; }
113 bool isInvalid()
const {
return type() == Invalid; }
115 bool isSimpleType(QCborSimpleType st)
const {
return isSimpleType() && toSimpleType() == st; }
116 bool isFalse()
const {
return isSimpleType(QCborSimpleType::False); }
117 bool isTrue()
const {
return isSimpleType(QCborSimpleType::True); }
118 bool isBool()
const {
return isFalse() || isTrue(); }
119 bool isNull()
const {
return isSimpleType(QCborSimpleType::Null); }
120 bool isUndefined()
const {
return isSimpleType(QCborSimpleType::Undefined); }
122 Q_DECL_PURE_FUNCTION
bool isLengthKnown()
const noexcept;
123 quint64 length()
const;
125 bool isContainer()
const {
return isMap() || isArray(); }
126 bool enterContainer() { Q_ASSERT(isContainer());
return _enterContainer_helper(); }
127 bool leaveContainer();
129 bool readAndAppendToString(QString &dst)
130 { Q_ASSERT(isString());
return _readAndAppendToString_helper(dst); }
131 bool readAndAppendToUtf8String(QByteArray &dst)
132 { Q_ASSERT(isString());
return _readAndAppendToUtf8String_helper(dst); }
133 bool readAndAppendToByteArray(QByteArray &dst)
134 { Q_ASSERT(isByteArray());
return _readAndAppendToByteArray_helper(dst); }
135 StringResult<QString> readString() { Q_ASSERT(isString());
return _readString_helper(); }
136 StringResult<QByteArray> readUtf8String() { Q_ASSERT(isString());
return _readUtf8String_helper(); }
137 StringResult<QByteArray> readByteArray(){ Q_ASSERT(isByteArray());
return _readByteArray_helper(); }
138 qsizetype currentStringChunkSize()
const{ Q_ASSERT(isString() || isByteArray());
return _currentStringChunkSize(); }
139 StringResult<qsizetype> readStringChunk(
char *ptr, qsizetype maxlen);
141 bool toBool()
const { Q_ASSERT(isBool());
return value64 -
int(QCborSimpleType::False); }
142 QCborTag toTag()
const { Q_ASSERT(isTag());
return QCborTag(value64); }
143 quint64 toUnsignedInteger()
const { Q_ASSERT(isUnsignedInteger());
return value64; }
144 QCborNegativeInteger toNegativeInteger()
const { Q_ASSERT(isNegativeInteger());
return QCborNegativeInteger(value64 + 1); }
145 QCborSimpleType toSimpleType()
const{ Q_ASSERT(isSimpleType());
return QCborSimpleType(value64); }
146 qfloat16 toFloat16()
const { Q_ASSERT(isFloat16());
return _toFloatingPoint<qfloat16>(); }
147 float toFloat()
const { Q_ASSERT(isFloat());
return _toFloatingPoint<
float>(); }
148 double toDouble()
const { Q_ASSERT(isDouble());
return _toFloatingPoint<
double>(); }
150 qint64 toInteger()
const
152 Q_ASSERT(isInteger());
153 qint64 v = qint64(value64);
154 if (isNegativeInteger())
158 QString readAllString()
161 if (!readAndAppendToString(dst))
165 QByteArray readAllUtf8String()
168 if (!readAndAppendToUtf8String(dst))
172 QByteArray readAllByteArray()
175 if (!readAndAppendToByteArray(dst))
182 bool _enterContainer_helper();
183 StringResult<QString> _readString_helper();
184 StringResult<QByteArray> _readUtf8String_helper();
185 StringResult<QByteArray> _readByteArray_helper();
186 qsizetype _currentStringChunkSize()
const;
187 bool _readAndAppendToString_helper(QString &);
188 bool _readAndAppendToUtf8String_helper(QByteArray &);
189 bool _readAndAppendToByteArray_helper(QByteArray &);
191 template <
typename FP> FP _toFloatingPoint()
const noexcept
193 using UIntFP =
typename QIntegerForSizeof<FP>::Unsigned;
194 UIntFP u = UIntFP(value64);
195#ifdef __cpp_lib_bit_cast
196 return std::bit_cast<FP>(u);
199 memcpy(
static_cast<
void *>(&f), &u,
sizeof(f));
204 friend QCborStreamReaderPrivate;
205 friend class QCborContainerPrivate;
207 std::unique_ptr<QCborStreamReaderPrivate> d;
209 quint8 reserved[3] = {};