summaryrefslogtreecommitdiffstats
path: root/core/variant/array.h
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-10 17:49:14 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-10 17:49:14 +0200
commit7670b812333f64b8ef349797cf3e2fb26765502c (patch)
treebbfae7eca9992c0dcdf2ee237dd56f9d742d6c77 /core/variant/array.h
parent1f0f81049fc470fe10ddb64086c94b9c595ec81f (diff)
parent64146cb7f35b57b0974b82845674d58f9f3480b6 (diff)
downloadredot-engine-7670b812333f64b8ef349797cf3e2fb26765502c.tar.gz
Merge pull request #86518 from AThousandShips/array_iter
[Core] Add iteration support to `Array`
Diffstat (limited to 'core/variant/array.h')
-rw-r--r--core/variant/array.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/core/variant/array.h b/core/variant/array.h
index 8b1f8c0678..d45a6887e2 100644
--- a/core/variant/array.h
+++ b/core/variant/array.h
@@ -46,6 +46,70 @@ class Array {
void _unref() const;
public:
+ struct ConstIterator {
+ _FORCE_INLINE_ const Variant &operator*() const;
+ _FORCE_INLINE_ const Variant *operator->() const;
+
+ _FORCE_INLINE_ ConstIterator &operator++();
+ _FORCE_INLINE_ ConstIterator &operator--();
+
+ _FORCE_INLINE_ bool operator==(const ConstIterator &p_other) const { return element_ptr == p_other.element_ptr; }
+ _FORCE_INLINE_ bool operator!=(const ConstIterator &p_other) const { return element_ptr == p_other.element_ptr; }
+
+ _FORCE_INLINE_ ConstIterator(const Variant *p_element_ptr, Variant *p_read_only = nullptr) :
+ element_ptr(p_element_ptr), read_only(p_read_only) {}
+ _FORCE_INLINE_ ConstIterator() {}
+ _FORCE_INLINE_ ConstIterator(const ConstIterator &p_other) :
+ element_ptr(p_other.element_ptr), read_only(p_other.read_only) {}
+
+ _FORCE_INLINE_ ConstIterator &operator=(const ConstIterator &p_other) {
+ element_ptr = p_other.element_ptr;
+ read_only = p_other.read_only;
+ return *this;
+ }
+
+ private:
+ const Variant *element_ptr = nullptr;
+ Variant *read_only = nullptr;
+ };
+
+ struct Iterator {
+ _FORCE_INLINE_ Variant &operator*() const;
+ _FORCE_INLINE_ Variant *operator->() const;
+
+ _FORCE_INLINE_ Iterator &operator++();
+ _FORCE_INLINE_ Iterator &operator--();
+
+ _FORCE_INLINE_ bool operator==(const Iterator &p_other) const { return element_ptr == p_other.element_ptr; }
+ _FORCE_INLINE_ bool operator!=(const Iterator &p_other) const { return element_ptr != p_other.element_ptr; }
+
+ _FORCE_INLINE_ Iterator(Variant *p_element_ptr, Variant *p_read_only = nullptr) :
+ element_ptr(p_element_ptr), read_only(p_read_only) {}
+ _FORCE_INLINE_ Iterator() {}
+ _FORCE_INLINE_ Iterator(const Iterator &p_other) :
+ element_ptr(p_other.element_ptr), read_only(p_other.read_only) {}
+
+ _FORCE_INLINE_ Iterator &operator=(const Iterator &p_other) {
+ element_ptr = p_other.element_ptr;
+ read_only = p_other.read_only;
+ return *this;
+ }
+
+ operator ConstIterator() const {
+ return ConstIterator(element_ptr, read_only);
+ }
+
+ private:
+ Variant *element_ptr = nullptr;
+ Variant *read_only = nullptr;
+ };
+
+ Iterator begin();
+ Iterator end();
+
+ ConstIterator begin() const;
+ ConstIterator end() const;
+
void _ref(const Array &p_from) const;
Variant &operator[](int p_idx);