Skip to content

Commit f6a35e2

Browse files
committed
Merge pull request godotengine#86015 from kitbdev/array-initializer-list
Add list initialization to Array, Variant, and TypedArray
2 parents db75f8f + cb17798 commit f6a35e2

File tree

7 files changed

+55
-0
lines changed

7 files changed

+55
-0
lines changed

core/variant/array.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,12 @@ Array::Array(const Array &p_from) {
909909
_ref(p_from);
910910
}
911911

912+
Array::Array(std::initializer_list<Variant> p_init) {
913+
_p = memnew(ArrayPrivate);
914+
_p->refcount.init();
915+
_p->array = Vector<Variant>(p_init);
916+
}
917+
912918
Array::Array() {
913919
_p = memnew(ArrayPrivate);
914920
_p->refcount.init();

core/variant/array.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "core/typedefs.h"
3434

3535
#include <climits>
36+
#include <initializer_list>
3637

3738
class Callable;
3839
class StringName;
@@ -201,6 +202,7 @@ class Array {
201202

202203
Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script);
203204
Array(const Array &p_from);
205+
Array(std::initializer_list<Variant> p_init);
204206
Array();
205207
~Array();
206208
};

core/variant/typed_array.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ struct VariantInternalAccessor<const TypedArray<T> &> {
8181
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
8282
_ref(p_array); \
8383
} \
84+
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) : \
85+
Array(Array(p_init), m_variant_type, StringName(), Variant()) { \
86+
} \
8487
_FORCE_INLINE_ TypedArray(const Variant &p_variant) : \
8588
TypedArray(Array(p_variant)) { \
8689
} \

core/variant/variant.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,6 +2529,11 @@ Variant::Variant(const Dictionary &p_dictionary) :
25292529
static_assert(sizeof(Dictionary) <= sizeof(_data._mem));
25302530
}
25312531

2532+
Variant::Variant(std::initializer_list<Variant> p_init) :
2533+
type(ARRAY) {
2534+
memnew_placement(_data._mem, Array(p_init));
2535+
}
2536+
25322537
Variant::Variant(const Array &p_array) :
25332538
type(ARRAY) {
25342539
memnew_placement(_data._mem, Array(p_array));

core/variant/variant.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ class Variant {
526526
Variant(const Signal &p_signal);
527527
Variant(const Dictionary &p_dictionary);
528528

529+
Variant(std::initializer_list<Variant> p_init);
529530
Variant(const Array &p_array);
530531
Variant(const PackedByteArray &p_byte_array);
531532
Variant(const PackedInt32Array &p_int32_array);

tests/core/variant/test_array.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,26 @@ static inline Dictionary build_dictionary(Variant key, Variant item, Targs... Fa
5555
return d;
5656
}
5757

58+
TEST_CASE("[Array] initializer list") {
59+
Array arr = { 0, 1, "test", true, { 0.0, 1.0 } };
60+
CHECK(arr.size() == 5);
61+
CHECK(arr[0] == Variant(0));
62+
CHECK(arr[1] == Variant(1));
63+
CHECK(arr[2] == Variant("test"));
64+
CHECK(arr[3] == Variant(true));
65+
CHECK(arr[4] == Variant({ 0.0, 1.0 }));
66+
67+
arr = { "reassign" };
68+
CHECK(arr.size() == 1);
69+
CHECK(arr[0] == Variant("reassign"));
70+
71+
TypedArray<int> typed_arr = { 0, 1, 2 };
72+
CHECK(typed_arr.size() == 3);
73+
CHECK(typed_arr[0] == Variant(0));
74+
CHECK(typed_arr[1] == Variant(1));
75+
CHECK(typed_arr[2] == Variant(2));
76+
}
77+
5878
TEST_CASE("[Array] size(), clear(), and is_empty()") {
5979
Array arr;
6080
CHECK(arr.size() == 0);

tests/core/variant/test_variant.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,24 @@ TEST_CASE("[Variant] Assignment To Color from Bool,Int,Float,String,Vec2,Vec2i,V
17361736
CHECK(object_v.get_type() == Variant::COLOR);
17371737
}
17381738

1739+
TEST_CASE("[Variant] array initializer list") {
1740+
Variant arr_v = { 0, 1, "test", true, { 0.0, 1.0 } };
1741+
CHECK(arr_v.get_type() == Variant::ARRAY);
1742+
Array arr = (Array)arr_v;
1743+
CHECK(arr.size() == 5);
1744+
CHECK(arr[0] == Variant(0));
1745+
CHECK(arr[1] == Variant(1));
1746+
CHECK(arr[2] == Variant("test"));
1747+
CHECK(arr[3] == Variant(true));
1748+
CHECK(arr[4] == Variant({ 0.0, 1.0 }));
1749+
1750+
PackedInt32Array packed_arr = { 2, 1, 0 };
1751+
CHECK(packed_arr.size() == 3);
1752+
CHECK(packed_arr[0] == 2);
1753+
CHECK(packed_arr[1] == 1);
1754+
CHECK(packed_arr[2] == 0);
1755+
}
1756+
17391757
TEST_CASE("[Variant] Writer and parser array") {
17401758
Array a = build_array(1, String("hello"), build_array(Variant()));
17411759
String a_str;

0 commit comments

Comments
 (0)