Skip to content

Commit cb17798

Browse files
committed
Add Array and Variant list inializer
1 parent b9e0223 commit cb17798

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
@@ -830,6 +830,12 @@ Array::Array(const Array &p_from) {
830830
_ref(p_from);
831831
}
832832

833+
Array::Array(std::initializer_list<Variant> p_init) {
834+
_p = memnew(ArrayPrivate);
835+
_p->refcount.init();
836+
_p->array = Vector<Variant>(p_init);
837+
}
838+
833839
Array::Array() {
834840
_p = memnew(ArrayPrivate);
835841
_p->refcount.init();

core/variant/array.h

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

3636
#include <climits>
37+
#include <initializer_list>
3738

3839
class Variant;
3940
class ArrayPrivate;
@@ -195,6 +196,7 @@ class Array {
195196

196197
Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script);
197198
Array(const Array &p_from);
199+
Array(std::initializer_list<Variant> p_init);
198200
Array();
199201
~Array();
200202
};

core/variant/typed_array.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ struct VariantInternalAccessor<const TypedArray<T> &> {
7777
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
7878
_ref(p_array); \
7979
} \
80+
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) : \
81+
Array(Array(p_init), m_variant_type, StringName(), Variant()) { \
82+
} \
8083
_FORCE_INLINE_ TypedArray(const Variant &p_variant) : \
8184
Array(Array(p_variant), m_variant_type, StringName(), Variant()) { \
8285
} \

core/variant/variant.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,6 +2585,11 @@ Variant::Variant(const Dictionary &p_dictionary) :
25852585
memnew_placement(_data._mem, Dictionary(p_dictionary));
25862586
}
25872587

2588+
Variant::Variant(std::initializer_list<Variant> p_init) :
2589+
type(ARRAY) {
2590+
memnew_placement(_data._mem, Array(p_init));
2591+
}
2592+
25882593
Variant::Variant(const Array &p_array) :
25892594
type(ARRAY) {
25902595
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
@@ -464,6 +464,7 @@ class Variant {
464464
Variant(const Signal &p_signal);
465465
Variant(const Dictionary &p_dictionary);
466466

467+
Variant(std::initializer_list<Variant> p_init);
467468
Variant(const Array &p_array);
468469
Variant(const PackedByteArray &p_byte_array);
469470
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
@@ -56,6 +56,26 @@ static inline Dictionary build_dictionary(Variant key, Variant item, Targs... Fa
5656
return d;
5757
}
5858

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

tests/core/variant/test_variant.h

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

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

0 commit comments

Comments
 (0)