From 60bbaae0c05051b117a50444a33ab5a2feec85e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=9C=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=B5=D0=B2=D0=B8=D1=87?= Date: Mon, 21 Jul 2025 16:12:01 +0700 Subject: [PATCH] remove getNode from ILink --- tree.cc | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/tree.cc b/tree.cc index 1706f7a..c3b3c05 100644 --- a/tree.cc +++ b/tree.cc @@ -24,7 +24,6 @@ public: virtual void addChild(LinkPtr child) = 0; virtual void removeChild(LinkPtr child) = 0; - virtual NodePtr getNode() const = 0; virtual std::mutex& getLock() = 0; virtual LinkMixinPtr getLinkMixin() const = 0; }; @@ -64,7 +63,6 @@ public: void removeChild(LinkPtr) override {} - NodePtr getNode() const override { return node_; } std::mutex& getLock() override { return lock_; } LinkMixinPtr getLinkMixin() const override { return node_->getLinkMixin(); } @@ -89,7 +87,6 @@ public: children_.erase(std::remove(children_.begin(), children_.end(), child), children_.end()); } - NodePtr getNode() const override { return node_; } std::mutex& getLock() override { return lock_; } LinkMixinPtr getLinkMixin() const override { return node_->getLinkMixin(); } @@ -122,7 +119,6 @@ public: } } - NodePtr getNode() const override { return node_; } std::mutex& getLock() override { return lock_; } LinkMixinPtr getLinkMixin() const override { return node_->getLinkMixin(); } @@ -141,7 +137,7 @@ public: explicit TypedOneToManyLink(NodePtr node) : OneToManyLink(std::move(node)) {} void addChild(LinkPtr child) override { - NodePtr n = child->getNode(); + NodePtr n = child->getLinkMixin()->getNode(); if (!std::dynamic_pointer_cast(n)) { throw std::invalid_argument("TypedOneToManyLink: child is not of expected type"); } @@ -166,7 +162,7 @@ public: void unlinkParent() override { if (!link_ || !link_->getParent()) return; auto parent = link_->getParent(); - parent->getLinkMixin()->unlinkChild(link_->getNode()); + parent->getLinkMixin()->unlinkChild(getNode()); link_->setParent(nullptr); } @@ -177,10 +173,11 @@ public: } LinkPtr getLink() const override { return link_; } - NodePtr getNode() const override { return link_->getNode(); } + NodePtr getNode() const override { return self_; } -protected: +private: LinkPtr link_; + NodePtr self_; }; // Note: LazyLinkMixin starts with LeafLink and upgrades dynamically @@ -188,7 +185,7 @@ protected: template class LazyLinkMixin : public ILinkMixin { public: - explicit LazyLinkMixin(NodePtr self) { + explicit LazyLinkMixin(NodePtr self) : self_(self) { link_ = std::make_shared(self); } @@ -203,11 +200,11 @@ public: void unlinkParent() override { if (!link_ || !link_->getParent()) return; auto parent = link_->getParent(); - parent->getLinkMixin()->unlinkChild(link_->getNode()); + parent->getLinkMixin()->unlinkChild(getNode()); link_->setParent(nullptr); if (link_->getChildren().empty()) { - link_ = std::make_shared(link_->getNode()); + link_ = std::make_shared(getNode()); } } @@ -218,12 +215,12 @@ public: childLink->setParent(nullptr); if (link_->getChildren().empty()) { - link_ = std::make_shared(link_->getNode()); + link_ = std::make_shared(getNode()); } } LinkPtr getLink() const override { return link_; } - NodePtr getNode() const override { return link_->getNode(); } + NodePtr getNode() const override { return self_; } private: void ensureInitialized(const NodePtr& child) { @@ -233,9 +230,9 @@ private: LinkPtr newLink; if (std::dynamic_pointer_cast(child)) { - newLink = std::make_shared>(oldLink->getNode()); + newLink = std::make_shared>(getNode()); } else { - newLink = std::make_shared(oldLink->getNode()); + newLink = std::make_shared(getNode()); } newLink->setParent(oldLink->getParent()); @@ -243,6 +240,7 @@ private: } LinkPtr link_; + NodePtr self_; }; class SimpleNode : public INode, public std::enable_shared_from_this { @@ -276,7 +274,7 @@ private: void printTree(const LinkPtr& link, int indent = 0) { for (int i = 0; i < indent; ++i) std::cout << " "; - auto node = link->getNode(); + auto node = link->getLinkMixin()->getNode(); auto simpleNode = std::dynamic_pointer_cast(node); if (simpleNode) { std::cout << simpleNode->name() << "\n";