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>
bb10
Marc Mutz 2022-02-21 16:33:50 +01:00
parent 4b8bc8b5bb
commit 330f2132ca
3 changed files with 22 additions and 19 deletions

View File

@ -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();

View File

@ -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)
{}

View File

@ -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: