#pragma once #include #include #include "ifaces/ILinkMixin.h" #include "ifaces/INode.h" #include "Logger.h" /// \brief Базовый миксин для реализации ILinkMixin для INode. /// Предоставляет базовую реализацию методов для работы с дочерними узлами и родителем. class BaseLinkMixin : public virtual ILinkMixin, public std::enable_shared_from_this> { using ElemPtr = std::shared_ptr; public: ~BaseLinkMixin() override { Logger::get("Mixin").dbg("--- Destructor called for: BaseLinkMixin"); } void linkChild(const ElemPtr& child) override { getLink()->addChild(child); auto childLink = child->getLink(); childLink->setParent(getNode()); } void unlinkParent() override { auto link = getLink(); ElemPtr parent = link->getParent(); if (!parent) throw std::logic_error("Have no parent!"); auto parentLink = parent->getLink(); parentLink->removeChild(getNode()); getLink()->setParent(nullptr); } ElemPtr parent() override { auto link = getLink(); ElemPtr parent = link->getParent(); return parent; } const std::vector& children() override { auto link = getLink(); return link->getChildren(); } protected: ElemPtr getNode() { return std::dynamic_pointer_cast(shared_from_this()); } };