Skip to content

Commit 8c98a90

Browse files
committed
[Packed*Array] Add support for initializer lists.
1 parent e55b792 commit 8c98a90

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed

binding_generator.py

+15
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,10 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
545545
if class_name == "PackedVector3Array":
546546
result.append("#include <godot_cpp/variant/vector3.hpp>")
547547

548+
if is_packed_array(class_name):
549+
result.append("#include <godot_cpp/core/error_macros.hpp>")
550+
result.append("#include <initializer_list>")
551+
548552
if class_name == "Array":
549553
result.append("#include <godot_cpp/variant/array_helpers.hpp>")
550554

@@ -872,6 +876,17 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
872876
}
873877
"""
874878
result.append(iterators.replace("$TYPE", return_type))
879+
init_list = """
880+
_FORCE_INLINE_ $CLASS(std::initializer_list<$TYPE> p_init) {
881+
ERR_FAIL_COND(resize(p_init.size()) != 0);
882+
883+
size_t i = 0;
884+
for (const $TYPE &element : p_init) {
885+
set(i++, element);
886+
}
887+
}
888+
"""
889+
result.append(init_list.replace("$TYPE", return_type).replace("$CLASS", class_name))
875890

876891
if class_name == "Array":
877892
result.append("\tconst Variant &operator[](int64_t p_index) const;")

test/project/main.gd

+1
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func _ready():
154154

155155
# PackedArray iterators
156156
assert_equal(example.test_vector_ops(), 105)
157+
assert_equal(example.test_vector_init_list(), 105)
157158

158159
# Properties.
159160
assert_equal(example.group_subgroup_custom_position, Vector2(0, 0))

test/src/example.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ void Example::_bind_methods() {
197197
ClassDB::bind_method(D_METHOD("test_string_is_fourty_two"), &Example::test_string_is_fourty_two);
198198
ClassDB::bind_method(D_METHOD("test_string_resize"), &Example::test_string_resize);
199199
ClassDB::bind_method(D_METHOD("test_vector_ops"), &Example::test_vector_ops);
200+
ClassDB::bind_method(D_METHOD("test_vector_init_list"), &Example::test_vector_init_list);
200201

201202
ClassDB::bind_method(D_METHOD("test_object_cast_to_node", "object"), &Example::test_object_cast_to_node);
202203
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 {
411412
return ret;
412413
}
413414

415+
int Example::test_vector_init_list() const {
416+
PackedInt32Array arr = { 10, 20, 30, 45 };
417+
int ret = 0;
418+
for (const int32_t &E : arr) {
419+
ret += E;
420+
}
421+
return ret;
422+
}
423+
414424
Callable Example::test_callable_mp() {
415425
return callable_mp(this, &Example::unbound_method1);
416426
}

test/src/example.h

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ class Example : public Control {
130130
bool test_string_is_fourty_two(const String &p_str) const;
131131
String test_string_resize(String p_original) const;
132132
int test_vector_ops() const;
133+
int test_vector_init_list() const;
133134

134135
bool test_object_cast_to_node(Object *p_object) const;
135136
bool test_object_cast_to_control(Object *p_object) const;

0 commit comments

Comments
 (0)