#pragma once #include #include "ifaces/INode.h" #include "links/LeafLink.h" #include "links/OneToManyLink.h" #include template class LazyLinkMixin : public ILinkMixin { public: void linkChild(const NodePtr& childNode) override { LinkPtr childLink = childNode->getLink(); childLink->setParent(getSelf()); getLink()->addChild(childNode); } void unlinkParent() override { /* No link -- no parent, who'll unlinked? */ if (!link_) throw std::logic_error("Link isn't inited!"); NodePtr parent = link_->getParent(); if (!parent) throw std::logic_error("Have no parent!"); LinkPtr parentLink = parent->getLink(); parentLink->removeChild(getSelf()); getLink()->setParent(nullptr); } LinkPtr getLink() override { lazyInit(); return link_; } ~LazyLinkMixin() override { std::cout << "--- Destructor called for: " << "LazyLinkMixin" << "\n"; } protected: virtual NodePtr getShared() = 0; NodePtr getSelf() override { return getShared(); } private: void lazyInit() { if (!link_) { link_ = std::make_shared(getSelf()); } } LinkPtr link_; };