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>
This commit is contained in:
João Abecasis 2012-04-02 22:45:29 +02:00 committed by Qt by Nokia
parent 7099c333c4
commit 72eb9d49a9

View 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: