From: João Abecasis Date: Mon, 2 Apr 2012 20:45:29 +0000 (+0200) Subject: Reorganize unicode string support in QString X-Git-Tag: 071012110112~1235^2^2~118 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=72eb9d49a9849ba4a27b27e82b60f4bdd887a70e;p=profile%2Fivi%2Fqtbase.git 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 --- diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index 042d80b..4f241e7 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: