Skip to content

Commit 69c53a3

Browse files
committed
Add support for initializer_list to Array and TypedArray
1 parent f3deed0 commit 69c53a3

File tree

3 files changed

+112
-1
lines changed

3 files changed

+112
-1
lines changed

binding_generator.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
541541
result.append("#include <godot_cpp/variant/vector4.hpp>")
542542
result.append("")
543543

544-
if is_packed_array(class_name):
544+
if is_packed_array(class_name) or class_name == "Array":
545545
result.append("#include <godot_cpp/core/error_macros.hpp>")
546546
result.append("#include <initializer_list>")
547547
result.append("")
@@ -907,6 +907,53 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
907907
result.append("\tVariant &operator[](int64_t p_index);")
908908
result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);")
909909
result.append("\tvoid _ref(const Array &p_from) const;")
910+
result.append("""
911+
struct Iterator {
912+
_FORCE_INLINE_ Variant &operator*() const;
913+
_FORCE_INLINE_ Variant *operator->() const;
914+
_FORCE_INLINE_ Iterator &operator++();
915+
_FORCE_INLINE_ Iterator &operator--();
916+
917+
_FORCE_INLINE_ bool operator==(const Iterator &b) const { return elem_ptr == b.elem_ptr; }
918+
_FORCE_INLINE_ bool operator!=(const Iterator &b) const { return elem_ptr != b.elem_ptr; }
919+
920+
Iterator(Variant *p_ptr) { elem_ptr = p_ptr; }
921+
Iterator() {}
922+
Iterator(const Iterator &p_it) { elem_ptr = p_it.elem_ptr; }
923+
924+
private:
925+
Variant *elem_ptr = nullptr;
926+
};
927+
928+
struct ConstIterator {
929+
_FORCE_INLINE_ const Variant &operator*() const;
930+
_FORCE_INLINE_ const Variant *operator->() const;
931+
_FORCE_INLINE_ ConstIterator &operator++();
932+
_FORCE_INLINE_ ConstIterator &operator--();
933+
934+
_FORCE_INLINE_ bool operator==(const ConstIterator &b) const { return elem_ptr == b.elem_ptr; }
935+
_FORCE_INLINE_ bool operator!=(const ConstIterator &b) const { return elem_ptr != b.elem_ptr; }
936+
937+
ConstIterator(const Variant *p_ptr) { elem_ptr = p_ptr; }
938+
ConstIterator() {}
939+
ConstIterator(const ConstIterator &p_it) { elem_ptr = p_it.elem_ptr; }
940+
941+
private:
942+
const Variant *elem_ptr = nullptr;
943+
};
944+
945+
_FORCE_INLINE_ Iterator begin();
946+
_FORCE_INLINE_ Iterator end();
947+
948+
_FORCE_INLINE_ ConstIterator begin() const;
949+
_FORCE_INLINE_ ConstIterator end() const;
950+
""")
951+
result.append("\t_FORCE_INLINE_ Array(std::initializer_list<Variant> p_init);")
952+
result.append("")
953+
result.append("\tprotected:")
954+
result.append("")
955+
result.append("\tconst Variant *ptr() const;")
956+
result.append("\tVariant *ptrw();")
910957

911958
if class_name == "Dictionary":
912959
result.append("\tconst Variant &operator[](const Variant &p_key) const;")

include/godot_cpp/variant/typed_array.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class TypedArray : public Array {
5353
assign(p_array);
5454
}
5555
}
56+
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) :
57+
TypedArray(Array(p_init)) {}
5658
_FORCE_INLINE_ TypedArray() {
5759
set_typed(Variant::OBJECT, T::get_class_static(), Variant());
5860
}
@@ -68,6 +70,9 @@ class TypedArray : public Array {
6870
ERR_FAIL_COND_MSG(!is_same_typed(p_array), "Cannot assign an array with a different element type."); \
6971
_ref(p_array); \
7072
} \
73+
_FORCE_INLINE_ TypedArray(std::initializer_list<Variant> p_init) : \
74+
Array(Array(p_init), m_variant_type, StringName(), Variant()) { \
75+
} \
7176
_FORCE_INLINE_ TypedArray(const Variant &p_variant) : \
7277
TypedArray(Array(p_variant)) { \
7378
} \

include/godot_cpp/variant/variant.hpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,65 @@ String vformat(const String &p_text, const VarArgs... p_args) {
357357
return p_text % args_array;
358358
}
359359

360+
Variant &Array::Iterator::operator*() const {
361+
return *elem_ptr;
362+
}
363+
364+
Variant *Array::Iterator::operator->() const {
365+
return elem_ptr;
366+
}
367+
368+
Array::Iterator &Array::Iterator::operator++() {
369+
elem_ptr++;
370+
return *this;
371+
}
372+
373+
Array::Iterator &Array::Iterator::operator--() {
374+
elem_ptr--;
375+
return *this;
376+
}
377+
378+
const Variant &Array::ConstIterator::operator*() const {
379+
return *elem_ptr;
380+
}
381+
382+
const Variant *Array::ConstIterator::operator->() const {
383+
return elem_ptr;
384+
}
385+
386+
Array::ConstIterator &Array::ConstIterator::operator++() {
387+
elem_ptr++;
388+
return *this;
389+
}
390+
391+
Array::ConstIterator &Array::ConstIterator::operator--() {
392+
elem_ptr--;
393+
return *this;
394+
}
395+
396+
Array::Iterator Array::begin() {
397+
return Array::Iterator(ptrw());
398+
}
399+
Array::Iterator Array::end() {
400+
return Array::Iterator(ptrw() + size());
401+
}
402+
403+
Array::ConstIterator Array::begin() const {
404+
return Array::ConstIterator(ptr());
405+
}
406+
Array::ConstIterator Array::end() const {
407+
return Array::ConstIterator(ptr() + size());
408+
}
409+
410+
Array::Array(std::initializer_list<Variant> p_init) {
411+
ERR_FAIL_COND(resize(p_init.size()) != 0);
412+
413+
size_t i = 0;
414+
for (const Variant &element : p_init) {
415+
set(i++, element);
416+
}
417+
}
418+
360419
#include <godot_cpp/variant/builtin_vararg_methods.hpp>
361420

362421
#ifdef REAL_T_IS_DOUBLE

0 commit comments

Comments
 (0)