Browse Source

Merge pull request #1716 from tomfull123/master

Add support for `initializer_list` to Array and TypedArray
David Snopek 4 months ago
parent
commit
478e2637bd

+ 2 - 1
binding_generator.py

@@ -541,7 +541,7 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
         result.append("#include <godot_cpp/variant/vector4.hpp>")
         result.append("#include <godot_cpp/variant/vector4.hpp>")
         result.append("")
         result.append("")
 
 
-    if is_packed_array(class_name):
+    if is_packed_array(class_name) or class_name == "Array":
         result.append("#include <godot_cpp/core/error_macros.hpp>")
         result.append("#include <godot_cpp/core/error_macros.hpp>")
         result.append("#include <initializer_list>")
         result.append("#include <initializer_list>")
         result.append("")
         result.append("")
@@ -953,6 +953,7 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
 	_FORCE_INLINE_ ConstIterator begin() const;
 	_FORCE_INLINE_ ConstIterator begin() const;
 	_FORCE_INLINE_ ConstIterator end() const;
 	_FORCE_INLINE_ ConstIterator end() const;
 	""")
 	""")
+        result.append("\t_FORCE_INLINE_ Array(std::initializer_list<Variant> p_init);")
 
 
     if class_name == "Dictionary":
     if class_name == "Dictionary":
         result.append("\tconst Variant &operator[](const Variant &p_key) const;")
         result.append("\tconst Variant &operator[](const Variant &p_key) const;")

+ 5 - 0
include/godot_cpp/variant/typed_array.hpp

@@ -53,6 +53,8 @@ public:
 			assign(p_array);
 			assign(p_array);
 		}
 		}
 	}
 	}
+	_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) :
+			TypedArray(Array(p_init)) {}
 	_FORCE_INLINE_ TypedArray() {
 	_FORCE_INLINE_ TypedArray() {
 		set_typed(Variant::OBJECT, T::get_class_static(), Variant());
 		set_typed(Variant::OBJECT, T::get_class_static(), Variant());
 	}
 	}
@@ -68,6 +70,9 @@ public:
 			ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
 			ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
 			_ref(p_array);                                                                                       \
 			_ref(p_array);                                                                                       \
 		}                                                                                                        \
 		}                                                                                                        \
+		_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) :                                       \
+				Array(Array(p_init), m_variant_type, StringName(), Variant()) {                                  \
+		}                                                                                                        \
 		_FORCE_INLINE_ TypedArray(const Variant &p_variant) :                                                    \
 		_FORCE_INLINE_ TypedArray(const Variant &p_variant) :                                                    \
 				TypedArray(Array(p_variant)) {                                                                   \
 				TypedArray(Array(p_variant)) {                                                                   \
 		}                                                                                                        \
 		}                                                                                                        \

+ 9 - 0
include/godot_cpp/variant/variant.hpp

@@ -408,6 +408,15 @@ Array::ConstIterator Array::end() const {
 	return Array::ConstIterator(ptr() + size());
 	return Array::ConstIterator(ptr() + size());
 }
 }
 
 
+Array::Array(std::initializer_list<Variant> p_init) {
+	ERR_FAIL_COND(resize(p_init.size()) != 0);
+
+	size_t i = 0;
+	for (const Variant &element : p_init) {
+		set(i++, element);
+	}
+}
+
 #include <godot_cpp/variant/builtin_vararg_methods.hpp>
 #include <godot_cpp/variant/builtin_vararg_methods.hpp>
 
 
 #ifdef REAL_T_IS_DOUBLE
 #ifdef REAL_T_IS_DOUBLE