diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2012-04-02 22:45:29 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-03 21:10:45 +0200 |
commit | 72eb9d49a9849ba4a27b27e82b60f4bdd887a70e (patch) | |
tree | 723429d83f6cef71f66ab9a518345e4a5cad4ed2 /src/corelib/tools/qstring.h | |
parent | 7099c333c4e623b1051b4377d76c632a15b11fbf (diff) |
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 <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qstring.h')
-rw-r--r-- | src/corelib/tools/qstring.h | 47 |
1 files 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<const ushort *>(reinterpret_cast<const char *>(this) + offset); } }; -template<int N> struct QStaticStringData; -template<int N> struct QStaticStringDataPtr -{ - const QStaticStringData<N> *ptr; -}; - #if defined(Q_COMPILER_UNICODE_STRINGS) -template<int N> 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<int N> 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<int N> 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<sizeof(QT_UNICODE_LITERAL(str))/2 - 1> { \ @@ -145,7 +133,7 @@ template<int N> struct QStaticStringData QStaticStringDataPtr<Size> 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<int N> struct QStaticStringData # define QStringLiteral(str) QLatin1String(str) #endif +template <int N> +struct QStaticStringData +{ + QStringData str; + qunicodechar data[N + 1]; +}; + +template <int N> +struct QStaticStringDataPtr +{ + const QStaticStringData<N> *ptr; +}; + class Q_CORE_EXPORT QString { public: |