Skip to content

Commit a2c37f8

Browse files
committed
Made the Array's ptr and ptrw methods private
1 parent f3deed0 commit a2c37f8

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

binding_generator.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,11 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
642642
result.append("")
643643
result.append(f"\t{class_name}(const Variant *p_variant);")
644644

645+
if class_name == "Array":
646+
result.append("")
647+
result.append("\tconst Variant *ptr() const;")
648+
result.append("\tVariant *ptrw();")
649+
645650
result.append("")
646651
result.append("public:")
647652

@@ -907,6 +912,47 @@ def generate_builtin_class_header(builtin_api, size, used_classes, fully_used_cl
907912
result.append("\tVariant &operator[](int64_t p_index);")
908913
result.append("\tvoid set_typed(uint32_t p_type, const StringName &p_class_name, const Variant &p_script);")
909914
result.append("\tvoid _ref(const Array &p_from) const;")
915+
result.append("""
916+
struct Iterator {
917+
_FORCE_INLINE_ Variant &operator*() const;
918+
_FORCE_INLINE_ Variant *operator->() const;
919+
_FORCE_INLINE_ Iterator &operator++();
920+
_FORCE_INLINE_ Iterator &operator--();
921+
922+
_FORCE_INLINE_ bool operator==(const Iterator &b) const { return elem_ptr == b.elem_ptr; }
923+
_FORCE_INLINE_ bool operator!=(const Iterator &b) const { return elem_ptr != b.elem_ptr; }
924+
925+
Iterator(Variant *p_ptr) { elem_ptr = p_ptr; }
926+
Iterator() {}
927+
Iterator(const Iterator &p_it) { elem_ptr = p_it.elem_ptr; }
928+
929+
private:
930+
Variant *elem_ptr = nullptr;
931+
};
932+
933+
struct ConstIterator {
934+
_FORCE_INLINE_ const Variant &operator*() const;
935+
_FORCE_INLINE_ const Variant *operator->() const;
936+
_FORCE_INLINE_ ConstIterator &operator++();
937+
_FORCE_INLINE_ ConstIterator &operator--();
938+
939+
_FORCE_INLINE_ bool operator==(const ConstIterator &b) const { return elem_ptr == b.elem_ptr; }
940+
_FORCE_INLINE_ bool operator!=(const ConstIterator &b) const { return elem_ptr != b.elem_ptr; }
941+
942+
ConstIterator(const Variant *p_ptr) { elem_ptr = p_ptr; }
943+
ConstIterator() {}
944+
ConstIterator(const ConstIterator &p_it) { elem_ptr = p_it.elem_ptr; }
945+
946+
private:
947+
const Variant *elem_ptr = nullptr;
948+
};
949+
950+
_FORCE_INLINE_ Iterator begin();
951+
_FORCE_INLINE_ Iterator end();
952+
953+
_FORCE_INLINE_ ConstIterator begin() const;
954+
_FORCE_INLINE_ ConstIterator end() const;
955+
""")
910956

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

include/godot_cpp/variant/variant.hpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include <godot_cpp/core/defs.hpp>
3434

35+
#include <godot_cpp/variant/array.hpp>
3536
#include <godot_cpp/variant/builtin_types.hpp>
3637
#include <godot_cpp/variant/variant_size.hpp>
3738

@@ -357,6 +358,56 @@ String vformat(const String &p_text, const VarArgs... p_args) {
357358
return p_text % args_array;
358359
}
359360

361+
Variant &Array::Iterator::operator*() const {
362+
return *elem_ptr;
363+
}
364+
365+
Variant *Array::Iterator::operator->() const {
366+
return elem_ptr;
367+
}
368+
369+
Array::Iterator &Array::Iterator::operator++() {
370+
elem_ptr++;
371+
return *this;
372+
}
373+
374+
Array::Iterator &Array::Iterator::operator--() {
375+
elem_ptr--;
376+
return *this;
377+
}
378+
379+
const Variant &Array::ConstIterator::operator*() const {
380+
return *elem_ptr;
381+
}
382+
383+
const Variant *Array::ConstIterator::operator->() const {
384+
return elem_ptr;
385+
}
386+
387+
Array::ConstIterator &Array::ConstIterator::operator++() {
388+
elem_ptr++;
389+
return *this;
390+
}
391+
392+
Array::ConstIterator &Array::ConstIterator::operator--() {
393+
elem_ptr--;
394+
return *this;
395+
}
396+
397+
Array::Iterator Array::begin() {
398+
return Array::Iterator(ptrw());
399+
}
400+
Array::Iterator Array::end() {
401+
return Array::Iterator(ptrw() + size());
402+
}
403+
404+
Array::ConstIterator Array::begin() const {
405+
return Array::ConstIterator(ptr());
406+
}
407+
Array::ConstIterator Array::end() const {
408+
return Array::ConstIterator(ptr() + size());
409+
}
410+
360411
#include <godot_cpp/variant/builtin_vararg_methods.hpp>
361412

362413
#ifdef REAL_T_IS_DOUBLE

src/variant/packed_arrays.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,14 @@ void Array::_ref(const Array &p_from) const {
236236
internal::gdextension_interface_array_ref((GDExtensionTypePtr *)this, (GDExtensionConstTypePtr *)&p_from);
237237
}
238238

239+
const Variant *Array::ptr() const {
240+
return (const Variant *)internal::gdextension_interface_array_operator_index_const((GDExtensionTypePtr *)this, 0);
241+
}
242+
243+
Variant *Array::ptrw() {
244+
return (Variant *)internal::gdextension_interface_array_operator_index((GDExtensionTypePtr *)this, 0);
245+
}
246+
239247
const Variant &Dictionary::operator[](const Variant &p_key) const {
240248
const Variant *var = (const Variant *)internal::gdextension_interface_dictionary_operator_index_const((GDExtensionTypePtr *)this, (GDExtensionVariantPtr)&p_key);
241249
return *var;

0 commit comments

Comments
 (0)