Procházet zdrojové kódy

Merge pull request #1399 from bruvzg/init_list

[Packed*Array] Add support for initializer lists.
David Snopek před 1 rokem
rodič
revize
e6b6df5893
4 změnil soubory, kde provedl 27 přidání a 0 odebrání
  1. 15 0
      binding_generator.py
  2. 1 0
      test/project/main.gd
  3. 10 0
      test/src/example.cpp
  4. 1 0
      test/src/example.h

+ 15 - 0
binding_generator.py

@@ -542,6 +542,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
     if class_name == "PackedVector3Array":
         result.append("#include <godot_cpp/variant/vector3.hpp>")
 
+    if is_packed_array(class_name):
+        result.append("#include <godot_cpp/core/error_macros.hpp>")
+        result.append("#include <initializer_list>")
+
     if class_name == "Array":
         result.append("#include <godot_cpp/variant/array_helpers.hpp>")
 
@@ -869,6 +873,17 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
 	}
 """
         result.append(iterators.replace("$TYPE", return_type))
+        init_list = """
+    _FORCE_INLINE_ $CLASS(std::initializer_list<$TYPE> p_init) {
+		ERR_FAIL_COND(resize(p_init.size()) != 0);
+
+		size_t i = 0;
+		for (const $TYPE &element : p_init) {
+			set(i++, element);
+		}
+	}
+"""
+        result.append(init_list.replace("$TYPE", return_type).replace("$CLASS", class_name))
 
     if class_name == "Array":
         result.append("\tconst Variant &operator[](int64_t p_index) const;")

+ 1 - 0
test/project/main.gd

@@ -154,6 +154,7 @@ func _ready():
 
 	# PackedArray iterators
 	assert_equal(example.test_vector_ops(), 105)
+	assert_equal(example.test_vector_init_list(), 105)
 
 	# Properties.
 	assert_equal(example.group_subgroup_custom_position, Vector2(0, 0))

+ 10 - 0
test/src/example.cpp

@@ -197,6 +197,7 @@ void Example::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("test_string_is_fourty_two"), &Example::test_string_is_fourty_two);
 	ClassDB::bind_method(D_METHOD("test_string_resize"), &Example::test_string_resize);
 	ClassDB::bind_method(D_METHOD("test_vector_ops"), &Example::test_vector_ops);
+	ClassDB::bind_method(D_METHOD("test_vector_init_list"), &Example::test_vector_init_list);
 
 	ClassDB::bind_method(D_METHOD("test_object_cast_to_node", "object"), &Example::test_object_cast_to_node);
 	ClassDB::bind_method(D_METHOD("test_object_cast_to_control", "object"), &Example::test_object_cast_to_control);
@@ -411,6 +412,15 @@ int Example::test_vector_ops() const {
 	return ret;
 }
 
+int Example::test_vector_init_list() const {
+	PackedInt32Array arr = { 10, 20, 30, 45 };
+	int ret = 0;
+	for (const int32_t &E : arr) {
+		ret += E;
+	}
+	return ret;
+}
+
 Callable Example::test_callable_mp() {
 	return callable_mp(this, &Example::unbound_method1);
 }

+ 1 - 0
test/src/example.h

@@ -130,6 +130,7 @@ public:
 	bool test_string_is_fourty_two(const String &p_str) const;
 	String test_string_resize(String p_original) const;
 	int test_vector_ops() const;
+	int test_vector_init_list() const;
 
 	bool test_object_cast_to_node(Object *p_object) const;
 	bool test_object_cast_to_control(Object *p_object) const;