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:
parent
2201934efa
commit
ae7799a924
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -53,6 +53,7 @@
|
||||
//
|
||||
|
||||
#include <QtCore/private/qglobal_p.h>
|
||||
#include <QtCore/qstringconverter.h>
|
||||
#include "qiodevice.h"
|
||||
#include "qlocale.h"
|
||||
#include "qtextstream.h"
|
||||
|
@ -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:
|
||||
|
194
src/corelib/text/qstringconverter_base.h
Normal file
194
src/corelib/text/qstringconverter_base.h
Normal 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
|
@ -51,6 +51,7 @@
|
||||
#include <qdir.h>
|
||||
#include <qdebug.h>
|
||||
#include <qelapsedtimer.h>
|
||||
#include <qstringconverter.h>
|
||||
|
||||
#ifdef Q_OS_VXWORKS
|
||||
# include <selectLib.h>
|
||||
|
@ -54,6 +54,7 @@
|
||||
#endif
|
||||
#include <qtextobject.h>
|
||||
#include <qdesktopservices.h>
|
||||
#include <qstringconverter.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
|
||||
|
||||
#include <QtCore/QTextStream>
|
||||
#include <QtCore/QString>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int, char**)
|
||||
|
Loading…
Reference in New Issue
Block a user