Split Q_COMPILER_UNICODE_STRINGS: add Q_STDLIB_UNICODE_STRINGS
Since commit bf2160e72c
, we can rely on
charNN_t support in all compilers except MSVC 2013, and since that
commit, we use (in 5.10, not 5.9, yet)
!defined(Q_OS_WIN) || defined(Q_COMPILER_UNICODE_STRINGS)
when we only need charNN_t, the type, as opposed to its library
support (u16string, char_traits<char16_t>, ...).
This patch splits the Q_C_UNICODE_STRINGS macro into two, adding
Q_STDLIB_UNICODE_STRINGS for when we need std::uNNstring, leaving
Q_C_UNICODE_STRINGS for when we need just charNN_t support.
In QDebug, when constructing a QChar out of a char16_t, cast to ushort
first, since QChar(char16_t) was only officially introduced in Qt 5.10.
[ChangeLog][Potentially Source-Incompatible Changes] The internal
Q_COMPILER_UNICODE_STRINGS macro is now defined if the compiler
supports charNN_t, even if the standard library does not. To check for
availability of std::uNNstring, use the new Q_STDLIB_UNICODE_STRINGS
macro.
Change-Id: I8f210fd7f1799fe21faf54506475a759b1f76a59
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
3dcc075f4a
commit
126c4eae84
@ -14,6 +14,7 @@ defines += Q_QDOC \
|
||||
QT_DEPRECATED_* \
|
||||
Q_NO_USING_KEYWORD \
|
||||
__cplusplus \
|
||||
Q_STDLIB_UNICODE_STRINGS \
|
||||
Q_COMPILER_INITIALIZER_LISTS \
|
||||
Q_COMPILER_UNICODE_STRINGS \
|
||||
Q_COMPILER_UNIFORM_INIT \
|
||||
@ -57,6 +58,7 @@ clangdefines += __cplusplus \
|
||||
Q_COMPILER_UNICODE_STRINGS \
|
||||
Q_COMPILER_VARIADIC_MACROS \
|
||||
Q_COMPILER_VARIADIC_TEMPLATES \
|
||||
Q_STDLIB_UNICODE_STRINGS \
|
||||
Q_ATOMIC_INT16_IS_SUPPORTED \
|
||||
Q_ATOMIC_INT64_IS_SUPPORTED \
|
||||
Q_ATOMIC_INT8_IS_SUPPORTED \
|
||||
|
@ -994,6 +994,10 @@
|
||||
# endif /* __cplusplus */
|
||||
#endif /* Q_CC_MSVC */
|
||||
|
||||
#ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
# define Q_STDLIB_UNICODE_STRINGS
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
# include <utility>
|
||||
# if defined(Q_OS_QNX)
|
||||
@ -1016,8 +1020,9 @@
|
||||
# undef Q_COMPILER_INITIALIZER_LISTS
|
||||
# undef Q_COMPILER_RVALUE_REFS
|
||||
# undef Q_COMPILER_REF_QUALIFIERS
|
||||
# undef Q_COMPILER_UNICODE_STRINGS
|
||||
# undef Q_COMPILER_NOEXCEPT
|
||||
// Disable C++11 library features:
|
||||
# undef Q_STDLIB_UNICODE_STRINGS
|
||||
# endif // !_HAS_CPP0X
|
||||
# if !defined(_HAS_NULLPTR_T) || !_HAS_NULLPTR_T
|
||||
# undef Q_COMPILER_NULLPTR
|
||||
|
@ -139,7 +139,7 @@ public:
|
||||
inline QDebug &operator<<(signed short t) { stream->ts << t; return maybeSpace(); }
|
||||
inline QDebug &operator<<(unsigned short t) { stream->ts << t; return maybeSpace(); }
|
||||
#ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
inline QDebug &operator<<(char16_t t) { return *this << QChar(t); }
|
||||
inline QDebug &operator<<(char16_t t) { return *this << QChar(ushort(t)); }
|
||||
inline QDebug &operator<<(char32_t t) { putUcs4(t); return maybeSpace(); }
|
||||
#endif
|
||||
inline QDebug &operator<<(signed int t) { stream->ts << t; return maybeSpace(); }
|
||||
|
@ -756,7 +756,7 @@ public:
|
||||
static inline QString fromStdWString(const std::wstring &s);
|
||||
inline std::wstring toStdWString() const;
|
||||
|
||||
#if defined(Q_COMPILER_UNICODE_STRINGS) || defined(Q_QDOC)
|
||||
#if defined(Q_STDLIB_UNICODE_STRINGS) || defined(Q_QDOC)
|
||||
static inline QString fromStdU16String(const std::u16string &s);
|
||||
inline std::u16string toStdU16String() const;
|
||||
static inline QString fromStdU32String(const std::u32string &s);
|
||||
@ -1339,7 +1339,7 @@ inline std::wstring QString::toStdWString() const
|
||||
inline QString QString::fromStdWString(const std::wstring &s)
|
||||
{ return fromWCharArray(s.data(), int(s.size())); }
|
||||
|
||||
#if defined(Q_COMPILER_UNICODE_STRINGS)
|
||||
#if defined(Q_STDLIB_UNICODE_STRINGS)
|
||||
inline QString QString::fromStdU16String(const std::u16string &s)
|
||||
{ return fromUtf16(s.data(), int(s.size())); }
|
||||
|
||||
|
@ -5850,7 +5850,7 @@ void tst_QString::fromUtf16_char16()
|
||||
|
||||
void tst_QString::unicodeStrings()
|
||||
{
|
||||
#ifdef Q_COMPILER_UNICODE_STRINGS
|
||||
#ifdef Q_STDLIB_UNICODE_STRINGS
|
||||
QString s1, s2;
|
||||
static const std::u16string u16str1(u"Hello Unicode World");
|
||||
static const std::u32string u32str1(U"Hello Unicode World");
|
||||
@ -5865,7 +5865,7 @@ void tst_QString::unicodeStrings()
|
||||
s1 = QString::fromStdU32String(std::u32string(U"\u221212\U000020AC\U00010000"));
|
||||
QCOMPARE(s1, QString::fromUtf8("\342\210\222" "12" "\342\202\254" "\360\220\200\200"));
|
||||
#else
|
||||
QSKIP("Compiler does not support C++11 unicode strings");
|
||||
QSKIP("Standard Library does not support C++11 unicode strings");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user