diff options
Diffstat (limited to 'src/corelib/text/qlocale_tools_p.h')
-rw-r--r-- | src/corelib/text/qlocale_tools_p.h | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/corelib/text/qlocale_tools_p.h b/src/corelib/text/qlocale_tools_p.h index 077218634d..9ae9dc8de7 100644 --- a/src/corelib/text/qlocale_tools_p.h +++ b/src/corelib/text/qlocale_tools_p.h @@ -18,8 +18,20 @@ #include "qlocale_p.h" #include "qstring.h" +#if !defined(QT_SUPPORTS_INT128) && defined(Q_CC_MSVC) && (_MSC_VER >= 1930) +#include <__msvc_int128.hpp> +#endif + QT_BEGIN_NAMESPACE +#if defined(QT_SUPPORTS_INT128) +using qinternalint128 = qint128; +using qinternaluint128 = quint128; +#elif defined(Q_CC_MSVC) && (_MSC_VER >= 1930) +using qinternalint128 = std::_Signed128; +using qinternaluint128 = std::_Unsigned128; +#endif + enum StrayCharacterMode { TrailingJunkProhibited, TrailingJunkAllowed, @@ -27,19 +39,29 @@ enum StrayCharacterMode { }; // API note: this function can't process a number with more than 2.1 billion digits -[[nodiscard]] double qt_asciiToDouble(const char *num, qsizetype numLen, bool &ok, int &processed, - StrayCharacterMode strayCharMode = TrailingJunkProhibited); -void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize, +[[nodiscard]] QSimpleParsedNumber<double> +qt_asciiToDouble(const char *num, qsizetype numLen, + StrayCharacterMode strayCharMode = TrailingJunkProhibited); +void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, + char *buf, qsizetype bufSize, bool &sign, int &length, int &decpt); [[nodiscard]] QString qulltoBasicLatin(qulonglong l, int base, bool negative); [[nodiscard]] QString qulltoa(qulonglong l, int base, const QStringView zero); +[[nodiscard]] char *qulltoa2(char *p, qulonglong n, int base); [[nodiscard]] Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign); [[nodiscard]] QString qdtoBasicLatin(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); [[nodiscard]] QByteArray qdtoAscii(double d, QLocaleData::DoubleForm form, int precision, bool uppercase); +#if defined(QT_SUPPORTS_INT128) || (defined(Q_CC_MSVC) && (_MSC_VER >= 1930)) +[[nodiscard]] Q_CORE_EXPORT QString quint128toBasicLatin(qinternaluint128 number, + int base = 10); +[[nodiscard]] Q_CORE_EXPORT QString qint128toBasicLatin(qinternalint128 number, + int base = 10); +#endif + [[nodiscard]] constexpr inline bool isZero(double d) { return d == 0; // Amusingly, compilers do not grumble. @@ -58,7 +80,7 @@ void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, cha template <typename UcsInt> [[nodiscard]] inline UcsInt unicodeForDigit(uint digit, UcsInt zero) { - // Must match QLocaleData::numericToCLocale()'s digit-digestion. + // Must match qlocale.cpp's NumberTokenizer's digit-digestion. Q_ASSERT(digit < 10); if (!digit) return zero; @@ -80,10 +102,9 @@ template <typename UcsInt> return qstrntod(s00, len, se, ok); } -[[nodiscard]] qlonglong qstrntoll(const char *nptr, qsizetype size, const char **endptr, - int base, bool *ok); -[[nodiscard]] qulonglong qstrntoull(const char *nptr, qsizetype size, const char **endptr, - int base, bool *ok); +[[nodiscard]] Q_AUTOTEST_EXPORT +QSimpleParsedNumber<qlonglong> qstrntoll(const char *nptr, qsizetype size, int base); +[[nodiscard]] QSimpleParsedNumber<qulonglong> qstrntoull(const char *nptr, qsizetype size, int base); QT_END_NAMESPACE |