39
39
#include " core/templates/local_vector.h"
40
40
#include " core/templates/oa_hash_map.h"
41
41
42
+ template <class T >
43
+ struct PtrConstruct {};
44
+
45
+ #define MAKE_PTRCONSTRUCT (m_type ) \
46
+ template <> \
47
+ struct PtrConstruct <m_type> { \
48
+ _FORCE_INLINE_ static void construct (const m_type &p_value, void *p_ptr) { \
49
+ memnew_placement (p_ptr, m_type (p_value)); \
50
+ } \
51
+ };
52
+
53
+ MAKE_PTRCONSTRUCT (bool );
54
+ MAKE_PTRCONSTRUCT (int64_t );
55
+ MAKE_PTRCONSTRUCT (double );
56
+ MAKE_PTRCONSTRUCT (String);
57
+ MAKE_PTRCONSTRUCT (Vector2);
58
+ MAKE_PTRCONSTRUCT (Vector2i);
59
+ MAKE_PTRCONSTRUCT (Rect2);
60
+ MAKE_PTRCONSTRUCT (Rect2i);
61
+ MAKE_PTRCONSTRUCT (Vector3);
62
+ MAKE_PTRCONSTRUCT (Vector3i);
63
+ MAKE_PTRCONSTRUCT (Transform2D);
64
+ MAKE_PTRCONSTRUCT (Plane);
65
+ MAKE_PTRCONSTRUCT (Quat);
66
+ MAKE_PTRCONSTRUCT (AABB);
67
+ MAKE_PTRCONSTRUCT (Basis);
68
+ MAKE_PTRCONSTRUCT (Transform);
69
+ MAKE_PTRCONSTRUCT (Color);
70
+ MAKE_PTRCONSTRUCT (StringName);
71
+ MAKE_PTRCONSTRUCT (NodePath);
72
+ MAKE_PTRCONSTRUCT (RID);
73
+
74
+ template <>
75
+ struct PtrConstruct <Object *> {
76
+ _FORCE_INLINE_ static void construct (Object *p_value, void *p_ptr) {
77
+ *((Object **)p_ptr) = p_value;
78
+ }
79
+ };
80
+
81
+ MAKE_PTRCONSTRUCT (Callable);
82
+ MAKE_PTRCONSTRUCT (Signal);
83
+ MAKE_PTRCONSTRUCT (Dictionary);
84
+ MAKE_PTRCONSTRUCT (Array);
85
+ MAKE_PTRCONSTRUCT (PackedByteArray);
86
+ MAKE_PTRCONSTRUCT (PackedInt32Array);
87
+ MAKE_PTRCONSTRUCT (PackedInt64Array);
88
+ MAKE_PTRCONSTRUCT (PackedFloat32Array);
89
+ MAKE_PTRCONSTRUCT (PackedFloat64Array);
90
+ MAKE_PTRCONSTRUCT (PackedStringArray);
91
+ MAKE_PTRCONSTRUCT (PackedVector2Array);
92
+ MAKE_PTRCONSTRUCT (PackedVector3Array);
93
+ MAKE_PTRCONSTRUCT (PackedColorArray);
94
+ MAKE_PTRCONSTRUCT (Variant);
95
+
42
96
template <class T , class ... P>
43
97
class VariantConstructor {
44
98
template <size_t ... Is>
@@ -59,7 +113,7 @@ class VariantConstructor {
59
113
60
114
template <size_t ... Is>
61
115
static _FORCE_INLINE_ void ptr_construct_helper (void *base, const void **p_args, IndexSequence<Is...>) {
62
- PtrToArg <T>::encode (T (PtrToArg<P>::convert (p_args[Is])...), base);
116
+ PtrConstruct <T>::construct (T (PtrToArg<P>::convert (p_args[Is])...), base);
63
117
}
64
118
65
119
public:
@@ -112,7 +166,7 @@ class VariantConstructorObject {
112
166
VariantInternal::object_assign (r_ret, p_args[0 ]);
113
167
}
114
168
static void ptr_construct (void *base, const void **p_args) {
115
- PtrToArg <Object *>::encode (PtrToArg<Object *>::convert (p_args[0 ]), base);
169
+ PtrConstruct <Object *>::construct (PtrToArg<Object *>::convert (p_args[0 ]), base);
116
170
}
117
171
118
172
static int get_argument_count () {
@@ -146,7 +200,7 @@ class VariantConstructorNilObject {
146
200
VariantInternal::object_assign_null (r_ret);
147
201
}
148
202
static void ptr_construct (void *base, const void **p_args) {
149
- PtrToArg <Object *>::encode (nullptr , base);
203
+ PtrConstruct <Object *>::construct (nullptr , base);
150
204
}
151
205
152
206
static int get_argument_count () {
@@ -199,7 +253,7 @@ class VariantConstructorCallableArgs {
199
253
*VariantGetInternalPtr<Callable>::get_ptr (r_ret) = Callable (VariantInternal::get_object_id (p_args[0 ]), *VariantGetInternalPtr<StringName>::get_ptr (p_args[1 ]));
200
254
}
201
255
static void ptr_construct (void *base, const void **p_args) {
202
- PtrToArg <Callable>::encode (Callable (PtrToArg<Object *>::convert (p_args[0 ]), PtrToArg<StringName>::convert (p_args[1 ])), base);
256
+ PtrConstruct <Callable>::construct (Callable (PtrToArg<Object *>::convert (p_args[0 ]), PtrToArg<StringName>::convert (p_args[1 ])), base);
203
257
}
204
258
205
259
static int get_argument_count () {
@@ -256,7 +310,7 @@ class VariantConstructorSignalArgs {
256
310
*VariantGetInternalPtr<Signal>::get_ptr (r_ret) = Signal (VariantInternal::get_object_id (p_args[0 ]), *VariantGetInternalPtr<StringName>::get_ptr (p_args[1 ]));
257
311
}
258
312
static void ptr_construct (void *base, const void **p_args) {
259
- PtrToArg <Signal>::encode (Signal (PtrToArg<Object *>::convert (p_args[0 ]), PtrToArg<StringName>::convert (p_args[1 ])), base);
313
+ PtrConstruct <Signal>::construct (Signal (PtrToArg<Object *>::convert (p_args[0 ]), PtrToArg<StringName>::convert (p_args[1 ])), base);
260
314
}
261
315
262
316
static int get_argument_count () {
@@ -319,7 +373,7 @@ class VariantConstructorToArray {
319
373
dst_arr[i] = src_arr[i];
320
374
}
321
375
322
- PtrToArg <Array>::encode (dst_arr, base);
376
+ PtrConstruct <Array>::construct (dst_arr, base);
323
377
}
324
378
325
379
static int get_argument_count () {
@@ -378,7 +432,7 @@ class VariantConstructorFromArray {
378
432
dst_arr.write [i] = src_arr[i];
379
433
}
380
434
381
- PtrToArg <T>::encode (dst_arr, base);
435
+ PtrConstruct <T>::construct (dst_arr, base);
382
436
}
383
437
384
438
static int get_argument_count () {
@@ -412,7 +466,7 @@ class VariantConstructorNil {
412
466
VariantInternal::clear (r_ret);
413
467
}
414
468
static void ptr_construct (void *base, const void **p_args) {
415
- PtrToArg <Variant>::encode (Variant (), base);
469
+ PtrConstruct <Variant>::construct (Variant (), base);
416
470
}
417
471
418
472
static int get_argument_count () {
@@ -440,7 +494,7 @@ class VariantConstructNoArgs {
440
494
VariantTypeChanger<T>::change_and_reset (r_ret);
441
495
}
442
496
static void ptr_construct (void *base, const void **p_args) {
443
- PtrToArg <T>::encode (T (), base);
497
+ PtrConstruct <T>::construct (T (), base);
444
498
}
445
499
446
500
static int get_argument_count () {
@@ -496,7 +550,7 @@ class VariantConstructNoArgsObject {
496
550
VariantInternal::object_assign_null (r_ret);
497
551
}
498
552
static void ptr_construct (void *base, const void **p_args) {
499
- PtrToArg <Object *>::encode (nullptr , base);
553
+ PtrConstruct <Object *>::construct (nullptr , base);
500
554
}
501
555
502
556
static int get_argument_count () {
0 commit comments