qtextstream.h: streamline includes

[ChangeLog][Potentially Source-Incompatible Changes] The qtextstream
header no longer includes <QString>, <QStringEncoder> and
<QStringDecoder>. Code which relied on the implicit inclusion of those
classes might now need to include the headers explicitly.

Task-number: QTBUG-97601
Change-Id: Ifb8c8452026195a772c0588dbbbc53fb51cac548
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Fabian Kosmale 2022-02-08 20:39:31 +01:00
parent 2201934efa
commit ae7799a924
9 changed files with 210 additions and 136 deletions

View File

@ -73,6 +73,7 @@
#include <QMessageBox>
#include <QMimeData>
#include <QMimeDatabase>
#include <QStringDecoder>
#if defined(QT_PRINTSUPPORT_LIB)
#include <QtPrintSupport/qtprintsupportglobal.h>
#if QT_CONFIG(printer)

View File

@ -180,6 +180,7 @@ qt_internal_add_module(Core
text/qstring.cpp text/qstring.h
text/qstringalgorithms.h text/qstringalgorithms_p.h
text/qstringbuilder.cpp text/qstringbuilder.h
text/qstringconverter_base.h
text/qstringconverter.cpp text/qstringconverter.h text/qstringconverter_p.h
text/qstringiterator_p.h
text/qstringlist.cpp text/qstringlist.h

View File

@ -41,10 +41,9 @@
#define QTEXTSTREAM_H
#include <QtCore/qiodevicebase.h>
#include <QtCore/qstring.h>
#include <QtCore/qchar.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qstringconverter.h>
#include <QtCore/qstringconverter_base.h>
#include <stdio.h>
@ -56,6 +55,7 @@ QT_BEGIN_NAMESPACE
class QIODevice;
class QLocale;
class QString;
class QTextStreamPrivate;
class Q_CORE_EXPORT QTextStream : public QIODeviceBase

View File

@ -53,6 +53,7 @@
//
#include <QtCore/private/qglobal_p.h>
#include <QtCore/qstringconverter.h>
#include "qiodevice.h"
#include "qlocale.h"
#include "qtextstream.h"

View File

@ -37,16 +37,22 @@
**
****************************************************************************/
#if 0
// keep existing syncqt header working after the move of the class
// into qstringconverter_base
#pragma qt_class(QStringConverter)
#pragma qt_class(QStringConverterBase)
#endif
#ifndef QSTRINGCONVERTER_H
#define QSTRINGCONVERTER_H
#include <QtCore/qstringconverter_base.h>
#include <QtCore/qstring.h>
#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
#include <QtCore/qstringbuilder.h>
#endif
#include <optional>
QT_BEGIN_NAMESPACE
// work around a compiler bug in GCC 7
@ -56,138 +62,6 @@ QT_BEGIN_NAMESPACE
#define QSTRINGCONVERTER_CONSTEXPR constexpr
#endif
class QStringConverterBase
{
public:
enum class Flag {
Default = 0,
Stateless = 0x1,
ConvertInvalidToNull = 0x2,
WriteBom = 0x4,
ConvertInitialBom = 0x8
};
Q_DECLARE_FLAGS(Flags, Flag)
struct State {
constexpr State(Flags f = Flag::Default)
: flags(f), state_data{0, 0, 0, 0} {}
~State() { clear(); }
State(State &&other)
: flags(other.flags),
remainingChars(other.remainingChars),
invalidChars(other.invalidChars),
d{other.d[0], other.d[1]},
clearFn(other.clearFn)
{ other.clearFn = nullptr; }
State &operator=(State &&other)
{
clear();
flags = other.flags;
remainingChars = other.remainingChars;
invalidChars = other.invalidChars;
d[0] = other.d[0];
d[1] = other.d[1];
clearFn = other.clearFn;
other.clearFn = nullptr;
return *this;
}
Q_CORE_EXPORT void clear();
Flags flags;
int internalState = 0;
qsizetype remainingChars = 0;
qsizetype invalidChars = 0;
union {
uint state_data[4];
void *d[2];
};
using ClearDataFn = void (*)(State *);
ClearDataFn clearFn = nullptr;
private:
Q_DISABLE_COPY(State)
};
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
class QStringConverter : public QStringConverterBase
{
public:
enum Encoding {
Utf8,
Utf16,
Utf16LE,
Utf16BE,
Utf32,
Utf32LE,
Utf32BE,
Latin1,
System,
LastEncoding = System
};
#ifdef Q_QDOC
// document the flags here
enum class Flag {
Default = 0,
Stateless = 0x1,
ConvertInvalidToNull = 0x2,
WriteBom = 0x4,
ConvertInitialBom = 0x8
};
Q_DECLARE_FLAGS(Flags, Flag)
#endif
protected:
struct Interface
{
using DecoderFn = QChar * (*)(QChar *out, QByteArrayView in, State *state);
using LengthFn = qsizetype (*)(qsizetype inLength);
using EncoderFn = char * (*)(char *out, QStringView in, State *state);
const char *name = nullptr;
DecoderFn toUtf16 = nullptr;
LengthFn toUtf16Len = nullptr;
EncoderFn fromUtf16 = nullptr;
LengthFn fromUtf16Len = nullptr;
};
QSTRINGCONVERTER_CONSTEXPR QStringConverter()
: iface(nullptr)
{}
QSTRINGCONVERTER_CONSTEXPR QStringConverter(Encoding encoding, Flags f)
: iface(&encodingInterfaces[int(encoding)]), state(f)
{}
QSTRINGCONVERTER_CONSTEXPR QStringConverter(const Interface *i)
: iface(i)
{}
Q_CORE_EXPORT QStringConverter(const char *name, Flags f);
public:
bool isValid() const { return iface != nullptr; }
void resetState()
{
state.clear();
}
bool hasError() const { return state.invalidChars != 0; }
const char *name() const
{ return isValid() ? iface->name : nullptr; }
Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
Q_CORE_EXPORT static std::optional<Encoding> encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0);
Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
protected:
const Interface *iface;
State state;
private:
Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
};
class QStringEncoder : public QStringConverter
{
protected:

View File

@ -0,0 +1,194 @@
/****************************************************************************
**
** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QSTRINGCONVERTER_BASE_H
#define QSTRINGCONVERTER_BASE_H
#if 0
// QStringConverter(Base) class are handled in qstringconverter
#pragma qt_sync_stop_processing
#endif
#include <optional>
#include <QtCore/qglobal.h> // QT_{BEGIN,END}_NAMESPACE
#include <QtCore/qflags.h> // Q_DECLARE_FLAGS
QT_BEGIN_NAMESPACE
class QByteArrayView;
class QChar;
class QByteArrayView;
class QStringView;
class QStringConverterBase
{
public:
enum class Flag {
Default = 0,
Stateless = 0x1,
ConvertInvalidToNull = 0x2,
WriteBom = 0x4,
ConvertInitialBom = 0x8
};
Q_DECLARE_FLAGS(Flags, Flag)
struct State {
constexpr State(Flags f = Flag::Default)
: flags(f), state_data{0, 0, 0, 0} {}
~State() { clear(); }
State(State &&other)
: flags(other.flags),
remainingChars(other.remainingChars),
invalidChars(other.invalidChars),
d{other.d[0], other.d[1]},
clearFn(other.clearFn)
{ other.clearFn = nullptr; }
State &operator=(State &&other)
{
clear();
flags = other.flags;
remainingChars = other.remainingChars;
invalidChars = other.invalidChars;
d[0] = other.d[0];
d[1] = other.d[1];
clearFn = other.clearFn;
other.clearFn = nullptr;
return *this;
}
Q_CORE_EXPORT void clear();
Flags flags;
int internalState = 0;
qsizetype remainingChars = 0;
qsizetype invalidChars = 0;
union {
uint state_data[4];
void *d[2];
};
using ClearDataFn = void (*)(State *);
ClearDataFn clearFn = nullptr;
private:
Q_DISABLE_COPY(State)
};
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QStringConverterBase::Flags)
class QStringConverter : public QStringConverterBase
{
public:
enum Encoding {
Utf8,
Utf16,
Utf16LE,
Utf16BE,
Utf32,
Utf32LE,
Utf32BE,
Latin1,
System,
LastEncoding = System
};
#ifdef Q_QDOC
// document the flags here
enum class Flag {
Default = 0,
Stateless = 0x1,
ConvertInvalidToNull = 0x2,
WriteBom = 0x4,
ConvertInitialBom = 0x8
};
Q_DECLARE_FLAGS(Flags, Flag)
#endif
protected:
struct Interface
{
using DecoderFn = QChar * (*)(QChar *out, QByteArrayView in, State *state);
using LengthFn = qsizetype (*)(qsizetype inLength);
using EncoderFn = char * (*)(char *out, QStringView in, State *state);
const char *name = nullptr;
DecoderFn toUtf16 = nullptr;
LengthFn toUtf16Len = nullptr;
EncoderFn fromUtf16 = nullptr;
LengthFn fromUtf16Len = nullptr;
};
constexpr QStringConverter()
: iface(nullptr)
{}
constexpr QStringConverter(Encoding encoding, Flags f)
: iface(&encodingInterfaces[int(encoding)]), state(f)
{}
constexpr QStringConverter(const Interface *i)
: iface(i)
{}
Q_CORE_EXPORT QStringConverter(const char *name, Flags f);
public:
bool isValid() const { return iface != nullptr; }
void resetState()
{
state.clear();
}
bool hasError() const { return state.invalidChars != 0; }
const char *name() const
{ return isValid() ? iface->name : nullptr; }
Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
Q_CORE_EXPORT static const char *nameForEncoding(Encoding e);
Q_CORE_EXPORT static std::optional<Encoding> encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0);
Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
protected:
const Interface *iface;
State state;
private:
Q_CORE_EXPORT static const Interface encodingInterfaces[Encoding::LastEncoding + 1];
};
QT_END_NAMESPACE
#endif

View File

@ -51,6 +51,7 @@
#include <qdir.h>
#include <qdebug.h>
#include <qelapsedtimer.h>
#include <qstringconverter.h>
#ifdef Q_OS_VXWORKS
# include <selectLib.h>

View File

@ -54,6 +54,7 @@
#endif
#include <qtextobject.h>
#include <qdesktopservices.h>
#include <qstringconverter.h>
QT_BEGIN_NAMESPACE

View File

@ -28,6 +28,7 @@
#include <QtCore/QTextStream>
#include <QtCore/QString>
#include <stdio.h>
int main(int, char**)