|
|
|
|
@ -4,7 +4,6 @@
|
|
|
|
|
#include <mutex>
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <stdexcept>
|
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
class INode;
|
|
|
|
|
class ILink;
|
|
|
|
|
@ -134,7 +133,8 @@ private:
|
|
|
|
|
mutable std::mutex lock_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Типизированная связь один ко многим
|
|
|
|
|
// Note: TypedOneToManyLink ensures type-safety on child linkage
|
|
|
|
|
|
|
|
|
|
template <typename TChild>
|
|
|
|
|
class TypedOneToManyLink : public OneToManyLink {
|
|
|
|
|
public:
|
|
|
|
|
@ -149,7 +149,8 @@ public:
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Базовая реализация LinkMixin
|
|
|
|
|
// Note: BaseLinkMixin is used for direct eager link composition (non-lazy)
|
|
|
|
|
|
|
|
|
|
class BaseLinkMixin : public ILinkMixin {
|
|
|
|
|
public:
|
|
|
|
|
explicit BaseLinkMixin(NodePtr self) {
|
|
|
|
|
@ -182,7 +183,8 @@ protected:
|
|
|
|
|
LinkPtr link_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Ленивый LinkMixin с выбором стратегии по типу
|
|
|
|
|
// Note: LazyLinkMixin starts with LeafLink and upgrades dynamically
|
|
|
|
|
|
|
|
|
|
template <typename TNode>
|
|
|
|
|
class LazyLinkMixin : public ILinkMixin {
|
|
|
|
|
public:
|
|
|
|
|
@ -243,7 +245,6 @@ private:
|
|
|
|
|
LinkPtr link_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Пример узла
|
|
|
|
|
class SimpleNode : public INode, public std::enable_shared_from_this<SimpleNode> {
|
|
|
|
|
public:
|
|
|
|
|
static std::shared_ptr<SimpleNode> create(std::string name) {
|
|
|
|
|
@ -273,7 +274,6 @@ private:
|
|
|
|
|
LinkMixinPtr mixin_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Пример использования
|
|
|
|
|
void printTree(const LinkPtr& link, int indent = 0) {
|
|
|
|
|
for (int i = 0; i < indent; ++i) std::cout << " ";
|
|
|
|
|
auto node = link->getNode();
|
|
|
|
|
|