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 bytesAvailable()
const;
92 qint64 currentOffset()
const;
94 bool isValid()
const {
return !isInvalid(); }
96 int containerDepth()
const;
97 QCborStreamReader::Type parentContainerType()
const;
98 Q_DECL_PURE_FUNCTION
bool hasNext()
const noexcept;
99 bool next(
int maxRecursion = 10000);
101 Type type()
const {
return QCborStreamReader::Type(type_); }
102 bool isUnsignedInteger()
const {
return type() == UnsignedInteger; }
103 bool isNegativeInteger()
const {
return type() == NegativeInteger; }
104 bool isInteger()
const {
return quint8(type()) <= quint8(NegativeInteger); }
105 bool isByteArray()
const {
return type() == ByteArray; }
106 bool isString()
const {
return type() == String; }
107 bool isArray()
const {
return type() == Array; }
108 bool isMap()
const {
return type() == Map; }
109 bool isTag()
const {
return type() == Tag; }
110 bool isSimpleType()
const {
return type() == SimpleType; }
111 bool isFloat16()
const {
return type() == Float16; }
112 bool isFloat()
const {
return type() == Float; }
113 bool isDouble()
const {
return type() == Double; }
114 bool isNumber()
const {
return isInteger() || isFloat16() || isFloat() || isDouble(); }
115 bool isInvalid()
const {
return type() == Invalid; }
117 bool isSimpleType(QCborSimpleType st)
const {
return isSimpleType() && toSimpleType() == st; }
118 bool isFalse()
const {
return isSimpleType(QCborSimpleType::False); }
119 bool isTrue()
const {
return isSimpleType(QCborSimpleType::True); }
120 bool isBool()
const {
return isFalse() || isTrue(); }
121 bool isNull()
const {
return isSimpleType(QCborSimpleType::Null); }
122 bool isUndefined()
const {
return isSimpleType(QCborSimpleType::Undefined); }
124 Q_DECL_PURE_FUNCTION
bool isLengthKnown()
const noexcept;
125 quint64 length()
const;
127 bool isContainer()
const {
return isMap() || isArray(); }
128 bool enterContainer() { Q_ASSERT(isContainer());
return _enterContainer_helper(); }
129 bool leaveContainer();
131 bool readAndAppendToString(QString &dst)
132 { Q_ASSERT(isString());
return _readAndAppendToString_helper(dst); }
133 bool readAndAppendToUtf8String(QByteArray &dst)
134 { Q_ASSERT(isString());
return _readAndAppendToUtf8String_helper(dst); }
135 bool readAndAppendToByteArray(QByteArray &dst)
136 { Q_ASSERT(isByteArray());
return _readAndAppendToByteArray_helper(dst); }
137 StringResult<QString> readString() { Q_ASSERT(isString());
return _readString_helper(); }
138 StringResult<QByteArray> readUtf8String() { Q_ASSERT(isString());
return _readUtf8String_helper(); }
139 StringResult<QByteArray> readByteArray(){ Q_ASSERT(isByteArray());
return _readByteArray_helper(); }
140 qsizetype currentStringChunkSize()
const{ Q_ASSERT(isString() || isByteArray());
return _currentStringChunkSize(); }
141 StringResult<qsizetype> readStringChunk(
char *ptr, qsizetype maxlen);
143 bool toBool()
const { Q_ASSERT(isBool());
return value64 -
int(QCborSimpleType::False); }
144 QCborTag toTag()
const { Q_ASSERT(isTag());
return QCborTag(value64); }
145 quint64 toUnsignedInteger()
const { Q_ASSERT(isUnsignedInteger());
return value64; }
146 QCborNegativeInteger toNegativeInteger()
const { Q_ASSERT(isNegativeInteger());
return QCborNegativeInteger(value64 + 1); }
147 QCborSimpleType toSimpleType()
const{ Q_ASSERT(isSimpleType());
return QCborSimpleType(value64); }
148 qfloat16 toFloat16()
const { Q_ASSERT(isFloat16());
return _toFloatingPoint<qfloat16>(); }
149 float toFloat()
const { Q_ASSERT(isFloat());
return _toFloatingPoint<
float>(); }
150 double toDouble()
const { Q_ASSERT(isDouble());
return _toFloatingPoint<
double>(); }
152 qint64 toInteger()
const
154 Q_ASSERT(isInteger());
155 qint64 v = qint64(value64);
156 if (isNegativeInteger())
160 double toNumber()
const
162 Q_ASSERT(isNumber());
164 return _toFloatingPoint<
double>();
166 return _toFloatingPoint<
float>();
168 return _toFloatingPoint<qfloat16>();
171 double val = value64;
172 if (isNegativeInteger())
176 QString readAllString()
179 if (!readAndAppendToString(dst))
183 QByteArray readAllUtf8String()
186 if (!readAndAppendToUtf8String(dst))
190 QByteArray readAllByteArray()
193 if (!readAndAppendToByteArray(dst))
200 bool _enterContainer_helper();
201 StringResult<QString> _readString_helper();
202 StringResult<QByteArray> _readUtf8String_helper();
203 StringResult<QByteArray> _readByteArray_helper();
204 qsizetype _currentStringChunkSize()
const;
205 bool _readAndAppendToString_helper(QString &);
206 bool _readAndAppendToUtf8String_helper(QByteArray &);
207 bool _readAndAppendToByteArray_helper(QByteArray &);
209 template <
typename FP> FP _toFloatingPoint()
const noexcept
211 using UIntFP =
typename QIntegerForSizeof<FP>::Unsigned;
212 UIntFP u = UIntFP(value64);
213#ifdef __cpp_lib_bit_cast
214 return std::bit_cast<FP>(u);
217 memcpy(
static_cast<
void *>(&f), &u,
sizeof(f));
222 friend QCborStreamReaderPrivate;
223 friend class QCborContainerPrivate;
225 std::unique_ptr<QCborStreamReaderPrivate> d;
227 quint8 reserved[3] = {};