Reorganize unicode string support in QString
authorJoão Abecasis <joao.abecasis@nokia.com>
Mon, 2 Apr 2012 20:45:29 +0000 (22:45 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 3 Apr 2012 19:10:45 +0000 (21:10 +0200)
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>
src/corelib/tools/qstring.h

index 042d80b..4f241e7 100644 (file)
@@ -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: