From 72eb9d49a9849ba4a27b27e82b60f4bdd887a70e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Abecasis?= Date: Mon, 2 Apr 2012 22:45:29 +0200 Subject: [PATCH] Reorganize unicode string support in QString Cleaned up preprocessor code to have a single definition for QStaticStringData. A new qunicodechar typedef is introduced representing a 2-byte integral type that can be used to represent a UTF-16 codepoint. When QT_NO_UNICODE_LITERAL is not defined, QT_UNICODE_LITERAL converts a US-ASCII string literal into a (native endian) UTF-16 string literal of qunicodechar type. Change-Id: I04822c4cdc0b240bc0fe113aba897348b7316932 Reviewed-by: Thiago Macieira --- src/corelib/tools/qstring.h | 47 +++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index 042d80bea5..4f241e72e2 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -83,46 +83,34 @@ struct QStringData { inline const ushort *data() const { return reinterpret_cast(reinterpret_cast(this) + offset); } }; -template struct QStaticStringData; -template struct QStaticStringDataPtr -{ - const QStaticStringData *ptr; -}; - #if defined(Q_COMPILER_UNICODE_STRINGS) -template struct QStaticStringData -{ - QStringData str; - char16_t data[N + 1]; -}; #define QT_UNICODE_LITERAL_II(str) u"" str +typedef char16_t qunicodechar; #elif defined(Q_OS_WIN) \ || (defined(__SIZEOF_WCHAR_T__) && __SIZEOF_WCHAR_T__ == 2) \ || (!defined(__SIZEOF_WCHAR_T__) && defined(WCHAR_MAX) && (WCHAR_MAX - 0 < 65536)) // wchar_t is 2 bytes -template struct QStaticStringData -{ - QStringData str; - wchar_t data[N + 1]; -}; #if defined(Q_CC_MSVC) # define QT_UNICODE_LITERAL_II(str) L##str #else # define QT_UNICODE_LITERAL_II(str) L"" str #endif +typedef wchar_t qunicodechar; #else -template struct QStaticStringData -{ - QStringData str; - ushort data[N + 1]; -}; + +#define QT_NO_UNICODE_LITERAL +typedef ushort qunicodechar; + #endif -#if defined(QT_UNICODE_LITERAL_II) +Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2, + "qunicodechar must typedef an integral type of size 2"); + +#ifndef QT_NO_UNICODE_LITERAL # define QT_UNICODE_LITERAL(str) QT_UNICODE_LITERAL_II(str) # if defined(Q_COMPILER_LAMBDA) # define QStringLiteral(str) ([]() -> QStaticStringDataPtr { \ @@ -145,7 +133,7 @@ template struct QStaticStringData QStaticStringDataPtr holder = { &qstring_literal }; \ holder; }) # endif -#endif +#endif // QT_NO_UNICODE_LITERAL #ifndef QStringLiteral // no lambdas, not GCC, or GCC in C++98 mode with 4-byte wchar_t @@ -154,6 +142,19 @@ template struct QStaticStringData # define QStringLiteral(str) QLatin1String(str) #endif +template +struct QStaticStringData +{ + QStringData str; + qunicodechar data[N + 1]; +}; + +template +struct QStaticStringDataPtr +{ + const QStaticStringData *ptr; +}; + class Q_CORE_EXPORT QString { public: