Skip to content

Commit 751bf1b

Browse files
committed
Core: Consolidate typed container logic
1 parent 1e9d0ff commit 751bf1b

File tree

6 files changed

+112
-451
lines changed

6 files changed

+112
-451
lines changed

core/variant/method_ptrcall.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,3 +335,25 @@ struct PtrToArg<Vector<Face3>> {
335335
}
336336
}
337337
};
338+
339+
template <typename T>
340+
struct PtrToArg<TypedArray<T>> {
341+
_FORCE_INLINE_ static TypedArray<T> convert(const void *p_ptr) {
342+
return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr));
343+
}
344+
typedef Array EncodeT;
345+
_FORCE_INLINE_ static void encode(TypedArray<T> p_val, void *p_ptr) {
346+
*(Array *)p_ptr = p_val;
347+
}
348+
};
349+
350+
template <typename K, typename V>
351+
struct PtrToArg<TypedDictionary<K, V>> {
352+
_FORCE_INLINE_ static TypedDictionary<K, V> convert(const void *p_ptr) {
353+
return TypedDictionary<K, V>(*reinterpret_cast<const Dictionary *>(p_ptr));
354+
}
355+
typedef Dictionary EncodeT;
356+
_FORCE_INLINE_ static void encode(TypedDictionary<K, V> p_val, void *p_ptr) {
357+
*(Dictionary *)p_ptr = p_val;
358+
}
359+
};

core/variant/type_info.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,57 @@ struct ZeroInitializer {
246246
}
247247
}
248248
};
249+
250+
namespace GodotTypeInfo {
251+
namespace Internal {
252+
253+
template <typename T>
254+
Variant::Type get_variant_type() {
255+
if constexpr (std::is_base_of_v<Object, T>) {
256+
return Variant::Type::OBJECT;
257+
} else {
258+
return GetTypeInfo<T>::VARIANT_TYPE;
259+
}
260+
}
261+
262+
template <typename T>
263+
const String get_object_class_name_or_empty() {
264+
if constexpr (std::is_base_of_v<Object, T>) {
265+
return T::get_class_static();
266+
} else {
267+
return "";
268+
}
269+
}
270+
271+
template <typename T>
272+
const String get_variant_type_identifier() {
273+
if constexpr (std::is_base_of_v<Object, T>) {
274+
return T::get_class_static();
275+
} else if constexpr (std::is_same_v<Variant, T>) {
276+
return "Variant";
277+
} else {
278+
return Variant::get_type_name(GetTypeInfo<T>::VARIANT_TYPE);
279+
}
280+
}
281+
282+
} //namespace Internal
283+
} //namespace GodotTypeInfo
284+
285+
template <typename T>
286+
struct GetTypeInfo<TypedArray<T>> {
287+
static const Variant::Type VARIANT_TYPE = Variant::ARRAY;
288+
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
289+
static inline PropertyInfo get_class_info() {
290+
return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, GodotTypeInfo::Internal::get_variant_type_identifier<T>());
291+
}
292+
};
293+
294+
template <typename K, typename V>
295+
struct GetTypeInfo<TypedDictionary<K, V>> {
296+
static const Variant::Type VARIANT_TYPE = Variant::DICTIONARY;
297+
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
298+
static inline PropertyInfo get_class_info() {
299+
return PropertyInfo(Variant::DICTIONARY, String(), PROPERTY_HINT_DICTIONARY_TYPE,
300+
vformat("%s;%s", GodotTypeInfo::Internal::get_variant_type_identifier<K>(), GodotTypeInfo::Internal::get_variant_type_identifier<V>()));
301+
}
302+
};

core/variant/typed_array.h

Lines changed: 3 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,7 @@
3030

3131
#pragma once
3232

33-
#include "core/object/object.h"
34-
#include "core/variant/array.h"
35-
#include "core/variant/binder_common.h"
36-
#include "core/variant/method_ptrcall.h"
3733
#include "core/variant/type_info.h"
38-
#include "core/variant/variant.h"
3934

4035
template <typename T>
4136
class TypedArray : public Array {
@@ -44,11 +39,8 @@ class TypedArray : public Array {
4439
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type.");
4540
Array::operator=(p_array);
4641
}
47-
_FORCE_INLINE_ TypedArray(const Variant &p_variant) :
48-
TypedArray(Array(p_variant)) {
49-
}
5042
_FORCE_INLINE_ TypedArray(const Array &p_array) {
51-
set_typed(Variant::OBJECT, T::get_class_static(), Variant());
43+
set_typed(GodotTypeInfo::Internal::get_variant_type<T>(), GodotTypeInfo::Internal::get_object_class_name_or_empty<T>(), Variant());
5244
if (is_same_typed(p_array)) {
5345
Array::operator=(p_array);
5446
} else {
@@ -57,176 +49,8 @@ class TypedArray : public Array {
5749
}
5850
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) :
5951
TypedArray(Array(p_init)) {}
60-
_FORCE_INLINE_ TypedArray() {
61-
set_typed(Variant::OBJECT, T::get_class_static(), Variant());
62-
}
63-
};
64-
65-
template <typename T>
66-
struct VariantInternalAccessor<TypedArray<T>> {
67-
static _FORCE_INLINE_ TypedArray<T> get(const Variant *v) { return *VariantInternal::get_array(v); }
68-
static _FORCE_INLINE_ void set(Variant *v, const TypedArray<T> &p_array) { *VariantInternal::get_array(v) = p_array; }
69-
};
70-
template <typename T>
71-
struct VariantInternalAccessor<const TypedArray<T> &> {
72-
static _FORCE_INLINE_ TypedArray<T> get(const Variant *v) { return *VariantInternal::get_array(v); }
73-
static _FORCE_INLINE_ void set(Variant *v, const TypedArray<T> &p_array) { *VariantInternal::get_array(v) = p_array; }
74-
};
75-
76-
//specialization for the rest of variant types
77-
78-
#define MAKE_TYPED_ARRAY(m_type, m_variant_type) \
79-
template <> \
80-
class TypedArray<m_type> : public Array { \
81-
public: \
82-
_FORCE_INLINE_ void operator=(const Array &p_array) { \
83-
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
84-
Array::operator=(p_array); \
85-
} \
86-
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) : \
87-
Array(Array(p_init), m_variant_type, StringName(), Variant()) { \
88-
} \
89-
_FORCE_INLINE_ TypedArray(const Variant &p_variant) : \
90-
TypedArray(Array(p_variant)) { \
91-
} \
92-
_FORCE_INLINE_ TypedArray(const Array &p_array) { \
93-
set_typed(m_variant_type, StringName(), Variant()); \
94-
if (is_same_typed(p_array)) { \
95-
Array::operator=(p_array); \
96-
} else { \
97-
assign(p_array); \
98-
} \
99-
} \
100-
_FORCE_INLINE_ TypedArray() { \
101-
set_typed(m_variant_type, StringName(), Variant()); \
102-
} \
103-
};
10452

105-
// All Variant::OBJECT types are intentionally omitted from this list because they are handled by
106-
// the unspecialized TypedArray definition.
107-
MAKE_TYPED_ARRAY(bool, Variant::BOOL)
108-
MAKE_TYPED_ARRAY(uint8_t, Variant::INT)
109-
MAKE_TYPED_ARRAY(int8_t, Variant::INT)
110-
MAKE_TYPED_ARRAY(uint16_t, Variant::INT)
111-
MAKE_TYPED_ARRAY(int16_t, Variant::INT)
112-
MAKE_TYPED_ARRAY(uint32_t, Variant::INT)
113-
MAKE_TYPED_ARRAY(int32_t, Variant::INT)
114-
MAKE_TYPED_ARRAY(uint64_t, Variant::INT)
115-
MAKE_TYPED_ARRAY(int64_t, Variant::INT)
116-
MAKE_TYPED_ARRAY(float, Variant::FLOAT)
117-
MAKE_TYPED_ARRAY(double, Variant::FLOAT)
118-
MAKE_TYPED_ARRAY(String, Variant::STRING)
119-
MAKE_TYPED_ARRAY(Vector2, Variant::VECTOR2)
120-
MAKE_TYPED_ARRAY(Vector2i, Variant::VECTOR2I)
121-
MAKE_TYPED_ARRAY(Rect2, Variant::RECT2)
122-
MAKE_TYPED_ARRAY(Rect2i, Variant::RECT2I)
123-
MAKE_TYPED_ARRAY(Vector3, Variant::VECTOR3)
124-
MAKE_TYPED_ARRAY(Vector3i, Variant::VECTOR3I)
125-
MAKE_TYPED_ARRAY(Transform2D, Variant::TRANSFORM2D)
126-
MAKE_TYPED_ARRAY(Vector4, Variant::VECTOR4)
127-
MAKE_TYPED_ARRAY(Vector4i, Variant::VECTOR4I)
128-
MAKE_TYPED_ARRAY(Plane, Variant::PLANE)
129-
MAKE_TYPED_ARRAY(Quaternion, Variant::QUATERNION)
130-
MAKE_TYPED_ARRAY(AABB, Variant::AABB)
131-
MAKE_TYPED_ARRAY(Basis, Variant::BASIS)
132-
MAKE_TYPED_ARRAY(Transform3D, Variant::TRANSFORM3D)
133-
MAKE_TYPED_ARRAY(Projection, Variant::PROJECTION)
134-
MAKE_TYPED_ARRAY(Color, Variant::COLOR)
135-
MAKE_TYPED_ARRAY(StringName, Variant::STRING_NAME)
136-
MAKE_TYPED_ARRAY(NodePath, Variant::NODE_PATH)
137-
MAKE_TYPED_ARRAY(RID, Variant::RID)
138-
MAKE_TYPED_ARRAY(Callable, Variant::CALLABLE)
139-
MAKE_TYPED_ARRAY(Signal, Variant::SIGNAL)
140-
MAKE_TYPED_ARRAY(Dictionary, Variant::DICTIONARY)
141-
MAKE_TYPED_ARRAY(Array, Variant::ARRAY)
142-
MAKE_TYPED_ARRAY(PackedByteArray, Variant::PACKED_BYTE_ARRAY)
143-
MAKE_TYPED_ARRAY(PackedInt32Array, Variant::PACKED_INT32_ARRAY)
144-
MAKE_TYPED_ARRAY(PackedInt64Array, Variant::PACKED_INT64_ARRAY)
145-
MAKE_TYPED_ARRAY(PackedFloat32Array, Variant::PACKED_FLOAT32_ARRAY)
146-
MAKE_TYPED_ARRAY(PackedFloat64Array, Variant::PACKED_FLOAT64_ARRAY)
147-
MAKE_TYPED_ARRAY(PackedStringArray, Variant::PACKED_STRING_ARRAY)
148-
MAKE_TYPED_ARRAY(PackedVector2Array, Variant::PACKED_VECTOR2_ARRAY)
149-
MAKE_TYPED_ARRAY(PackedVector3Array, Variant::PACKED_VECTOR3_ARRAY)
150-
MAKE_TYPED_ARRAY(PackedColorArray, Variant::PACKED_COLOR_ARRAY)
151-
MAKE_TYPED_ARRAY(PackedVector4Array, Variant::PACKED_VECTOR4_ARRAY)
152-
MAKE_TYPED_ARRAY(IPAddress, Variant::STRING)
153-
154-
template <typename T>
155-
struct PtrToArg<TypedArray<T>> {
156-
_FORCE_INLINE_ static TypedArray<T> convert(const void *p_ptr) {
157-
return TypedArray<T>(*reinterpret_cast<const Array *>(p_ptr));
158-
}
159-
typedef Array EncodeT;
160-
_FORCE_INLINE_ static void encode(TypedArray<T> p_val, void *p_ptr) {
161-
*(Array *)p_ptr = p_val;
162-
}
163-
};
164-
165-
template <typename T>
166-
struct GetTypeInfo<TypedArray<T>> {
167-
static const Variant::Type VARIANT_TYPE = Variant::ARRAY;
168-
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE;
169-
static inline PropertyInfo get_class_info() {
170-
return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, T::get_class_static());
53+
_FORCE_INLINE_ TypedArray() {
54+
set_typed(GodotTypeInfo::Internal::get_variant_type<T>(), GodotTypeInfo::Internal::get_object_class_name_or_empty<T>(), Variant());
17155
}
17256
};
173-
174-
#define MAKE_TYPED_ARRAY_INFO(m_type, m_variant_type) \
175-
template <> \
176-
struct GetTypeInfo<TypedArray<m_type>> { \
177-
static const Variant::Type VARIANT_TYPE = Variant::ARRAY; \
178-
static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; \
179-
static inline PropertyInfo get_class_info() { \
180-
return PropertyInfo(Variant::ARRAY, String(), PROPERTY_HINT_ARRAY_TYPE, Variant::get_type_name(m_variant_type)); \
181-
} \
182-
};
183-
184-
MAKE_TYPED_ARRAY_INFO(bool, Variant::BOOL)
185-
MAKE_TYPED_ARRAY_INFO(uint8_t, Variant::INT)
186-
MAKE_TYPED_ARRAY_INFO(int8_t, Variant::INT)
187-
MAKE_TYPED_ARRAY_INFO(uint16_t, Variant::INT)
188-
MAKE_TYPED_ARRAY_INFO(int16_t, Variant::INT)
189-
MAKE_TYPED_ARRAY_INFO(uint32_t, Variant::INT)
190-
MAKE_TYPED_ARRAY_INFO(int32_t, Variant::INT)
191-
MAKE_TYPED_ARRAY_INFO(uint64_t, Variant::INT)
192-
MAKE_TYPED_ARRAY_INFO(int64_t, Variant::INT)
193-
MAKE_TYPED_ARRAY_INFO(float, Variant::FLOAT)
194-
MAKE_TYPED_ARRAY_INFO(double, Variant::FLOAT)
195-
MAKE_TYPED_ARRAY_INFO(String, Variant::STRING)
196-
MAKE_TYPED_ARRAY_INFO(Vector2, Variant::VECTOR2)
197-
MAKE_TYPED_ARRAY_INFO(Vector2i, Variant::VECTOR2I)
198-
MAKE_TYPED_ARRAY_INFO(Rect2, Variant::RECT2)
199-
MAKE_TYPED_ARRAY_INFO(Rect2i, Variant::RECT2I)
200-
MAKE_TYPED_ARRAY_INFO(Vector3, Variant::VECTOR3)
201-
MAKE_TYPED_ARRAY_INFO(Vector3i, Variant::VECTOR3I)
202-
MAKE_TYPED_ARRAY_INFO(Transform2D, Variant::TRANSFORM2D)
203-
MAKE_TYPED_ARRAY_INFO(Vector4, Variant::VECTOR4)
204-
MAKE_TYPED_ARRAY_INFO(Vector4i, Variant::VECTOR4I)
205-
MAKE_TYPED_ARRAY_INFO(Plane, Variant::PLANE)
206-
MAKE_TYPED_ARRAY_INFO(Quaternion, Variant::QUATERNION)
207-
MAKE_TYPED_ARRAY_INFO(AABB, Variant::AABB)
208-
MAKE_TYPED_ARRAY_INFO(Basis, Variant::BASIS)
209-
MAKE_TYPED_ARRAY_INFO(Transform3D, Variant::TRANSFORM3D)
210-
MAKE_TYPED_ARRAY_INFO(Projection, Variant::PROJECTION)
211-
MAKE_TYPED_ARRAY_INFO(Color, Variant::COLOR)
212-
MAKE_TYPED_ARRAY_INFO(StringName, Variant::STRING_NAME)
213-
MAKE_TYPED_ARRAY_INFO(NodePath, Variant::NODE_PATH)
214-
MAKE_TYPED_ARRAY_INFO(RID, Variant::RID)
215-
MAKE_TYPED_ARRAY_INFO(Callable, Variant::CALLABLE)
216-
MAKE_TYPED_ARRAY_INFO(Signal, Variant::SIGNAL)
217-
MAKE_TYPED_ARRAY_INFO(Dictionary, Variant::DICTIONARY)
218-
MAKE_TYPED_ARRAY_INFO(Array, Variant::ARRAY)
219-
MAKE_TYPED_ARRAY_INFO(PackedByteArray, Variant::PACKED_BYTE_ARRAY)
220-
MAKE_TYPED_ARRAY_INFO(PackedInt32Array, Variant::PACKED_INT32_ARRAY)
221-
MAKE_TYPED_ARRAY_INFO(PackedInt64Array, Variant::PACKED_INT64_ARRAY)
222-
MAKE_TYPED_ARRAY_INFO(PackedFloat32Array, Variant::PACKED_FLOAT32_ARRAY)
223-
MAKE_TYPED_ARRAY_INFO(PackedFloat64Array, Variant::PACKED_FLOAT64_ARRAY)
224-
MAKE_TYPED_ARRAY_INFO(PackedStringArray, Variant::PACKED_STRING_ARRAY)
225-
MAKE_TYPED_ARRAY_INFO(PackedVector2Array, Variant::PACKED_VECTOR2_ARRAY)
226-
MAKE_TYPED_ARRAY_INFO(PackedVector3Array, Variant::PACKED_VECTOR3_ARRAY)
227-
MAKE_TYPED_ARRAY_INFO(PackedColorArray, Variant::PACKED_COLOR_ARRAY)
228-
MAKE_TYPED_ARRAY_INFO(PackedVector4Array, Variant::PACKED_VECTOR4_ARRAY)
229-
MAKE_TYPED_ARRAY_INFO(IPAddress, Variant::STRING)
230-
231-
#undef MAKE_TYPED_ARRAY
232-
#undef MAKE_TYPED_ARRAY_INFO

0 commit comments

Comments
 (0)