summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-02-21 16:33:50 +0100
committerMarc Mutz <marc.mutz@qt.io>2022-02-22 18:16:24 +0100
commit330f2132cade80b588e78971a24fc7d702ff6a3a (patch)
treec80880adf17a5877f2f745f088090943b40ece69
parent4b8bc8b5bb0b1224206e8dd5526cc8d1e8b6de52 (diff)
QStringEncoder/Decoder: add missing noexcept
The interesting part is what cannot be noexcept: - nameForEncoding() and ctor from Encoding: because they don't handle all valid values of type Encoding, so have a narrow contract - encodingForHtml(): because it allocates memory (→ QTBUG-101046) Change-Id: I30cdc19a32537be047e43955e3337e4d6ccc363f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/corelib/text/qstringconverter.cpp7
-rw-r--r--src/corelib/text/qstringconverter.h12
-rw-r--r--src/corelib/text/qstringconverter_base.h22
3 files changed, 22 insertions, 19 deletions
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index 199e85aaae..84569fccdd 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -1699,7 +1699,7 @@ static bool nameMatch(const char *a, const char *b)
/*!
\internal
*/
-QStringConverter::QStringConverter(const char *name, Flags f)
+QStringConverter::QStringConverter(const char *name, Flags f) noexcept
: iface(nullptr), state(f)
{
auto e = encodingForName(name);
@@ -1745,7 +1745,7 @@ QStringConverter::QStringConverter(const char *name, Flags f)
Returns an optional encoding for \a name. The optional is empty if the name could
not get converted to a valid encoding.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name)
+std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(const char *name) noexcept
{
for (int i = 0; i < LastEncoding + 1; ++i) {
if (nameMatch(encodingInterfaces[i].name, name))
@@ -1763,7 +1763,8 @@ std::optional<QStringConverter::Encoding> QStringConverter::encodingForName(cons
The returned optional is empty, if the encoding is unclear.
*/
-std::optional<QStringConverter::Encoding> QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter)
+std::optional<QStringConverter::Encoding>
+QStringConverter::encodingForData(QByteArrayView data, char16_t expectedFirstCharacter) noexcept
{
// someone set us up the BOM?
qsizetype arraySize = data.size();
diff --git a/src/corelib/text/qstringconverter.h b/src/corelib/text/qstringconverter.h
index dcc2b4a433..381831dc9d 100644
--- a/src/corelib/text/qstringconverter.h
+++ b/src/corelib/text/qstringconverter.h
@@ -58,17 +58,17 @@ QT_BEGIN_NAMESPACE
class QStringEncoder : public QStringConverter
{
protected:
- constexpr explicit QStringEncoder(const Interface *i)
+ constexpr explicit QStringEncoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
- constexpr QStringEncoder()
+ constexpr QStringEncoder() noexcept
: QStringConverter()
{}
constexpr explicit QStringEncoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- explicit QStringEncoder(const char *name, Flags flags = Flag::Default)
+ explicit QStringEncoder(const char *name, Flags flags = Flag::Default) noexcept
: QStringConverter(name, flags)
{}
@@ -116,17 +116,17 @@ private:
class QStringDecoder : public QStringConverter
{
protected:
- constexpr explicit QStringDecoder(const Interface *i)
+ constexpr explicit QStringDecoder(const Interface *i) noexcept
: QStringConverter(i)
{}
public:
constexpr explicit QStringDecoder(Encoding encoding, Flags flags = Flag::Default)
: QStringConverter(encoding, flags)
{}
- constexpr QStringDecoder()
+ constexpr QStringDecoder() noexcept
: QStringConverter()
{}
- explicit QStringDecoder(const char *name, Flags f = Flag::Default)
+ explicit QStringDecoder(const char *name, Flags f = Flag::Default) noexcept
: QStringConverter(name, f)
{}
diff --git a/src/corelib/text/qstringconverter_base.h b/src/corelib/text/qstringconverter_base.h
index 23a011d297..b827f2d0a3 100644
--- a/src/corelib/text/qstringconverter_base.h
+++ b/src/corelib/text/qstringconverter_base.h
@@ -72,7 +72,7 @@ public:
Q_DECLARE_FLAGS(Flags, Flag)
struct State {
- constexpr State(Flags f = Flag::Default)
+ constexpr State(Flags f = Flag::Default) noexcept
: flags(f), state_data{0, 0, 0, 0} {}
~State() { clear(); }
State(State &&other) noexcept
@@ -155,33 +155,35 @@ protected:
LengthFn fromUtf16Len = nullptr;
};
- constexpr QStringConverter()
+ constexpr QStringConverter() noexcept
: iface(nullptr)
{}
constexpr explicit QStringConverter(Encoding encoding, Flags f)
: iface(&encodingInterfaces[int(encoding)]), state(f)
{}
- constexpr explicit QStringConverter(const Interface *i)
+ constexpr explicit QStringConverter(const Interface *i) noexcept
: iface(i)
{}
- Q_CORE_EXPORT explicit QStringConverter(const char *name, Flags f);
+ Q_CORE_EXPORT explicit QStringConverter(const char *name, Flags f) noexcept;
public:
- bool isValid() const { return iface != nullptr; }
- void resetState()
+ bool isValid() const noexcept { return iface != nullptr; }
+
+ void resetState() noexcept
{
state.clear();
}
- bool hasError() const { return state.invalidChars != 0; }
+ bool hasError() const noexcept { return state.invalidChars != 0; }
- const char *name() const
+ const char *name() const noexcept
{ return isValid() ? iface->name : nullptr; }
- Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name);
+ Q_CORE_EXPORT static std::optional<Encoding> encodingForName(const char *name) noexcept;
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>
+ encodingForData(QByteArrayView data, char16_t expectedFirstCharacter = 0) noexcept;
Q_CORE_EXPORT static std::optional<Encoding> encodingForHtml(QByteArrayView data);
protected: