From cb17798df3ef1ea6135acdf42b25af61177e4864 Mon Sep 17 00:00:00 2001 From: kit Date: Sun, 10 Dec 2023 17:54:35 -0500 Subject: [PATCH] Add Array and Variant list inializer --- core/variant/array.cpp | 6 ++++++ core/variant/array.h | 2 ++ core/variant/typed_array.h | 3 +++ core/variant/variant.cpp | 5 +++++ core/variant/variant.h | 1 + tests/core/variant/test_array.h | 20 ++++++++++++++++++++ tests/core/variant/test_variant.h | 18 ++++++++++++++++++ 7 files changed, 55 insertions(+) diff --git a/core/variant/array.cpp b/core/variant/array.cpp index 3685515db5b..8472590300b 100644 --- a/core/variant/array.cpp +++ b/core/variant/array.cpp @@ -830,6 +830,12 @@ Array::Array(const Array &p_from) { _ref(p_from); } +Array::Array(std::initializer_list p_init) { + _p = memnew(ArrayPrivate); + _p->refcount.init(); + _p->array = Vector(p_init); +} + Array::Array() { _p = memnew(ArrayPrivate); _p->refcount.init(); diff --git a/core/variant/array.h b/core/variant/array.h index 3aa957b3126..c32e460447d 100644 --- a/core/variant/array.h +++ b/core/variant/array.h @@ -34,6 +34,7 @@ #include "core/typedefs.h" #include +#include class Variant; class ArrayPrivate; @@ -195,6 +196,7 @@ public: Array(const Array &p_base, uint32_t p_type, const StringName &p_class_name, const Variant &p_script); Array(const Array &p_from); + Array(std::initializer_list p_init); Array(); ~Array(); }; diff --git a/core/variant/typed_array.h b/core/variant/typed_array.h index 0befd198648..53e031657f6 100644 --- a/core/variant/typed_array.h +++ b/core/variant/typed_array.h @@ -77,6 +77,9 @@ struct VariantInternalAccessor &> { ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \ _ref(p_array); \ } \ + _FORCE_INLINE_ TypedArray(std::initializer_list p_init) : \ + Array(Array(p_init), m_variant_type, StringName(), Variant()) { \ + } \ _FORCE_INLINE_ TypedArray(const Variant &p_variant) : \ Array(Array(p_variant), m_variant_type, StringName(), Variant()) { \ } \ diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index 37eb16f9b2d..b7e40eec124 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -2585,6 +2585,11 @@ Variant::Variant(const Dictionary &p_dictionary) : memnew_placement(_data._mem, Dictionary(p_dictionary)); } +Variant::Variant(std::initializer_list p_init) : + type(ARRAY) { + memnew_placement(_data._mem, Array(p_init)); +} + Variant::Variant(const Array &p_array) : type(ARRAY) { memnew_placement(_data._mem, Array(p_array)); diff --git a/core/variant/variant.h b/core/variant/variant.h index 93953c4e0e1..9d9fbc2b260 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -464,6 +464,7 @@ public: Variant(const Signal &p_signal); Variant(const Dictionary &p_dictionary); + Variant(std::initializer_list p_init); Variant(const Array &p_array); Variant(const PackedByteArray &p_byte_array); Variant(const PackedInt32Array &p_int32_array); diff --git a/tests/core/variant/test_array.h b/tests/core/variant/test_array.h index c54854e4d72..3430ab4802b 100644 --- a/tests/core/variant/test_array.h +++ b/tests/core/variant/test_array.h @@ -56,6 +56,26 @@ static inline Dictionary build_dictionary(Variant key, Variant item, Targs... Fa return d; } +TEST_CASE("[Array] initializer list") { + Array arr = { 0, 1, "test", true, { 0.0, 1.0 } }; + CHECK(arr.size() == 5); + CHECK(arr[0] == Variant(0)); + CHECK(arr[1] == Variant(1)); + CHECK(arr[2] == Variant("test")); + CHECK(arr[3] == Variant(true)); + CHECK(arr[4] == Variant({ 0.0, 1.0 })); + + arr = { "reassign" }; + CHECK(arr.size() == 1); + CHECK(arr[0] == Variant("reassign")); + + TypedArray typed_arr = { 0, 1, 2 }; + CHECK(typed_arr.size() == 3); + CHECK(typed_arr[0] == Variant(0)); + CHECK(typed_arr[1] == Variant(1)); + CHECK(typed_arr[2] == Variant(2)); +} + TEST_CASE("[Array] size(), clear(), and is_empty()") { Array arr; CHECK(arr.size() == 0); diff --git a/tests/core/variant/test_variant.h b/tests/core/variant/test_variant.h index 54ca06c6c42..d72f1dc9891 100644 --- a/tests/core/variant/test_variant.h +++ b/tests/core/variant/test_variant.h @@ -1737,6 +1737,24 @@ TEST_CASE("[Variant] Assignment To Color from Bool,Int,Float,String,Vec2,Vec2i,V CHECK(object_v.get_type() == Variant::COLOR); } +TEST_CASE("[Variant] array initializer list") { + Variant arr_v = { 0, 1, "test", true, { 0.0, 1.0 } }; + CHECK(arr_v.get_type() == Variant::ARRAY); + Array arr = (Array)arr_v; + CHECK(arr.size() == 5); + CHECK(arr[0] == Variant(0)); + CHECK(arr[1] == Variant(1)); + CHECK(arr[2] == Variant("test")); + CHECK(arr[3] == Variant(true)); + CHECK(arr[4] == Variant({ 0.0, 1.0 })); + + PackedInt32Array packed_arr = { 2, 1, 0 }; + CHECK(packed_arr.size() == 3); + CHECK(packed_arr[0] == 2); + CHECK(packed_arr[1] == 1); + CHECK(packed_arr[2] == 0); +} + TEST_CASE("[Variant] Writer and parser array") { Array a = build_array(1, String("hello"), build_array(Variant())); String a_str;