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;