1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Copyright (C) 2016 Intel Corporation.
5** Contact: https://www.qt.io/licensing/
6**
7** This file is part of the QtCore module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial License Usage
11** Licensees holding valid commercial Qt licenses may use this file in
12** accordance with the commercial license agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and The Qt Company. For licensing terms
15** and conditions see https://www.qt.io/terms-conditions. For further
16** information use the contact form at https://www.qt.io/contact-us.
17**
18** GNU Lesser General Public License Usage
19** Alternatively, this file may be used under the terms of the GNU Lesser
20** General Public License version 3 as published by the Free Software
21** Foundation and appearing in the file LICENSE.LGPL3 included in the
22** packaging of this file. Please review the following information to
23** ensure the GNU Lesser General Public License version 3 requirements
24** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
25**
26** GNU General Public License Usage
27** Alternatively, this file may be used under the terms of the GNU
28** General Public License version 2.0 or (at your option) the GNU General
29** Public license version 3 or any later version approved by the KDE Free
30** Qt Foundation. The licenses are as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
32** included in the packaging of this file. Please review the following
33** information to ensure the GNU General Public License requirements will
34** be met: https://www.gnu.org/licenses/gpl-2.0.html and
35** https://www.gnu.org/licenses/gpl-3.0.html.
36**
37** $QT_END_LICENSE$
38**
39****************************************************************************/
40
41#ifndef QSTRINGLITERAL_H
42#define QSTRINGLITERAL_H
43
44#include <QtCore/qarraydata.h>
45
46#if 0
47#pragma qt_class(QStringLiteral)
48#endif
49
50QT_BEGIN_NAMESPACE
51
52typedef QTypedArrayData<ushort> QStringData;
53
54#if defined(Q_OS_WIN) && !defined(Q_COMPILER_UNICODE_STRINGS)
55// fall back to wchar_t if the a Windows compiler does not
56// support Unicode string literals, assuming wchar_t is 2 bytes
57// on that platform (sanity-checked by static_assert further below)
58
59#if defined(Q_CC_MSVC)
60# define QT_UNICODE_LITERAL_II(str) L##str
61#else
62# define QT_UNICODE_LITERAL_II(str) L"" str
63#endif
64typedef wchar_t qunicodechar;
65
66#else
67// all our supported compilers support Unicode string literals,
68// even if their Q_COMPILER_UNICODE_STRING has been revoked due
69// to lacking stdlib support. But QStringLiteral only needs the
70// core language feature, so just use u"" here unconditionally:
71
72#define QT_UNICODE_LITERAL_II(str) u"" str
73typedef char16_t qunicodechar;
74
75#endif
76
77Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
78 "qunicodechar must typedef an integral type of size 2");
79
80#define QT_UNICODE_LITERAL(str) QT_UNICODE_LITERAL_II(str)
81#define QStringLiteral(str) \
82 ([]() Q_DECL_NOEXCEPT -> QString { \
83 enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
84 static const QStaticStringData<Size> qstring_literal = { \
85 Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
86 QT_UNICODE_LITERAL(str) }; \
87 QStringDataPtr holder = { qstring_literal.data_ptr() }; \
88 const QString qstring_literal_temp(holder); \
89 return qstring_literal_temp; \
90 }()) \
91 /**/
92
93#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
94 { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
95 /**/
96
97#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER(size) \
98 Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QStringData)) \
99 /**/
100
101#ifndef QT_NO_UNICODE_LITERAL
102# ifndef QT_UNICODE_LITERAL
103# error "If you change QStringLiteral, please change QStringViewLiteral, too"
104# endif
105# define QStringViewLiteral(str) QStringView(QT_UNICODE_LITERAL(str))
106#endif
107
108template <int N>
109struct QStaticStringData
110{
111 QArrayData str;
112 qunicodechar data[N + 1];
113
114 QStringData *data_ptr() const
115 {
116 Q_ASSERT(str.ref.isStatic());
117 return const_cast<QStringData *>(static_cast<const QStringData*>(&str));
118 }
119};
120
121struct QStringDataPtr
122{
123 QStringData *ptr;
124};
125
126QT_END_NAMESPACE
127
128#endif // QSTRINGLITERAL_H
129