Mark QLocale's private functions [[nodiscard]]

If only to make the exceptions stand out, so we can see which ones
only exist for their side-effects.

Change-Id: I90b649d4da09f57ab986f29c577993dd12e34721
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Edward Welbourne 2021-08-31 11:34:30 +02:00
parent 375c7c47ff
commit 5598a15fe7
2 changed files with 109 additions and 93 deletions

View File

@ -148,37 +148,37 @@ namespace QIcu {
struct QLocaleId struct QLocaleId
{ {
Q_CORE_EXPORT static QLocaleId fromName(const QString &name); [[nodiscard]] Q_CORE_EXPORT static QLocaleId fromName(const QString &name);
inline bool operator==(QLocaleId other) const [[nodiscard]] inline bool operator==(QLocaleId other) const
{ return language_id == other.language_id && script_id == other.script_id && territory_id == other.territory_id; } { return language_id == other.language_id && script_id == other.script_id && territory_id == other.territory_id; }
inline bool operator!=(QLocaleId other) const [[nodiscard]] inline bool operator!=(QLocaleId other) const
{ return !operator==(other); } { return !operator==(other); }
inline bool isValid() const [[nodiscard]] inline bool isValid() const
{ {
return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript return language_id <= QLocale::LastLanguage && script_id <= QLocale::LastScript
&& territory_id <= QLocale::LastTerritory; && territory_id <= QLocale::LastTerritory;
} }
inline bool matchesAll() const [[nodiscard]] inline bool matchesAll() const
{ {
return !language_id && !script_id && !territory_id; return !language_id && !script_id && !territory_id;
} }
// Use as: filter.accept...(candidate) // Use as: filter.accept...(candidate)
inline bool acceptLanguage(quint16 lang) const [[nodiscard]] inline bool acceptLanguage(quint16 lang) const
{ {
// Always reject AnyLanguage (only used for last entry in locale_data array). // Always reject AnyLanguage (only used for last entry in locale_data array).
// So, when searching for AnyLanguage, accept everything *but* AnyLanguage. // So, when searching for AnyLanguage, accept everything *but* AnyLanguage.
return language_id ? lang == language_id : lang; return language_id ? lang == language_id : lang;
} }
inline bool acceptScriptTerritory(QLocaleId other) const [[nodiscard]] inline bool acceptScriptTerritory(QLocaleId other) const
{ {
return (!territory_id || other.territory_id == territory_id) return (!territory_id || other.territory_id == territory_id)
&& (!script_id || other.script_id == script_id); && (!script_id || other.script_id == script_id);
} }
QLocaleId withLikelySubtagsAdded() const; [[nodiscard]] QLocaleId withLikelySubtagsAdded() const;
QLocaleId withLikelySubtagsRemoved() const; [[nodiscard]] QLocaleId withLikelySubtagsRemoved() const;
QByteArray name(char separator = '-') const; [[nodiscard]] QByteArray name(char separator = '-') const;
ushort language_id = 0, script_id = 0, territory_id = 0; ushort language_id = 0, script_id = 0, territory_id = 0;
}; };
@ -189,8 +189,8 @@ struct QLocaleData
public: public:
// Having an index for each locale enables us to have diverse sources of // Having an index for each locale enables us to have diverse sources of
// data, e.g. calendar locales, as well as the main CLDR-derived data. // data, e.g. calendar locales, as well as the main CLDR-derived data.
static int findLocaleIndex(QLocaleId localeId); [[nodiscard]] static int findLocaleIndex(QLocaleId localeId);
static const QLocaleData *c(); [[nodiscard]] static const QLocaleData *c();
enum DoubleForm { enum DoubleForm {
DFExponent = 0, DFExponent = 0,
@ -226,33 +226,33 @@ private:
PMChopTrailingZeros = 0x03 PMChopTrailingZeros = 0x03
}; };
QString decimalForm(QString &&digits, int decpt, int precision, [[nodiscard]] QString decimalForm(QString &&digits, int decpt, int precision,
PrecisionMode pm, bool mustMarkDecimal, PrecisionMode pm, bool mustMarkDecimal,
bool groupDigits) const; bool groupDigits) const;
QString exponentForm(QString &&digits, int decpt, int precision, [[nodiscard]] QString exponentForm(QString &&digits, int decpt, int precision,
PrecisionMode pm, bool mustMarkDecimal, PrecisionMode pm, bool mustMarkDecimal,
int minExponentDigits) const; int minExponentDigits) const;
QString signPrefix(bool negative, unsigned flags) const; [[nodiscard]] QString signPrefix(bool negative, unsigned flags) const;
QString applyIntegerFormatting(QString &&numStr, bool negative, int precision, [[nodiscard]] QString applyIntegerFormatting(QString &&numStr, bool negative, int precision,
int base, int width, unsigned flags) const; int base, int width, unsigned flags) const;
public: public:
QString doubleToString(double d, [[nodiscard]] QString doubleToString(double d,
int precision = -1, int precision = -1,
DoubleForm form = DFSignificantDigits, DoubleForm form = DFSignificantDigits,
int width = -1, int width = -1,
unsigned flags = NoFlags) const; unsigned flags = NoFlags) const;
QString longLongToString(qint64 l, int precision = -1, [[nodiscard]] QString longLongToString(qint64 l, int precision = -1,
int base = 10, int base = 10,
int width = -1, int width = -1,
unsigned flags = NoFlags) const; unsigned flags = NoFlags) const;
QString unsLongLongToString(quint64 l, int precision = -1, [[nodiscard]] QString unsLongLongToString(quint64 l, int precision = -1,
int base = 10, int base = 10,
int width = -1, int width = -1,
unsigned flags = NoFlags) const; unsigned flags = NoFlags) const;
// this function is meant to be called with the result of stringToDouble or bytearrayToDouble // this function is meant to be called with the result of stringToDouble or bytearrayToDouble
static float convertDoubleToFloat(double d, bool *ok) [[nodiscard]] static float convertDoubleToFloat(double d, bool *ok)
{ {
if (qIsInf(d)) if (qIsInf(d))
return float(d); return float(d);
@ -271,58 +271,64 @@ public:
return float(d); return float(d);
} }
double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const; [[nodiscard]] double stringToDouble(QStringView str, bool *ok,
qint64 stringToLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const; QLocale::NumberOptions options) const;
quint64 stringToUnsLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const; [[nodiscard]] qint64 stringToLongLong(QStringView str, int base, bool *ok,
QLocale::NumberOptions options) const;
[[nodiscard]] quint64 stringToUnsLongLong(QStringView str, int base, bool *ok,
QLocale::NumberOptions options) const;
// this function is used in QIntValidator (QtGui) // this function is used in QIntValidator (QtGui)
Q_CORE_EXPORT static qint64 bytearrayToLongLong(QByteArrayView num, int base, bool *ok); [[nodiscard]] Q_CORE_EXPORT static qint64 bytearrayToLongLong(QByteArrayView num, int base,
static quint64 bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok); bool *ok);
[[nodiscard]] static quint64 bytearrayToUnsLongLong(QByteArrayView num, int base, bool *ok);
bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options, [[nodiscard]] bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
CharBuff *result) const; CharBuff *result) const;
inline char numericToCLocale(QStringView in) const; [[nodiscard]] inline char numericToCLocale(QStringView in) const;
// this function is used in QIntValidator (QtGui) // this function is used in QIntValidator (QtGui)
Q_CORE_EXPORT bool validateChars(QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1, [[nodiscard]] Q_CORE_EXPORT bool validateChars(
QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const; QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
// Access to assorted data members: // Access to assorted data members:
QLocaleId id() const { return QLocaleId { m_language_id, m_script_id, m_territory_id }; } [[nodiscard]] QLocaleId id() const
{ return QLocaleId { m_language_id, m_script_id, m_territory_id }; }
QString decimalPoint() const; [[nodiscard]] QString decimalPoint() const;
QString groupSeparator() const; [[nodiscard]] QString groupSeparator() const;
QString listSeparator() const; [[nodiscard]] QString listSeparator() const;
QString percentSign() const; [[nodiscard]] QString percentSign() const;
QString zeroDigit() const; [[nodiscard]] QString zeroDigit() const;
char32_t zeroUcs() const; [[nodiscard]] char32_t zeroUcs() const;
QString positiveSign() const; [[nodiscard]] QString positiveSign() const;
QString negativeSign() const; [[nodiscard]] QString negativeSign() const;
QString exponentSeparator() const; [[nodiscard]] QString exponentSeparator() const;
struct DataRange struct DataRange
{ {
quint16 offset; quint16 offset;
quint16 size; quint16 size;
QString getData(const char16_t *table) const [[nodiscard]] QString getData(const char16_t *table) const
{ {
return size > 0 return size > 0
? QString::fromRawData(reinterpret_cast<const QChar *>(table + offset), size) ? QString::fromRawData(reinterpret_cast<const QChar *>(table + offset), size)
: QString(); : QString();
} }
QStringView viewData(const char16_t *table) const [[nodiscard]] QStringView viewData(const char16_t *table) const
{ {
return { reinterpret_cast<const QChar *>(table + offset), size }; return { reinterpret_cast<const QChar *>(table + offset), size };
} }
QString getListEntry(const char16_t *table, int index) const [[nodiscard]] QString getListEntry(const char16_t *table, int index) const
{ {
return listEntry(table, index).getData(table); return listEntry(table, index).getData(table);
} }
QStringView viewListEntry(const char16_t *table, int index) const [[nodiscard]] QStringView viewListEntry(const char16_t *table, int index) const
{ {
return listEntry(table, index).viewData(table); return listEntry(table, index).viewData(table);
} }
char32_t ucsFirst(const char16_t *table) const [[nodiscard]] char32_t ucsFirst(const char16_t *table) const
{ {
if (size && !QChar::isSurrogate(table[offset])) if (size && !QChar::isSurrogate(table[offset]))
return table[offset]; return table[offset];
@ -331,7 +337,7 @@ public:
return 0; return 0;
} }
private: private:
DataRange listEntry(const char16_t *table, int index) const [[nodiscard]] DataRange listEntry(const char16_t *table, int index) const
{ {
const char16_t separator = ';'; const char16_t separator = ';';
quint16 i = 0; quint16 i = 0;
@ -362,7 +368,7 @@ public:
X(endonymLanguage) X(endonymTerritory) X(endonymLanguage) X(endonymTerritory)
#define rangeGetter(name) \ #define rangeGetter(name) \
DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; } [[nodiscard]] DataRange name() const { return { m_ ## name ## _idx, m_ ## name ## _size }; }
ForEachQLocaleRange(rangeGetter) ForEachQLocaleRange(rangeGetter)
#undef rangeGetter #undef rangeGetter
@ -400,24 +406,27 @@ public:
: m_data(data), ref Q_BASIC_ATOMIC_INITIALIZER(refs), : m_data(data), ref Q_BASIC_ATOMIC_INITIALIZER(refs),
m_index(index), m_numberOptions(numberOptions) {} m_index(index), m_numberOptions(numberOptions) {}
quint16 languageId() const { return m_data->m_language_id; } [[nodiscard]] quint16 languageId() const { return m_data->m_language_id; }
quint16 territoryId() const { return m_data->m_territory_id; } [[nodiscard]] quint16 territoryId() const { return m_data->m_territory_id; }
QByteArray bcp47Name(char separator = '-') const; [[nodiscard]] QByteArray bcp47Name(char separator = '-') const;
inline QLatin1String languageCode() const { return languageToCode(QLocale::Language(m_data->m_language_id)); } [[nodiscard]] inline QLatin1String languageCode() const
inline QLatin1String scriptCode() const { return scriptToCode(QLocale::Script(m_data->m_script_id)); } { return languageToCode(QLocale::Language(m_data->m_language_id)); }
inline QLatin1String territoryCode() const { return territoryToCode(QLocale::Territory(m_data->m_territory_id)); } [[nodiscard]] inline QLatin1String scriptCode() const
{ return scriptToCode(QLocale::Script(m_data->m_script_id)); }
[[nodiscard]] inline QLatin1String territoryCode() const
{ return territoryToCode(QLocale::Territory(m_data->m_territory_id)); }
static const QLocalePrivate *get(const QLocale &l) { return l.d; } [[nodiscard]] static const QLocalePrivate *get(const QLocale &l) { return l.d; }
static QLatin1String languageToCode(QLocale::Language language); [[nodiscard]] static QLatin1String languageToCode(QLocale::Language language);
static QLatin1String scriptToCode(QLocale::Script script); [[nodiscard]] static QLatin1String scriptToCode(QLocale::Script script);
static QLatin1String territoryToCode(QLocale::Territory territory); [[nodiscard]] static QLatin1String territoryToCode(QLocale::Territory territory);
static QLocale::Language codeToLanguage(QStringView code) noexcept; [[nodiscard]] static QLocale::Language codeToLanguage(QStringView code) noexcept;
static QLocale::Script codeToScript(QStringView code) noexcept; [[nodiscard]] static QLocale::Script codeToScript(QStringView code) noexcept;
static QLocale::Territory codeToTerritory(QStringView code) noexcept; [[nodiscard]] static QLocale::Territory codeToTerritory(QStringView code) noexcept;
QLocale::MeasurementSystem measurementSystem() const; [[nodiscard]] QLocale::MeasurementSystem measurementSystem() const;
// System locale has an m_data all its own; all others have m_data = locale_data + m_index // System locale has an m_data all its own; all others have m_data = locale_data + m_index
const QLocaleData *const m_data; const QLocaleData *const m_data;
@ -486,10 +495,12 @@ inline char QLocaleData::numericToCLocale(QStringView in) const
return 0; return 0;
} }
// Also used to merely skip over an escape in a format string, advancint idx to
// point after it (so not [[nodiscard]]):
QString qt_readEscapedFormatString(QStringView format, int *idx); QString qt_readEscapedFormatString(QStringView format, int *idx);
bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr, [[nodiscard]] bool qt_splitLocaleName(QStringView name, QStringView *lang = nullptr,
QStringView *script = nullptr, QStringView *cntry = nullptr); QStringView *script = nullptr, QStringView *cntry = nullptr);
int qt_repeatCount(QStringView s); [[nodiscard]] int qt_repeatCount(QStringView s);
enum { AsciiSpaceMask = (1u << (' ' - 1)) | enum { AsciiSpaceMask = (1u << (' ' - 1)) |
(1u << ('\t' - 1)) | // 9: HT - horizontal tab (1u << ('\t' - 1)) | // 9: HT - horizontal tab
@ -497,7 +508,7 @@ enum { AsciiSpaceMask = (1u << (' ' - 1)) |
(1u << ('\v' - 1)) | // 11: VT - vertical tab (1u << ('\v' - 1)) | // 11: VT - vertical tab
(1u << ('\f' - 1)) | // 12: FF - form feed (1u << ('\f' - 1)) | // 12: FF - form feed
(1u << ('\r' - 1)) }; // 13: CR - carriage return (1u << ('\r' - 1)) }; // 13: CR - carriage return
constexpr inline bool ascii_isspace(uchar c) [[nodiscard]] constexpr inline bool ascii_isspace(uchar c)
{ {
return c >= 1u && c <= 32u && (AsciiSpaceMask >> uint(c - 1)) & 1u; return c >= 1u && c <= 32u && (AsciiSpaceMask >> uint(c - 1)) & 1u;
} }

View File

@ -63,18 +63,20 @@ enum StrayCharacterMode {
}; };
// API note: this function can't process a number with more than 2.1 billion digits // API note: this function can't process a number with more than 2.1 billion digits
double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed, [[nodiscard]] double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed,
StrayCharacterMode strayCharMode = TrailingJunkProhibited); StrayCharacterMode strayCharMode = TrailingJunkProhibited);
void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize, void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
bool &sign, int &length, int &decpt); bool &sign, int &length, int &decpt);
QString qulltoBasicLatin(qulonglong l, int base, bool negative); [[nodiscard]] QString qulltoBasicLatin(qulonglong l, int base, bool negative);
QString qulltoa(qulonglong l, int base, const QStringView zero); [[nodiscard]] QString qulltoa(qulonglong l, int base, const QStringView zero);
Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign); [[nodiscard]] Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); [[nodiscard]] QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form,
QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); int precision, bool uppercase);
[[nodiscard]] QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form,
int precision, bool uppercase);
inline bool isZero(double d) [[nodiscard]] inline bool isZero(double d)
{ {
uchar *ch = (uchar *)&d; uchar *ch = (uchar *)&d;
if (QSysInfo::ByteOrder == QSysInfo::BigEndian) { if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
@ -85,7 +87,7 @@ inline bool isZero(double d)
} }
// Enough space for the digits before the decimal separator: // Enough space for the digits before the decimal separator:
inline int wholePartSpace(double d) [[nodiscard]] inline int wholePartSpace(double d)
{ {
Q_ASSERT(d >= 0); // caller should call qAbs() if needed Q_ASSERT(d >= 0); // caller should call qAbs() if needed
// Optimize for numbers between -512k and 512k - otherwise, use the // Optimize for numbers between -512k and 512k - otherwise, use the
@ -95,7 +97,7 @@ inline int wholePartSpace(double d)
// Returns code-point of same kind (UCS2 or UCS4) as zero; digit is 0 through 9 // Returns code-point of same kind (UCS2 or UCS4) as zero; digit is 0 through 9
template <typename UcsInt> template <typename UcsInt>
inline UcsInt unicodeForDigit(uint digit, UcsInt zero) [[nodiscard]] inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
{ {
// Must match QLocaleData::numericToCLocale()'s digit-digestion. // Must match QLocaleData::numericToCLocale()'s digit-digestion.
Q_ASSERT(digit < 10); Q_ASSERT(digit < 10);
@ -110,15 +112,18 @@ inline UcsInt unicodeForDigit(uint digit, UcsInt zero)
return zero + digit; return zero + digit;
} }
Q_CORE_EXPORT double qstrntod(const char *s00, qsizetype len, char const **se, bool *ok); [[nodiscard]] Q_CORE_EXPORT double qstrntod(const char *s00, qsizetype len,
inline double qstrtod(const char *s00, char const **se, bool *ok) char const **se, bool *ok);
[[nodiscard]] inline double qstrtod(const char *s00, char const **se, bool *ok)
{ {
qsizetype len = qsizetype(strlen(s00)); qsizetype len = qsizetype(strlen(s00));
return qstrntod(s00, len, se, ok); return qstrntod(s00, len, se, ok);
} }
qlonglong qstrntoll(const char *nptr, qsizetype size, const char **endptr, int base, bool *ok); [[nodiscard]] qlonglong qstrntoll(const char *nptr, qsizetype size, const char **endptr,
qulonglong qstrntoull(const char *nptr, qsizetype size, const char **endptr, int base, bool *ok); int base, bool *ok);
[[nodiscard]] qulonglong qstrntoull(const char *nptr, qsizetype size, const char **endptr,
int base, bool *ok);
QT_END_NAMESPACE QT_END_NAMESPACE