1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQMLBUILTINS_H
5#define QQMLBUILTINS_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <private/qqmlcomponentattached_p.h>
19
20#include <QtQml/qjsvalue.h>
21#include <QtQml/qqmlcomponent.h>
22#include <QtQml/qqmlscriptstring.h>
23
24#include <QtQmlIntegration/qqmlintegration.h>
25
26#include <QtCore/qobject.h>
27#include <QtCore/qglobal.h>
28#include <QtCore/qtmetamacros.h>
29#include <QtCore/qmetaobject.h>
30#include <QtCore/qdatetime.h>
31#include <QtCore/qstring.h>
32#include <QtCore/qurl.h>
33#include <QtCore/qvariantmap.h>
34#include <QtCore/qtypes.h>
35#include <QtCore/qchar.h>
36#include <QtCore/qjsonobject.h>
37#include <QtCore/qjsonvalue.h>
38#include <QtCore/qjsonarray.h>
39
40#include <climits>
41
42#if QT_CONFIG(regularexpression)
43#include <QtCore/qregularexpression.h>
44#endif
45
46QT_BEGIN_NAMESPACE
47
48// moc doesn't do 64bit constants, so we have to determine the size of qsizetype indirectly.
49// We assume that qsizetype is always the same size as a pointer. I haven't seen a platform
50// where this is not the case.
51// Furthermore moc is wrong about pretty much everything on 64bit windows. We need to hardcode
52// the size there.
53// Likewise, we also have to determine the size of long and ulong indirectly.
54
55#if defined(Q_OS_WIN64)
56
57static_assert(sizeof(long) == 4);
58#define QML_LONG_IS_32BIT
59static_assert(sizeof(qsizetype) == 8);
60#define QML_SIZE_IS_64BIT
61
62#elif QT_POINTER_SIZE == 4
63
64static_assert(sizeof(long) == 4);
65#define QML_LONG_IS_32BIT
66static_assert(sizeof(qsizetype) == 4);
67#define QML_SIZE_IS_32BIT
68
69#else
70
71static_assert(sizeof(long) == 8);
72#define QML_LONG_IS_64BIT
73static_assert(sizeof(qsizetype) == 8);
74#define QML_SIZE_IS_64BIT
75
76#endif
77
78#define QML_EXTENDED_JAVASCRIPT(EXTENDED_TYPE) \
79 Q_CLASSINFO("QML.Extended", #EXTENDED_TYPE) \
80 Q_CLASSINFO("QML.ExtensionIsJavaScript", "true")
81
82template<typename A> struct QQmlPrimitiveAliasFriend {};
83
84#define QML_PRIMITIVE_ALIAS(PRIMITIVE_ALIAS) \
85 Q_CLASSINFO("QML.PrimitiveAlias", #PRIMITIVE_ALIAS) \
86 friend QQmlPrimitiveAliasFriend<PRIMITIVE_ALIAS>;
87
88struct QQmlVoidForeign
89{
90 Q_GADGET
91 QML_VALUE_TYPE(void)
92 QML_EXTENDED_JAVASCRIPT(undefined)
93#if !QT_CONFIG(regularexpression)
94 QML_VALUE_TYPE(regexp)
95#endif
96 QML_FOREIGN(void)
97};
98
99struct QQmlVarForeign
100{
101 Q_GADGET
102 QML_VALUE_TYPE(var)
103 QML_VALUE_TYPE(variant)
104 QML_FOREIGN(QVariant)
105 QML_EXTENDED(QQmlVarForeign)
106};
107
108struct QQmlQtObjectForeign
109{
110 Q_GADGET
111 QML_NAMED_ELEMENT(QtObject)
112 QML_EXTENDED_JAVASCRIPT(Object)
113 QML_FOREIGN(QObject)
114 Q_CLASSINFO("QML.Root", "true")
115};
116
117struct QQmlIntForeign
118{
119 Q_GADGET
120 QML_VALUE_TYPE(int)
121 QML_EXTENDED_JAVASCRIPT(Number)
122 QML_FOREIGN(int)
123#ifdef QML_SIZE_IS_32BIT
124 // Keep qsizetype as primitive alias. We want it as separate type.
125 QML_PRIMITIVE_ALIAS(qsizetype)
126#endif
127};
128
129struct QQmlQint32Foreign
130{
131 Q_GADGET
132 QML_FOREIGN(qint32)
133 QML_USING(int)
134};
135
136struct QQmlInt32TForeign
137{
138 Q_GADGET
139 QML_FOREIGN(int32_t)
140 QML_USING(int)
141};
142
143struct QQmlDoubleForeign
144{
145 Q_GADGET
146 QML_VALUE_TYPE(real)
147 QML_VALUE_TYPE(double)
148 QML_EXTENDED_JAVASCRIPT(Number)
149 QML_FOREIGN(double)
150};
151
152struct QQmlStringForeign
153{
154 Q_GADGET
155 QML_VALUE_TYPE(string)
156 QML_EXTENDED_JAVASCRIPT(String)
157 QML_FOREIGN(QString)
158};
159
160struct QQmlAnyStringViewForeign
161{
162 Q_GADGET
163 QML_ANONYMOUS
164 QML_EXTENDED_JAVASCRIPT(String)
165 QML_FOREIGN(QAnyStringView)
166};
167
168struct QQmlBoolForeign
169{
170 Q_GADGET
171 QML_VALUE_TYPE(bool)
172 QML_EXTENDED_JAVASCRIPT(Boolean)
173 QML_FOREIGN(bool)
174};
175
176struct QQmlDateForeign
177{
178 Q_GADGET
179 QML_VALUE_TYPE(date)
180 QML_EXTENDED_JAVASCRIPT(Date)
181 QML_FOREIGN(QDateTime)
182};
183
184struct QQmlUrlForeign
185{
186 Q_GADGET
187 QML_VALUE_TYPE(url)
188 QML_EXTENDED_JAVASCRIPT(URL)
189 QML_FOREIGN(QUrl)
190};
191
192#if QT_CONFIG(regularexpression)
193struct QQmlRegexpForeign
194{
195 Q_GADGET
196 QML_VALUE_TYPE(regexp)
197 QML_EXTENDED_JAVASCRIPT(RegExp)
198 QML_FOREIGN(QRegularExpression)
199};
200#endif
201
202struct QQmlNullForeign
203{
204 Q_GADGET
205 QML_ANONYMOUS
206 QML_FOREIGN(std::nullptr_t)
207 QML_EXTENDED(QQmlNullForeign)
208};
209
210struct QQmlQVariantMapForeign
211{
212 Q_GADGET
213 QML_ANONYMOUS
214 QML_FOREIGN(QVariantMap)
215 QML_EXTENDED_JAVASCRIPT(Object)
216};
217
218struct QQmlQint8Foreign
219{
220 Q_GADGET
221 QML_ANONYMOUS
222 QML_EXTENDED_JAVASCRIPT(Number)
223 QML_FOREIGN(qint8)
224};
225
226struct QQmlInt8TForeign
227{
228 Q_GADGET
229 QML_FOREIGN(int8_t)
230 QML_USING(qint8)
231};
232
233struct QQmlQuint8Foreign
234{
235 Q_GADGET
236 QML_ANONYMOUS
237 QML_EXTENDED_JAVASCRIPT(Number)
238 QML_FOREIGN(quint8)
239};
240
241struct QQmlUint8TForeign
242{
243 Q_GADGET
244 QML_FOREIGN(uint8_t)
245 QML_USING(quint8)
246};
247
248struct QQmlUcharForeign
249{
250 Q_GADGET
251 QML_FOREIGN(uchar)
252 QML_USING(quint8)
253};
254
255struct QQmlCharForeign
256{
257 Q_GADGET
258 QML_FOREIGN(char)
259#if CHAR_MAX == UCHAR_MAX
260 QML_USING(quint8)
261#elif CHAR_MAX == SCHAR_MAX
262 QML_USING(qint8)
263#else
264# error char is neither quint8 nor qint8
265#endif
266};
267
268struct QQmlShortForeign
269{
270 Q_GADGET
271 QML_ANONYMOUS
272 QML_EXTENDED_JAVASCRIPT(Number)
273 QML_FOREIGN(short)
274};
275
276struct QQmlQint16Foreign
277{
278 Q_GADGET
279 QML_FOREIGN(qint16)
280 QML_USING(short)
281};
282
283struct QQmlInt16TForeign
284{
285 Q_GADGET
286 QML_FOREIGN(int16_t)
287 QML_USING(short)
288};
289
290struct QQmlUshortForeign
291{
292 Q_GADGET
293 QML_ANONYMOUS
294 QML_EXTENDED_JAVASCRIPT(Number)
295 QML_FOREIGN(ushort)
296};
297
298struct QQmlQuint16Foreign
299{
300 Q_GADGET
301 QML_FOREIGN(quint16)
302 QML_USING(ushort)
303};
304
305struct QQmlUint16TForeign
306{
307 Q_GADGET
308 QML_FOREIGN(uint16_t)
309 QML_USING(ushort)
310};
311
312struct QQmlUintForeign
313{
314 Q_GADGET
315 QML_ANONYMOUS
316 QML_EXTENDED_JAVASCRIPT(Number)
317 QML_FOREIGN(uint)
318};
319
320struct QQmlQuint32Foreign
321{
322 Q_GADGET
323 QML_FOREIGN(quint32)
324 QML_USING(uint)
325};
326
327struct QQmlUint32TForeign
328{
329 Q_GADGET
330 QML_FOREIGN(uint32_t)
331 QML_USING(uint)
332};
333
334struct QQmlQlonglongForeign
335{
336 Q_GADGET
337 QML_ANONYMOUS
338 QML_EXTENDED_JAVASCRIPT(Number)
339 QML_FOREIGN(qlonglong)
340#ifdef QML_SIZE_IS_64BIT
341 // Keep qsizetype as primitive alias. We want it as separate type.
342 QML_PRIMITIVE_ALIAS(qsizetype)
343#endif
344};
345
346struct QQmlQint64Foreign
347{
348 Q_GADGET
349 QML_FOREIGN(qint64)
350 QML_USING(qlonglong)
351};
352
353struct QQmlInt64TForeign
354{
355 Q_GADGET
356 QML_FOREIGN(int64_t)
357 QML_USING(qlonglong)
358};
359
360struct QQmlLongForeign
361{
362 Q_GADGET
363 QML_FOREIGN(long)
364#if defined QML_LONG_IS_32BIT
365 QML_USING(int)
366#elif defined QML_LONG_IS_64BIT
367 QML_USING(qlonglong)
368#else
369# error long is neither 32bit nor 64bit
370#endif
371};
372
373struct QQmlQulonglongForeign
374{
375 Q_GADGET
376 QML_ANONYMOUS
377 QML_EXTENDED_JAVASCRIPT(Number)
378 QML_FOREIGN(qulonglong)
379};
380
381struct QQmlQuint64Foreign
382{
383 Q_GADGET
384 QML_FOREIGN(quint64)
385 QML_USING(qulonglong)
386};
387
388struct QQmlUint64TForeign
389{
390 Q_GADGET
391 QML_FOREIGN(uint64_t)
392 QML_USING(qulonglong)
393};
394
395struct QQmlUlongForeign
396{
397 Q_GADGET
398 QML_FOREIGN(ulong)
399#if defined QML_LONG_IS_32BIT
400 QML_USING(uint)
401#elif defined QML_LONG_IS_64BIT
402 QML_USING(qulonglong)
403#else
404# error ulong is neither 32bit nor 64bit
405#endif
406};
407
408struct QQmlFloatForeign
409{
410 Q_GADGET
411 QML_ANONYMOUS
412 QML_EXTENDED_JAVASCRIPT(Number)
413 QML_FOREIGN(float)
414};
415
416struct QQmlQRealForeign
417{
418 Q_GADGET
419 QML_FOREIGN(qreal)
420#if !defined(QT_COORD_TYPE) || defined(QT_COORD_TYPE_IS_DOUBLE)
421 QML_USING(double)
422#elif defined(QT_COORD_TYPE_IS_FLOAT)
423 QML_USING(float)
424#else
425# error qreal is neither float nor double
426#endif
427};
428
429struct QQmlQCharForeign
430{
431 Q_GADGET
432 QML_ANONYMOUS
433 QML_FOREIGN(QChar)
434 QML_EXTENDED_JAVASCRIPT(String)
435};
436
437struct QQmlQDateForeign
438{
439 Q_GADGET
440 QML_ANONYMOUS
441 QML_FOREIGN(QDate)
442 QML_EXTENDED_JAVASCRIPT(Date)
443};
444
445struct QQmlQTimeForeign
446{
447 Q_GADGET
448 QML_ANONYMOUS
449 QML_FOREIGN(QTime)
450 QML_EXTENDED_JAVASCRIPT(Date)
451};
452
453struct QQmlQByteArrayForeign
454{
455 Q_GADGET
456 QML_ANONYMOUS
457 QML_EXTENDED_JAVASCRIPT(ArrayBuffer)
458 QML_FOREIGN(QByteArray)
459};
460
461struct QQmlQByteArrayListForeign
462{
463 Q_GADGET
464 QML_ANONYMOUS
465 QML_FOREIGN(QByteArrayList)
466 QML_SEQUENTIAL_CONTAINER(QByteArray)
467};
468
469struct QQmlQStringListForeign
470{
471 Q_GADGET
472 QML_ANONYMOUS
473 QML_FOREIGN(QStringList)
474 QML_SEQUENTIAL_CONTAINER(QString)
475};
476
477struct QQmlQVariantListForeign
478{
479 Q_GADGET
480 QML_ANONYMOUS
481 QML_FOREIGN(QVariantList)
482 QML_SEQUENTIAL_CONTAINER(QVariant)
483};
484
485struct QQmlQObjectListForeign
486{
487 Q_GADGET
488 QML_ANONYMOUS
489 QML_FOREIGN(QObjectList)
490 QML_SEQUENTIAL_CONTAINER(QObject*)
491};
492
493struct QQmlQListQObjectForeign
494{
495 Q_GADGET
496 QML_FOREIGN(QList<QObject*>)
497 QML_USING(QObjectList)
498};
499
500struct QQmlQJSValueForeign
501{
502 Q_GADGET
503 QML_ANONYMOUS
504 QML_FOREIGN(QJSValue)
505 QML_EXTENDED(QQmlQJSValueForeign)
506};
507
508struct QQmlComponentForeign
509{
510 Q_GADGET
511 QML_NAMED_ELEMENT(Component)
512 QML_FOREIGN(QQmlComponent)
513 QML_ATTACHED(QQmlComponentAttached)
514};
515
516struct QQmlScriptStringForeign
517{
518 Q_GADGET
519 QML_ANONYMOUS
520 QML_FOREIGN(QQmlScriptString)
521};
522
523struct QQmlV4FunctionPtrForeign
524{
525 Q_GADGET
526 QML_ANONYMOUS
527 QML_FOREIGN(QQmlV4FunctionPtr)
528 QML_EXTENDED(QQmlV4FunctionPtrForeign)
529};
530
531struct QQmlQJsonObjectForeign
532{
533 Q_GADGET
534 QML_ANONYMOUS
535 QML_FOREIGN(QJsonObject)
536 QML_EXTENDED_JAVASCRIPT(Object)
537};
538
539struct QQmlQJsonValueForeign
540{
541 Q_GADGET
542 QML_ANONYMOUS
543 QML_FOREIGN(QJsonValue)
544 QML_EXTENDED(QQmlQJsonValueForeign)
545};
546
547struct QQmlQJsonArrayForeign
548{
549 Q_GADGET
550 QML_ANONYMOUS
551 QML_FOREIGN(QJsonArray)
552 QML_SEQUENTIAL_CONTAINER(QJsonValue)
553};
554
555QT_END_NAMESPACE
556
557#endif // QQMLBUILTINS_H
558

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

source code of qtdeclarative/src/qml/qqmlbuiltins_p.h