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// all our supported compilers support Unicode string literals,
55// even if their Q_COMPILER_UNICODE_STRING has been revoked due
56// to lacking stdlib support. But QStringLiteral only needs the
57// core language feature, so just use u"" here unconditionally:
58
59typedef char16_t qunicodechar;
60
61Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
62 "qunicodechar must typedef an integral type of size 2");
63
64#define QT_UNICODE_LITERAL(str) u"" str
65#define QStringLiteral(str) \
66 ([]() noexcept -> QString { \
67 enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
68 static const QStaticStringData<Size> qstring_literal = { \
69 Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
70 QT_UNICODE_LITERAL(str) }; \
71 QStringDataPtr holder = { qstring_literal.data_ptr() }; \
72 return QString(holder); \
73 }()) \
74 /**/
75
76#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
77 { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
78 /**/
79
80#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER(size) \
81 Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QStringData)) \
82 /**/
83
84#if QT_DEPRECATED_SINCE(5, 14)
85# define QStringViewLiteral(str) QStringView(QT_UNICODE_LITERAL(str), QtPrivate::Deprecated)
86#endif
87
88template <int N>
89struct QStaticStringData
90{
91 QArrayData str;
92 qunicodechar data[N + 1];
93
94 QStringData *data_ptr() const
95 {
96 Q_ASSERT(str.ref.isStatic());
97 return const_cast<QStringData *>(static_cast<const QStringData*>(&str));
98 }
99};
100
101struct QStringDataPtr
102{
103 QStringData *ptr;
104};
105
106QT_END_NAMESPACE
107
108#endif // QSTRINGLITERAL_H
109