// qcborstream.sip generated by MetaSIP
//
// This file is part of the QtCore Python extension module.
//
// Copyright (c) 2024 Riverbank Computing Limited <info@riverbankcomputing.com>
// 
// This file is part of PyQt5.
// 
// This file may be used under the terms of the GNU General Public License
// version 3.0 as published by the Free Software Foundation and appearing in
// the file LICENSE included in the packaging of this file.  Please review the
// following information to ensure the GNU General Public License version 3.0
// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
// 
// If you do not wish to use this file under the terms of the GPL version 3.0
// then you may purchase a commercial license.  For more information contact
// info@riverbankcomputing.com.
// 
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.


%If (Qt_5_12_0 -)

class QCborStreamWriter
{
%TypeHeaderCode
#include <qcborstream.h>
%End

public:
    explicit QCborStreamWriter(QIODevice *device);
    explicit QCborStreamWriter(QByteArray *data);
    ~QCborStreamWriter();
    void setDevice(QIODevice *device);
    QIODevice *device() const;
    void append(QCborSimpleType st);
    void append(QCborKnownTags tag);
    void append(const QString &str) [void (QStringView str)];
    void append(const QByteArray &ba);
    void append(bool b /Constrained/);
    void append(double d /Constrained/);
%MethodCode
        // Use the smallest type without losing precision.
        
        qfloat16 a0_16 = a0;
        
        if (qIsNaN(a0) || a0_16 == a0)
        {
            sipCpp->append(a0_16);
        }
        else
        {
            float a0_float = a0;
        
            if (a0_float == a0)
                sipCpp->append(a0_float);
            else
                sipCpp->append(a0);
        }
%End

    void append(SIP_PYOBJECT /TypeHint="int"/);
%MethodCode
        #if PY_MAJOR_VERSION < 3
        if (PyLong_Check(a0))
        #endif
        {
            static PyObject *zero = 0;
        
            if (!zero)
                zero = PyLong_FromLong(0);
        
            if (PyObject_RichCompareBool(a0, zero, Py_LT) > 0)
            {
                PyErr_Clear();
                qint64 val = sipLong_AsLongLong(a0);
        
                if (PyErr_Occurred())
                    sipError = sipErrorFail;
                else
                    sipCpp->append(val);
            }
            else
            {
                PyErr_Clear();
                quint64 val = sipLong_AsUnsignedLongLong(a0);
        
                if (PyErr_Occurred())
                    sipError = sipErrorFail;
                else
                    sipCpp->append(val);
            }
        }
        #if PY_MAJOR_VERSION < 3
        else if (PyInt_Check(a0))
        {
            PyErr_Clear();
            long val = PyInt_AsLong(a0);
        
            if (PyErr_Occurred())
                sipError = sipErrorFail;
            else if (val < 0)
                sipCpp->append((qint64)val);
            else
                sipCpp->append((quint64)val);
        }
        #endif
%End

    void appendNull();
    void appendUndefined();
    void startArray();
    void startArray(quint64 count);
    bool endArray();
    void startMap();
    void startMap(quint64 count);
    bool endMap();

private:
    QCborStreamWriter(const QCborStreamWriter &);
};

%End
%If (Qt_5_12_0 -)

class QCborStreamReader
{
%TypeHeaderCode
#include <qcborstream.h>
%End

public:
    enum Type
    {
        UnsignedInteger,
        NegativeInteger,
        ByteString,
        ByteArray,
        TextString,
        String,
        Array,
        Map,
        Tag,
        SimpleType,
        HalfFloat,
        Float16,
        Float,
        Double,
        Invalid,
    };

    enum StringResultCode
    {
        EndOfString,
        Ok,
        Error,
    };

    QCborStreamReader();
    explicit QCborStreamReader(const QByteArray &data);
    explicit QCborStreamReader(QIODevice *device);
    ~QCborStreamReader();
    void setDevice(QIODevice *device);
    QIODevice *device() const;
    void addData(const QByteArray &data);
    void reparse();
    void clear();
    void reset();
    QCborError lastError();
    qint64 currentOffset() const;
    bool isValid() const;
    int containerDepth() const;
    QCborStreamReader::Type parentContainerType() const;
    bool hasNext() const;
    bool next(int maxRecursion = 10000);
    QCborStreamReader::Type type() const;
    bool isUnsignedInteger() const;
    bool isNegativeInteger() const;
    bool isInteger() const;
    bool isByteArray() const;
    bool isString() const;
    bool isArray() const;
    bool isMap() const;
    bool isTag() const;
    bool isSimpleType() const;
    bool isFloat16() const;
    bool isFloat() const;
    bool isDouble() const;
    bool isInvalid() const;
    bool isSimpleType(QCborSimpleType st) const;
    bool isFalse() const;
    bool isTrue() const;
    bool isBool() const;
    bool isNull() const;
    bool isUndefined() const;
    bool isLengthKnown() const;
    quint64 length() const /__len__/;
    bool isContainer() const;
    bool enterContainer();
    bool leaveContainer();
    SIP_PYTUPLE readString() /TypeHint="Tuple[str, QCborStreamReader.StringResultCode]"/;
%MethodCode
        QCborStreamReader::StringResult<QString> res = sipCpp->readString();
        
        QString *qs = new QString;
        if (res.status != QCborStreamReader::Error)
            *qs = res.data;
        
        sipRes = sipBuildResult(NULL, "NF", qs, sipType_QString, NULL, res.status, sipType_QCborStreamReader_StringResultCode);
%End

    SIP_PYTUPLE readByteArray() /TypeHint="Tuple[QByteArray, QCborStreamReader.StringResultCode]"/;
%MethodCode
        QCborStreamReader::StringResult<QByteArray> res = sipCpp->readByteArray();
        
        QByteArray *qba = new QByteArray;
        if (res.status != QCborStreamReader::Error)
            *qba = res.data;
        
        sipRes = sipBuildResult(NULL, "NF", qba, sipType_QByteArray, NULL, res.status, sipType_QCborStreamReader_StringResultCode);
%End

    bool toBool() const;
    quint64 toUnsignedInteger() const;
    QCborSimpleType toSimpleType() const;
    double toDouble() const;
    qint64 toInteger() const;

private:
    QCborStreamReader(const QCborStreamReader &);
};

%End
