From d17c80a195d0d60698fc1d58a0547991ff4f17f9 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: Wed, 23 Jul 2025 15:51:27 +0700 Subject: [PATCH] fup --- include/decls.h | 5 +++++ include/ifaces/ILink.h | 5 +---- include/ifaces/ILinkMixin.h | 8 +------- include/ifaces/INode.h | 3 ++- include/mixins/BaseLinkMixin.h | 41 +++++++++++++++++++++++++++++++++++++++++ include/mixins/LazyLinkMixin.h | 36 ++++++++---------------------------- include/nodes/BaseNode.h | 11 ++++------- include/nodes/SimpleNode.h | 7 +++++-- src/main.cpp | 26 ++++++++++++++++++-------- 9 files changed, 85 insertions(+), 57 deletions(-) create mode 100644 include/decls.h create mode 100644 include/mixins/BaseLinkMixin.h diff --git a/include/decls.h b/include/decls.h new file mode 100644 index 0000000..3323721 --- /dev/null +++ b/include/decls.h @@ -0,0 +1,5 @@ +#pragma once +class INode; +class ILink; +using NodePtr = std::shared_ptr; +using LinkPtr = std::shared_ptr; diff --git a/include/ifaces/ILink.h b/include/ifaces/ILink.h index c77b0fb..f2927b3 100644 --- a/include/ifaces/ILink.h +++ b/include/ifaces/ILink.h @@ -1,11 +1,8 @@ #pragma once #include #include +#include "ifaces/INode.h" -// Forward declarations -class INode; -class ILink; -using NodePtr = std::shared_ptr; using LinkPtr = std::shared_ptr; class ILink { diff --git a/include/ifaces/ILinkMixin.h b/include/ifaces/ILinkMixin.h index e8fbec5..eecc108 100644 --- a/include/ifaces/ILinkMixin.h +++ b/include/ifaces/ILinkMixin.h @@ -1,11 +1,6 @@ #pragma once #include - -// Forward declarations для избежания циклических #include -class INode; -class ILink; -using NodePtr = std::shared_ptr; -using LinkPtr = std::shared_ptr; +#include "decls.h" class ILinkMixin { public: @@ -13,5 +8,4 @@ public: virtual void linkChild(const NodePtr& child) = 0; virtual void unlinkParent() = 0; virtual LinkPtr getLink() = 0; - virtual NodePtr getNode() = 0; }; diff --git a/include/ifaces/INode.h b/include/ifaces/INode.h index 5959b69..6692c38 100644 --- a/include/ifaces/INode.h +++ b/include/ifaces/INode.h @@ -1,8 +1,9 @@ #pragma once #include "ifaces/ILinkMixin.h" -#include "ifaces/ILink.h" #include +using NodePtr = std::shared_ptr; + class INode : public virtual ILinkMixin { public: ~INode() = default; diff --git a/include/mixins/BaseLinkMixin.h b/include/mixins/BaseLinkMixin.h new file mode 100644 index 0000000..8e50949 --- /dev/null +++ b/include/mixins/BaseLinkMixin.h @@ -0,0 +1,41 @@ +#pragma once +#include +#include "ifaces/INode.h" +#include "ifaces/ILinkMixin.h" +#include "links/LeafLink.h" +#include "links/OneToManyLink.h" +#include + +class BaseLinkMixin : public virtual ILinkMixin, + public virtual INode, + public std::enable_shared_from_this { +public: + void linkChild(const NodePtr& childNode) override { + LinkPtr childLink = childNode->getLink(); + childLink->setParent(getNode()); + + getLink()->addChild(childNode); + } + + void unlinkParent() override { + LinkPtr link = getLink(); + + NodePtr parent = link->getParent(); + if (!parent) + throw std::logic_error("Have no parent!"); + + LinkPtr parentLink = parent->getLink(); + + parentLink->removeChild(getNode()); + getLink()->setParent(nullptr); + } + + ~BaseLinkMixin() override { + std::cout << "--- Destructor called for: " << "BaseLinkMixin" << "\n"; + } + +protected: + NodePtr getNode() { + return shared_from_this(); + } +}; diff --git a/include/mixins/LazyLinkMixin.h b/include/mixins/LazyLinkMixin.h index 1557d9f..a0f6dac 100644 --- a/include/mixins/LazyLinkMixin.h +++ b/include/mixins/LazyLinkMixin.h @@ -1,39 +1,22 @@ #pragma once #include -#include "ifaces/INode.h" -#include "ifaces/ILinkMixin.h" -#include "links/LeafLink.h" -#include "links/OneToManyLink.h" +#include "mixins/BaseLinkMixin.h" #include template -class LazyLinkMixin : public virtual ILinkMixin { +class LazyLinkMixin : public BaseLinkMixin { public: - void linkChild(const NodePtr& childNode) override { - LinkPtr childLink = childNode->getLink(); - childLink->setParent(getNode()); - - getLink()->addChild(childNode); - } - void unlinkParent() override { /* No link -- no parent, who'll unlinked? */ - if (!link_) + if (!this->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(getNode()); - getLink()->setParent(nullptr); + BaseLinkMixin::unlinkParent(); } LinkPtr getLink() override { lazyInit(); - return link_; + return this->link_; } ~LazyLinkMixin() override { @@ -41,14 +24,11 @@ public: } protected: - virtual NodePtr getNode() = 0; - -private: void lazyInit() { - if (!link_) { - link_ = std::make_shared(getNode()); + if (!this->link_) { + this->link_ = std::make_shared( + BaseLinkMixin::getNode()); } } - LinkPtr link_; }; diff --git a/include/nodes/BaseNode.h b/include/nodes/BaseNode.h index 9526509..b89eade 100644 --- a/include/nodes/BaseNode.h +++ b/include/nodes/BaseNode.h @@ -3,18 +3,15 @@ #include "ifaces/INode.h" #include -class BaseNode : public INode, - public LazyLinkMixin, - public std::enable_shared_from_this { +class BaseNode : public virtual INode { public: - BaseNode(std::string name) : name_(std::move(name)) {} + BaseNode(std::string name) : name_(std::move(name)) { + std::cout << "--- Base constructor called for: " << name_ << "\n"; + } const std::string& name() const override { return name_; } ~BaseNode() { std::cout << "--- Base destructor called for: " << name_ << "\n"; } protected: - NodePtr getNode() override { - return shared_from_this(); - } std::string name_; }; diff --git a/include/nodes/SimpleNode.h b/include/nodes/SimpleNode.h index da5f97f..1f52fe7 100644 --- a/include/nodes/SimpleNode.h +++ b/include/nodes/SimpleNode.h @@ -2,10 +2,13 @@ #include "nodes/BaseNode.h" #include -class SimpleNode : public BaseNode { +class SimpleNode : public BaseNode, + public LazyLinkMixin { public: ~SimpleNode() { std::cout << "--- Simple destructor called for: " << name_ << "\n"; } - SimpleNode(std::string name) : BaseNode(std::move(name)) {} + SimpleNode(std::string name) : BaseNode(std::move(name)) { + std::cout << "--- Simple constructor called for: " << name_ << "\n"; + } }; diff --git a/src/main.cpp b/src/main.cpp index e04d099..26d4771 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,37 +11,47 @@ void printTree(const NodePtr& startNode, int indent = 0) { } } +int main2() { + std::cout << "Creatin...\n\n"; + auto root = std::make_shared("Root"); + std::cout << "Nice!\n\n"; + return 0; +} + int main() { std::cout << "Entering main scope...\n\n"; { auto root = std::make_shared("Root"); - auto child2 = std::make_shared("Child2"); + auto child2 = std::make_shared("Child1"); root->linkChild(child2); + std::cout << "\nInit tree:\n\n\n"; + printTree(root); + { - auto child1 = std::make_shared("Child1"); + auto child1 = std::make_shared("Child2"); root->linkChild(child1); - auto subchild = std::make_shared("SubChild"); + auto subchild = std::make_shared("SubChild2"); child1->linkChild(subchild); auto child3 = std::make_shared("Child3"); root->linkChild(child3); - auto subchild2 = std::make_shared("SubChild2"); + auto subchild2 = std::make_shared("SubChild3"); child3->linkChild(subchild2); - std::cout << "Initial tree:\n"; + std::cout << "\nAnother tree:\n\n\n"; printTree(root); std::cout << "\nUnlinking Child1...\n"; child1->unlinkParent(); - std::cout << "\nTree after unlink:\n"; + std::cout << "\nTree after unlink:\n\n\n"; printTree(root); } - std::cout << "\nTree after scope out:\n"; + std::cout << "\nTree after scope out:\n\n\n"; printTree(root); - + std::cout << "\n\n"; } std::cout << "\nExited main scope. All smart pointers destroyed.\n";