From a3e2427017ac637af17d15ef5095285f941e8ea0 Mon Sep 17 00:00:00 2001 From: Username404-59 Date: Sun, 19 Jan 2025 18:32:24 +0100 Subject: [PATCH] ParseComponents.hpp: Add a parent reference wrapper to ParseTree Signed-off-by: Username404-59 --- src/headers/parsing/ParseComponents.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/headers/parsing/ParseComponents.hpp b/src/headers/parsing/ParseComponents.hpp index 0484f10..9095fbe 100644 --- a/src/headers/parsing/ParseComponents.hpp +++ b/src/headers/parsing/ParseComponents.hpp @@ -42,6 +42,7 @@ class ParseTree: public virtual ParseComponent { using array_type = decltype(subComponents); using iterator = array_type::iterator; using constant_iterator = array_type::const_iterator; + mutable optional> parent; protected: IS_PARSECOMPONENT void addComponent(const T& component) const { @@ -51,6 +52,9 @@ protected: static_assert(is_move_constructible_v, "T is not copy-constructible or move-constructible"); subComponents.emplace_back(new T(move(const_cast(component)))); } + if constexpr(is_base_of_v) { + reinterpret_cast(*subComponents.back()).parent = cref(*this); + } }; IS_PARSECOMPONENT void addAllComponents( @@ -68,6 +72,9 @@ public: inline iterator end() noexcept { return subComponents.end(); } inline constant_iterator end() const noexcept { return cend(); } inline constant_iterator cend() const noexcept { return subComponents.cend(); } + + const decltype(parent)& getParent() const { return parent; } + IS_PARSECOMPONENT vector findById() const { vector filteredComponents;