Compare commits
19 Commits
e49c3fd4a1
..
iters
| Author | SHA1 | Date | |
|---|---|---|---|
| 08f7b59aa7 | |||
| 038cbb73f4 | |||
| 0f93988fb6 | |||
| 0f9d73366b | |||
| e5dc6f7502 | |||
| c228caaa45 | |||
| 55ef99c848 | |||
| d17c80a195 | |||
| f994303cb5 | |||
| 0912566c5f | |||
| f5f78308bd | |||
| 3801a5dc0b | |||
| 44480a7128 | |||
| b2be9b51ca | |||
| 8b60fc0183 | |||
| fd34b335c1 | |||
| 60bbaae0c0 | |||
| dc9bfe51ab | |||
| b9cf6623d1 |
@@ -0,0 +1,21 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "iterators/BaseIterator.h"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct IteratorForward : public BaseIterator<T> {
|
||||||
|
explicit IteratorForward(T* ptr) : Iterator<T>(first(ptr)) {}
|
||||||
|
|
||||||
|
static T* first(T* node) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static T* next(T* node) {
|
||||||
|
return node ? node->get_next() : nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<T>& operator++() override {
|
||||||
|
this->current = next(this->current);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -16,4 +16,5 @@ public:
|
|||||||
virtual const std::vector<ElemPtr>& children() = 0;
|
virtual const std::vector<ElemPtr>& children() = 0;
|
||||||
virtual ElemPtr parent() = 0;
|
virtual ElemPtr parent() = 0;
|
||||||
virtual LinkPtr getLink() = 0;
|
virtual LinkPtr getLink() = 0;
|
||||||
|
//virtual operator ElemPtr() const = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <queue>
|
#include <stack>
|
||||||
|
|
||||||
#include "iterators/BaseIterator.h"
|
#include "iterators/BaseIterator.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
#include "ifaces/IIterator.h"
|
#include "ifaces/IIterator.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,22 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
#include "ifaces/INode.h"
|
#include "ifaces/INode.h"
|
||||||
|
|
||||||
#include "iterators/DFSIterator.h"
|
#include "iterators/DFSIterator.h"
|
||||||
#include "iterators/BFSIterator.h"
|
#include "iterators/BFSIterator.h"
|
||||||
|
|
||||||
namespace traversal {
|
template<typename Policy>
|
||||||
/// \brief Фабрика итераторов узлов дерева.
|
class Traversal {
|
||||||
/// \tparam T Тип алгоритма для обхода дерева.
|
INode* start;
|
||||||
/// Конструирует итерируемый объект с заданным алгоритмом обхода. Например, в ширину
|
|
||||||
/// или глубину.
|
|
||||||
template<typename Policy>
|
|
||||||
class Traversal {
|
|
||||||
INode* start;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Traversal(INode* start) : start(start) {}
|
explicit Traversal(INode* start) : start(start) {}
|
||||||
explicit Traversal(NodePtr start) : start(start.get()) {}
|
explicit Traversal(NodePtr start) : start(start.get()) {}
|
||||||
|
|
||||||
Policy begin() const { return Policy(start); }
|
Policy begin() const { return Policy(start); }
|
||||||
Policy end() const { return Policy(nullptr); }
|
Policy end() const { return Policy(nullptr); }
|
||||||
};
|
};
|
||||||
|
|
||||||
using DFS = Traversal<DFSIterator<INode>>;
|
using TraversalDFS = Traversal<DFSIterator<INode>>;
|
||||||
using BFS = Traversal<BFSIterator<INode>>;
|
using TraversalBFS = Traversal<BFSIterator<INode>>;
|
||||||
}
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
~BaseLink() override {
|
~BaseLink() override {
|
||||||
Logger::get("ConDes").dbg("--- Destructor called for: BaseLink");
|
Logger::get("Link").dbg("--- Destructor called for: BaseLink");
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::vector<ElemPtr> children_;
|
std::vector<ElemPtr> children_;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
void removeChild(const ElemPtr& child) override { }
|
void removeChild(const ElemPtr& child) override { }
|
||||||
|
|
||||||
~NotImplementedLink() override {
|
~NotImplementedLink() override {
|
||||||
Logger::get("ConDes").dbg("--- Destructor called for: NotImplementedLink");
|
Logger::get("Link").dbg("--- Destructor called for: NotImplementedLink");
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
std::vector<ElemPtr> empty_;
|
std::vector<ElemPtr> empty_;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class BaseLinkMixin : public virtual ILinkMixin<INode>,
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
~BaseLinkMixin() override {
|
~BaseLinkMixin() override {
|
||||||
Logger::get("ConDes").dbg("--- Destructor called for: BaseLinkMixin");
|
Logger::get("Mixin").dbg("--- Destructor called for: BaseLinkMixin");
|
||||||
}
|
}
|
||||||
|
|
||||||
void linkChild(const ElemPtr& child) override {
|
void linkChild(const ElemPtr& child) override {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ class HierarchicalLinkMixin : public LazyLinkMixin<OneToOneLink<TElem>> {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
~HierarchicalLinkMixin() override {
|
~HierarchicalLinkMixin() override {
|
||||||
Logger::get("ConDes").dbg("--- Destructor called for: HierarchicalLinkMixin");
|
Logger::get("Mixin").dbg("--- Destructor called for: HierarchicalLinkMixin");
|
||||||
}
|
}
|
||||||
|
|
||||||
void linkChild(const ElemPtr& child) override {
|
void linkChild(const ElemPtr& child) override {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public:
|
|||||||
LazyLinkMixin() {}
|
LazyLinkMixin() {}
|
||||||
|
|
||||||
~LazyLinkMixin() override {
|
~LazyLinkMixin() override {
|
||||||
Logger::get("ConDes").info("--- Destructor called for: LazyLinkMixin");
|
Logger::get("Mixin").dbg("--- Destructor called for: LazyLinkMixin");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "ifaces/INode.h"
|
#include "ifaces/INode.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
@@ -8,12 +9,12 @@
|
|||||||
class BaseNode : public virtual INode {
|
class BaseNode : public virtual INode {
|
||||||
public:
|
public:
|
||||||
BaseNode(std::string name) : name_(std::move(name)) {
|
BaseNode(std::string name) : name_(std::move(name)) {
|
||||||
Logger::get("ConDes").dbg(std::string("--- Base constructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Base constructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
const std::string& name() const override { return name_; }
|
const std::string& name() const override { return name_; }
|
||||||
const std::string& kind() const override { return kind_; }
|
const std::string& kind() const override { return kind_; }
|
||||||
~BaseNode() {
|
~BaseNode() {
|
||||||
Logger::get("ConDes").info(std::string("--- Base destructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Base destructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "nodes/BaseNode.h"
|
#include "nodes/BaseNode.h"
|
||||||
#include "mixins/HierarchicalLinkMixin.h"
|
#include "mixins/HierarchicalLinkMixin.h"
|
||||||
@@ -10,9 +11,9 @@ class ComplexNode : public BaseNode,
|
|||||||
virtual public HierarchicalLinkMixin<INode> {
|
virtual public HierarchicalLinkMixin<INode> {
|
||||||
public:
|
public:
|
||||||
~ComplexNode() {
|
~ComplexNode() {
|
||||||
Logger::get("ConDes").dbg(std::string("--- Complex destructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Complex destructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
ComplexNode(std::string name) : BaseNode(std::move(name)) {
|
ComplexNode(std::string name) : BaseNode(std::move(name)) {
|
||||||
Logger::get("ConDes").dbg(std::string("--- Complex constructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Complex constructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "nodes/BaseNode.h"
|
#include "nodes/BaseNode.h"
|
||||||
#include "mixins/LazyLinkMixin.h"
|
#include "mixins/LazyLinkMixin.h"
|
||||||
@@ -11,9 +12,9 @@ class SimpleNode : public BaseNode,
|
|||||||
virtual public LazyLinkMixin<OneToOneLink<INode>> {
|
virtual public LazyLinkMixin<OneToOneLink<INode>> {
|
||||||
public:
|
public:
|
||||||
~SimpleNode() {
|
~SimpleNode() {
|
||||||
Logger::get("ConDes").dbg(std::string("--- Simple destructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Simple destructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
SimpleNode(std::string name) : BaseNode(std::move(name)) {
|
SimpleNode(std::string name) : BaseNode(std::move(name)) {
|
||||||
Logger::get("ConDes").dbg(std::string("--- Simple constructor called for: ") + name_);
|
Logger::get("Node").dbg(std::string("--- Simple constructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+3
-8
@@ -14,15 +14,15 @@ void printNode(INode& node, size_t level) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printTreeBFS(INode& node) {
|
void printTreeBFS(INode& node) {
|
||||||
for (auto& child : traversal::BFS(&node))
|
for (auto& child : TraversalBFS(&node))
|
||||||
printNode(*child, 0);
|
printNode(*child, 0);
|
||||||
}
|
}
|
||||||
void printTreeList(INode& node) {
|
void printTreeList(INode& node) {
|
||||||
for (auto& child : traversal::DFS(&node))
|
for (auto& child : TraversalDFS(&node))
|
||||||
printNode(*child, 0);
|
printNode(*child, 0);
|
||||||
}
|
}
|
||||||
void printTreeLadder(INode& node) {
|
void printTreeLadder(INode& node) {
|
||||||
for (auto& [child, level] : traversal::DFS(&node))
|
for (auto& [child, level] : TraversalDFS(&node))
|
||||||
printNode(*child, level);
|
printNode(*child, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,10 +31,6 @@ int main() {
|
|||||||
Logger::suppressCategory("Node");
|
Logger::suppressCategory("Node");
|
||||||
Logger::suppressCategory("Link");
|
Logger::suppressCategory("Link");
|
||||||
Logger::suppressCategory("Mixin");
|
Logger::suppressCategory("Mixin");
|
||||||
|
|
||||||
Logger::suppressCategory("ConDes");
|
|
||||||
Logger::setMinSeverity("ConDes", Logger::Severity::Info);
|
|
||||||
|
|
||||||
auto& logger = Logger::get("MAIN");
|
auto& logger = Logger::get("MAIN");
|
||||||
logger.info("Entering main scope...");
|
logger.info("Entering main scope...");
|
||||||
|
|
||||||
@@ -141,7 +137,6 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.info("Exited main scope. All smart pointers destroyed.");
|
logger.info("Exited main scope. All smart pointers destroyed.");
|
||||||
logger.info("(It don't? Check ConDes logger)");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user