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 | |
46 | QT_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 | |
57 | static_assert(sizeof(long) == 4); |
58 | #define QML_LONG_IS_32BIT |
59 | static_assert(sizeof(qsizetype) == 8); |
60 | #define QML_SIZE_IS_64BIT |
61 | |
62 | #elif QT_POINTER_SIZE == 4 |
63 | |
64 | static_assert(sizeof(long) == 4); |
65 | #define QML_LONG_IS_32BIT |
66 | static_assert(sizeof(qsizetype) == 4); |
67 | #define QML_SIZE_IS_32BIT |
68 | |
69 | #else |
70 | |
71 | static_assert(sizeof(long) == 8); |
72 | #define QML_LONG_IS_64BIT |
73 | static_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 | |
82 | template<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 | |
88 | struct 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 | |
99 | struct 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 | |
108 | struct 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 | |
117 | struct 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 | |
129 | struct QQmlQint32Foreign |
130 | { |
131 | Q_GADGET |
132 | QML_FOREIGN(qint32) |
133 | QML_USING(int) |
134 | }; |
135 | |
136 | struct QQmlInt32TForeign |
137 | { |
138 | Q_GADGET |
139 | QML_FOREIGN(int32_t) |
140 | QML_USING(int) |
141 | }; |
142 | |
143 | struct 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 | |
152 | struct QQmlStringForeign |
153 | { |
154 | Q_GADGET |
155 | QML_VALUE_TYPE(string) |
156 | QML_EXTENDED_JAVASCRIPT(String) |
157 | QML_FOREIGN(QString) |
158 | }; |
159 | |
160 | struct QQmlAnyStringViewForeign |
161 | { |
162 | Q_GADGET |
163 | QML_ANONYMOUS |
164 | QML_EXTENDED_JAVASCRIPT(String) |
165 | QML_FOREIGN(QAnyStringView) |
166 | }; |
167 | |
168 | struct QQmlBoolForeign |
169 | { |
170 | Q_GADGET |
171 | QML_VALUE_TYPE(bool) |
172 | QML_EXTENDED_JAVASCRIPT(Boolean) |
173 | QML_FOREIGN(bool) |
174 | }; |
175 | |
176 | struct QQmlDateForeign |
177 | { |
178 | Q_GADGET |
179 | QML_VALUE_TYPE(date) |
180 | QML_EXTENDED_JAVASCRIPT(Date) |
181 | QML_FOREIGN(QDateTime) |
182 | }; |
183 | |
184 | struct 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) |
193 | struct QQmlRegexpForeign |
194 | { |
195 | Q_GADGET |
196 | QML_VALUE_TYPE(regexp) |
197 | QML_EXTENDED_JAVASCRIPT(RegExp) |
198 | QML_FOREIGN(QRegularExpression) |
199 | }; |
200 | #endif |
201 | |
202 | struct QQmlNullForeign |
203 | { |
204 | Q_GADGET |
205 | QML_ANONYMOUS |
206 | QML_FOREIGN(std::nullptr_t) |
207 | QML_EXTENDED(QQmlNullForeign) |
208 | }; |
209 | |
210 | struct QQmlQVariantMapForeign |
211 | { |
212 | Q_GADGET |
213 | QML_ANONYMOUS |
214 | QML_FOREIGN(QVariantMap) |
215 | QML_EXTENDED_JAVASCRIPT(Object) |
216 | }; |
217 | |
218 | struct QQmlQint8Foreign |
219 | { |
220 | Q_GADGET |
221 | QML_ANONYMOUS |
222 | QML_EXTENDED_JAVASCRIPT(Number) |
223 | QML_FOREIGN(qint8) |
224 | }; |
225 | |
226 | struct QQmlInt8TForeign |
227 | { |
228 | Q_GADGET |
229 | QML_FOREIGN(int8_t) |
230 | QML_USING(qint8) |
231 | }; |
232 | |
233 | struct QQmlQuint8Foreign |
234 | { |
235 | Q_GADGET |
236 | QML_ANONYMOUS |
237 | QML_EXTENDED_JAVASCRIPT(Number) |
238 | QML_FOREIGN(quint8) |
239 | }; |
240 | |
241 | struct QQmlUint8TForeign |
242 | { |
243 | Q_GADGET |
244 | QML_FOREIGN(uint8_t) |
245 | QML_USING(quint8) |
246 | }; |
247 | |
248 | struct QQmlUcharForeign |
249 | { |
250 | Q_GADGET |
251 | QML_FOREIGN(uchar) |
252 | QML_USING(quint8) |
253 | }; |
254 | |
255 | struct 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 | |
268 | struct QQmlShortForeign |
269 | { |
270 | Q_GADGET |
271 | QML_ANONYMOUS |
272 | QML_EXTENDED_JAVASCRIPT(Number) |
273 | QML_FOREIGN(short) |
274 | }; |
275 | |
276 | struct QQmlQint16Foreign |
277 | { |
278 | Q_GADGET |
279 | QML_FOREIGN(qint16) |
280 | QML_USING(short) |
281 | }; |
282 | |
283 | struct QQmlInt16TForeign |
284 | { |
285 | Q_GADGET |
286 | QML_FOREIGN(int16_t) |
287 | QML_USING(short) |
288 | }; |
289 | |
290 | struct QQmlUshortForeign |
291 | { |
292 | Q_GADGET |
293 | QML_ANONYMOUS |
294 | QML_EXTENDED_JAVASCRIPT(Number) |
295 | QML_FOREIGN(ushort) |
296 | }; |
297 | |
298 | struct QQmlQuint16Foreign |
299 | { |
300 | Q_GADGET |
301 | QML_FOREIGN(quint16) |
302 | QML_USING(ushort) |
303 | }; |
304 | |
305 | struct QQmlUint16TForeign |
306 | { |
307 | Q_GADGET |
308 | QML_FOREIGN(uint16_t) |
309 | QML_USING(ushort) |
310 | }; |
311 | |
312 | struct QQmlUintForeign |
313 | { |
314 | Q_GADGET |
315 | QML_ANONYMOUS |
316 | QML_EXTENDED_JAVASCRIPT(Number) |
317 | QML_FOREIGN(uint) |
318 | }; |
319 | |
320 | struct QQmlQuint32Foreign |
321 | { |
322 | Q_GADGET |
323 | QML_FOREIGN(quint32) |
324 | QML_USING(uint) |
325 | }; |
326 | |
327 | struct QQmlUint32TForeign |
328 | { |
329 | Q_GADGET |
330 | QML_FOREIGN(uint32_t) |
331 | QML_USING(uint) |
332 | }; |
333 | |
334 | struct 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 | |
346 | struct QQmlQint64Foreign |
347 | { |
348 | Q_GADGET |
349 | QML_FOREIGN(qint64) |
350 | QML_USING(qlonglong) |
351 | }; |
352 | |
353 | struct QQmlInt64TForeign |
354 | { |
355 | Q_GADGET |
356 | QML_FOREIGN(int64_t) |
357 | QML_USING(qlonglong) |
358 | }; |
359 | |
360 | struct 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 | |
373 | struct QQmlQulonglongForeign |
374 | { |
375 | Q_GADGET |
376 | QML_ANONYMOUS |
377 | QML_EXTENDED_JAVASCRIPT(Number) |
378 | QML_FOREIGN(qulonglong) |
379 | }; |
380 | |
381 | struct QQmlQuint64Foreign |
382 | { |
383 | Q_GADGET |
384 | QML_FOREIGN(quint64) |
385 | QML_USING(qulonglong) |
386 | }; |
387 | |
388 | struct QQmlUint64TForeign |
389 | { |
390 | Q_GADGET |
391 | QML_FOREIGN(uint64_t) |
392 | QML_USING(qulonglong) |
393 | }; |
394 | |
395 | struct 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 | |
408 | struct QQmlFloatForeign |
409 | { |
410 | Q_GADGET |
411 | QML_ANONYMOUS |
412 | QML_EXTENDED_JAVASCRIPT(Number) |
413 | QML_FOREIGN(float) |
414 | }; |
415 | |
416 | struct 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 | |
429 | struct QQmlQCharForeign |
430 | { |
431 | Q_GADGET |
432 | QML_ANONYMOUS |
433 | QML_FOREIGN(QChar) |
434 | QML_EXTENDED_JAVASCRIPT(String) |
435 | }; |
436 | |
437 | struct QQmlQDateForeign |
438 | { |
439 | Q_GADGET |
440 | QML_ANONYMOUS |
441 | QML_FOREIGN(QDate) |
442 | QML_EXTENDED_JAVASCRIPT(Date) |
443 | }; |
444 | |
445 | struct QQmlQTimeForeign |
446 | { |
447 | Q_GADGET |
448 | QML_ANONYMOUS |
449 | QML_FOREIGN(QTime) |
450 | QML_EXTENDED_JAVASCRIPT(Date) |
451 | }; |
452 | |
453 | struct QQmlQByteArrayForeign |
454 | { |
455 | Q_GADGET |
456 | QML_ANONYMOUS |
457 | QML_EXTENDED_JAVASCRIPT(ArrayBuffer) |
458 | QML_FOREIGN(QByteArray) |
459 | }; |
460 | |
461 | struct QQmlQByteArrayListForeign |
462 | { |
463 | Q_GADGET |
464 | QML_ANONYMOUS |
465 | QML_FOREIGN(QByteArrayList) |
466 | QML_SEQUENTIAL_CONTAINER(QByteArray) |
467 | }; |
468 | |
469 | struct QQmlQStringListForeign |
470 | { |
471 | Q_GADGET |
472 | QML_ANONYMOUS |
473 | QML_FOREIGN(QStringList) |
474 | QML_SEQUENTIAL_CONTAINER(QString) |
475 | }; |
476 | |
477 | struct QQmlQVariantListForeign |
478 | { |
479 | Q_GADGET |
480 | QML_ANONYMOUS |
481 | QML_FOREIGN(QVariantList) |
482 | QML_SEQUENTIAL_CONTAINER(QVariant) |
483 | }; |
484 | |
485 | struct QQmlQObjectListForeign |
486 | { |
487 | Q_GADGET |
488 | QML_ANONYMOUS |
489 | QML_FOREIGN(QObjectList) |
490 | QML_SEQUENTIAL_CONTAINER(QObject*) |
491 | }; |
492 | |
493 | struct QQmlQListQObjectForeign |
494 | { |
495 | Q_GADGET |
496 | QML_FOREIGN(QList<QObject*>) |
497 | QML_USING(QObjectList) |
498 | }; |
499 | |
500 | struct QQmlQJSValueForeign |
501 | { |
502 | Q_GADGET |
503 | QML_ANONYMOUS |
504 | QML_FOREIGN(QJSValue) |
505 | QML_EXTENDED(QQmlQJSValueForeign) |
506 | }; |
507 | |
508 | struct QQmlComponentForeign |
509 | { |
510 | Q_GADGET |
511 | QML_NAMED_ELEMENT(Component) |
512 | QML_FOREIGN(QQmlComponent) |
513 | QML_ATTACHED(QQmlComponentAttached) |
514 | }; |
515 | |
516 | struct QQmlScriptStringForeign |
517 | { |
518 | Q_GADGET |
519 | QML_ANONYMOUS |
520 | QML_FOREIGN(QQmlScriptString) |
521 | }; |
522 | |
523 | struct QQmlV4FunctionPtrForeign |
524 | { |
525 | Q_GADGET |
526 | QML_ANONYMOUS |
527 | QML_FOREIGN(QQmlV4FunctionPtr) |
528 | QML_EXTENDED(QQmlV4FunctionPtrForeign) |
529 | }; |
530 | |
531 | struct QQmlQJsonObjectForeign |
532 | { |
533 | Q_GADGET |
534 | QML_ANONYMOUS |
535 | QML_FOREIGN(QJsonObject) |
536 | QML_EXTENDED_JAVASCRIPT(Object) |
537 | }; |
538 | |
539 | struct QQmlQJsonValueForeign |
540 | { |
541 | Q_GADGET |
542 | QML_ANONYMOUS |
543 | QML_FOREIGN(QJsonValue) |
544 | QML_EXTENDED(QQmlQJsonValueForeign) |
545 | }; |
546 | |
547 | struct QQmlQJsonArrayForeign |
548 | { |
549 | Q_GADGET |
550 | QML_ANONYMOUS |
551 | QML_FOREIGN(QJsonArray) |
552 | QML_SEQUENTIAL_CONTAINER(QJsonValue) |
553 | }; |
554 | |
555 | QT_END_NAMESPACE |
556 | |
557 | #endif // QQMLBUILTINS_H |
558 |
Definitions
- QQmlPrimitiveAliasFriend
- QQmlVoidForeign
- QQmlVarForeign
- QQmlQtObjectForeign
- QQmlIntForeign
- QQmlQint32Foreign
- QQmlInt32TForeign
- QQmlDoubleForeign
- QQmlStringForeign
- QQmlAnyStringViewForeign
- QQmlBoolForeign
- QQmlDateForeign
- QQmlUrlForeign
- QQmlRegexpForeign
- QQmlNullForeign
- QQmlQVariantMapForeign
- QQmlQint8Foreign
- QQmlInt8TForeign
- QQmlQuint8Foreign
- QQmlUint8TForeign
- QQmlUcharForeign
- QQmlCharForeign
- QQmlShortForeign
- QQmlQint16Foreign
- QQmlInt16TForeign
- QQmlUshortForeign
- QQmlQuint16Foreign
- QQmlUint16TForeign
- QQmlUintForeign
- QQmlQuint32Foreign
- QQmlUint32TForeign
- QQmlQlonglongForeign
- QQmlQint64Foreign
- QQmlInt64TForeign
- QQmlLongForeign
- QQmlQulonglongForeign
- QQmlQuint64Foreign
- QQmlUint64TForeign
- QQmlUlongForeign
- QQmlFloatForeign
- QQmlQRealForeign
- QQmlQCharForeign
- QQmlQDateForeign
- QQmlQTimeForeign
- QQmlQByteArrayForeign
- QQmlQByteArrayListForeign
- QQmlQStringListForeign
- QQmlQVariantListForeign
- QQmlQObjectListForeign
- QQmlQListQObjectForeign
- QQmlQJSValueForeign
- QQmlComponentForeign
- QQmlScriptStringForeign
- QQmlV4FunctionPtrForeign
- QQmlQJsonObjectForeign
- QQmlQJsonValueForeign
Start learning QML with our Intro Training
Find out more