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 QQmlQVariantHashForeign
219{
220 Q_GADGET
221 QML_ANONYMOUS
222 QML_FOREIGN(QVariantHash)
223 QML_EXTENDED_JAVASCRIPT(Object)
224};
225
226struct QQmlQint8Foreign
227{
228 Q_GADGET
229 QML_ANONYMOUS
230 QML_EXTENDED_JAVASCRIPT(Number)
231 QML_FOREIGN(qint8)
232};
233
234struct QQmlInt8TForeign
235{
236 Q_GADGET
237 QML_FOREIGN(int8_t)
238 QML_USING(qint8)
239};
240
241struct QQmlQuint8Foreign
242{
243 Q_GADGET
244 QML_ANONYMOUS
245 QML_EXTENDED_JAVASCRIPT(Number)
246 QML_FOREIGN(quint8)
247};
248
249struct QQmlUint8TForeign
250{
251 Q_GADGET
252 QML_FOREIGN(uint8_t)
253 QML_USING(quint8)
254};
255
256struct QQmlUcharForeign
257{
258 Q_GADGET
259 QML_FOREIGN(uchar)
260 QML_USING(quint8)
261};
262
263struct QQmlCharForeign
264{
265 Q_GADGET
266 QML_FOREIGN(char)
267#if CHAR_MAX == UCHAR_MAX
268 QML_USING(quint8)
269#elif CHAR_MAX == SCHAR_MAX
270 QML_USING(qint8)
271#else
272# error char is neither quint8 nor qint8
273#endif
274};
275
276struct QQmlShortForeign
277{
278 Q_GADGET
279 QML_ANONYMOUS
280 QML_EXTENDED_JAVASCRIPT(Number)
281 QML_FOREIGN(short)
282};
283
284struct QQmlQint16Foreign
285{
286 Q_GADGET
287 QML_FOREIGN(qint16)
288 QML_USING(short)
289};
290
291struct QQmlInt16TForeign
292{
293 Q_GADGET
294 QML_FOREIGN(int16_t)
295 QML_USING(short)
296};
297
298struct QQmlUshortForeign
299{
300 Q_GADGET
301 QML_ANONYMOUS
302 QML_EXTENDED_JAVASCRIPT(Number)
303 QML_FOREIGN(ushort)
304};
305
306struct QQmlQuint16Foreign
307{
308 Q_GADGET
309 QML_FOREIGN(quint16)
310 QML_USING(ushort)
311};
312
313struct QQmlUint16TForeign
314{
315 Q_GADGET
316 QML_FOREIGN(uint16_t)
317 QML_USING(ushort)
318};
319
320struct QQmlUintForeign
321{
322 Q_GADGET
323 QML_ANONYMOUS
324 QML_EXTENDED_JAVASCRIPT(Number)
325 QML_FOREIGN(uint)
326};
327
328struct QQmlQuint32Foreign
329{
330 Q_GADGET
331 QML_FOREIGN(quint32)
332 QML_USING(uint)
333};
334
335struct QQmlUint32TForeign
336{
337 Q_GADGET
338 QML_FOREIGN(uint32_t)
339 QML_USING(uint)
340};
341
342struct QQmlQlonglongForeign
343{
344 Q_GADGET
345 QML_ANONYMOUS
346 QML_EXTENDED_JAVASCRIPT(Number)
347 QML_FOREIGN(qlonglong)
348#ifdef QML_SIZE_IS_64BIT
349 // Keep qsizetype as primitive alias. We want it as separate type.
350 QML_PRIMITIVE_ALIAS(qsizetype)
351#endif
352};
353
354struct QQmlQint64Foreign
355{
356 Q_GADGET
357 QML_FOREIGN(qint64)
358 QML_USING(qlonglong)
359};
360
361struct QQmlInt64TForeign
362{
363 Q_GADGET
364 QML_FOREIGN(int64_t)
365 QML_USING(qlonglong)
366};
367
368struct QQmlLongForeign
369{
370 Q_GADGET
371 QML_FOREIGN(long)
372#if defined QML_LONG_IS_32BIT
373 QML_USING(int)
374#elif defined QML_LONG_IS_64BIT
375 QML_USING(qlonglong)
376#else
377# error long is neither 32bit nor 64bit
378#endif
379};
380
381struct QQmlQulonglongForeign
382{
383 Q_GADGET
384 QML_ANONYMOUS
385 QML_EXTENDED_JAVASCRIPT(Number)
386 QML_FOREIGN(qulonglong)
387};
388
389struct QQmlQuint64Foreign
390{
391 Q_GADGET
392 QML_FOREIGN(quint64)
393 QML_USING(qulonglong)
394};
395
396struct QQmlUint64TForeign
397{
398 Q_GADGET
399 QML_FOREIGN(uint64_t)
400 QML_USING(qulonglong)
401};
402
403struct QQmlUlongForeign
404{
405 Q_GADGET
406 QML_FOREIGN(ulong)
407#if defined QML_LONG_IS_32BIT
408 QML_USING(uint)
409#elif defined QML_LONG_IS_64BIT
410 QML_USING(qulonglong)
411#else
412# error ulong is neither 32bit nor 64bit
413#endif
414};
415
416struct QQmlFloatForeign
417{
418 Q_GADGET
419 QML_ANONYMOUS
420 QML_EXTENDED_JAVASCRIPT(Number)
421 QML_FOREIGN(float)
422};
423
424struct QQmlQRealForeign
425{
426 Q_GADGET
427 QML_FOREIGN(qreal)
428#if !defined(QT_COORD_TYPE) || defined(QT_COORD_TYPE_IS_DOUBLE)
429 QML_USING(double)
430#elif defined(QT_COORD_TYPE_IS_FLOAT)
431 QML_USING(float)
432#else
433# error qreal is neither float nor double
434#endif
435};
436
437struct QQmlQCharForeign
438{
439 Q_GADGET
440 QML_ANONYMOUS
441 QML_FOREIGN(QChar)
442 QML_EXTENDED_JAVASCRIPT(String)
443};
444
445struct QQmlQDateForeign
446{
447 Q_GADGET
448 QML_ANONYMOUS
449 QML_FOREIGN(QDate)
450 QML_EXTENDED_JAVASCRIPT(Date)
451};
452
453struct QQmlQTimeForeign
454{
455 Q_GADGET
456 QML_ANONYMOUS
457 QML_FOREIGN(QTime)
458 QML_EXTENDED_JAVASCRIPT(Date)
459};
460
461struct QQmlQByteArrayForeign
462{
463 Q_GADGET
464 QML_ANONYMOUS
465 QML_EXTENDED_JAVASCRIPT(ArrayBuffer)
466 QML_FOREIGN(QByteArray)
467};
468
469struct QQmlQByteArrayListForeign
470{
471 Q_GADGET
472 QML_ANONYMOUS
473 QML_FOREIGN(QByteArrayList)
474 QML_SEQUENTIAL_CONTAINER(QByteArray)
475};
476
477struct QQmlQStringListForeign
478{
479 Q_GADGET
480 QML_ANONYMOUS
481 QML_FOREIGN(QStringList)
482 QML_SEQUENTIAL_CONTAINER(QString)
483};
484
485struct QQmlQVariantListForeign
486{
487 Q_GADGET
488 QML_ANONYMOUS
489 QML_FOREIGN(QVariantList)
490 QML_SEQUENTIAL_CONTAINER(QVariant)
491};
492
493struct QQmlQObjectListForeign
494{
495 Q_GADGET
496 QML_ANONYMOUS
497 QML_FOREIGN(QObjectList)
498 QML_SEQUENTIAL_CONTAINER(QObject*)
499};
500
501struct QQmlQListQObjectForeign
502{
503 Q_GADGET
504 QML_FOREIGN(QList<QObject*>)
505 QML_USING(QObjectList)
506};
507
508struct QQmlQJSValueForeign
509{
510 Q_GADGET
511 QML_ANONYMOUS
512 QML_FOREIGN(QJSValue)
513 QML_EXTENDED(QQmlQJSValueForeign)
514};
515
516struct QQmlComponentForeign
517{
518 Q_GADGET
519 QML_NAMED_ELEMENT(Component)
520 QML_FOREIGN(QQmlComponent)
521 QML_ATTACHED(QQmlComponentAttached)
522};
523
524struct QQmlScriptStringForeign
525{
526 Q_GADGET
527 QML_ANONYMOUS
528 QML_FOREIGN(QQmlScriptString)
529};
530
531struct QQmlV4FunctionPtrForeign
532{
533 Q_GADGET
534 QML_ANONYMOUS
535 QML_FOREIGN(QQmlV4FunctionPtr)
536 QML_EXTENDED(QQmlV4FunctionPtrForeign)
537};
538
539struct QQmlQJsonObjectForeign
540{
541 Q_GADGET
542 QML_ANONYMOUS
543 QML_FOREIGN(QJsonObject)
544 QML_EXTENDED_JAVASCRIPT(Object)
545};
546
547struct QQmlQJsonValueForeign
548{
549 Q_GADGET
550 QML_ANONYMOUS
551 QML_FOREIGN(QJsonValue)
552 QML_EXTENDED(QQmlQJsonValueForeign)
553};
554
555struct QQmlQJsonArrayForeign
556{
557 Q_GADGET
558 QML_ANONYMOUS
559 QML_FOREIGN(QJsonArray)
560 QML_SEQUENTIAL_CONTAINER(QJsonValue)
561};
562
563QT_END_NAMESPACE
564
565#endif // QQMLBUILTINS_H
566

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