summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qstring.h
diff options
context:
space:
mode:
authorJoão Abecasis <joao.abecasis@nokia.com>2012-04-02 22:45:29 +0200
committerQt by Nokia <qt-info@nokia.com>2012-04-03 21:10:45 +0200
commit72eb9d49a9849ba4a27b27e82b60f4bdd887a70e (patch)
tree723429d83f6cef71f66ab9a518345e4a5cad4ed2 /src/corelib/tools/qstring.h
parent7099c333c4e623b1051b4377d76c632a15b11fbf (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.h47
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: