Compare commits
3 Commits
iters
..
e49c3fd4a1
| Author | SHA1 | Date | |
|---|---|---|---|
| e49c3fd4a1 | |||
| 79c9961388 | |||
| 5df05f703a |
@@ -1,21 +0,0 @@
|
|||||||
#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,5 +16,4 @@ 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 <stack>
|
#include <queue>
|
||||||
|
|
||||||
#include "iterators/BaseIterator.h"
|
#include "iterators/BaseIterator.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
#include "ifaces/IIterator.h"
|
#include "ifaces/IIterator.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
#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 {
|
||||||
|
/// \brief Фабрика итераторов узлов дерева.
|
||||||
|
/// \tparam T Тип алгоритма для обхода дерева.
|
||||||
|
/// Конструирует итерируемый объект с заданным алгоритмом обхода. Например, в ширину
|
||||||
|
/// или глубину.
|
||||||
template<typename Policy>
|
template<typename Policy>
|
||||||
class Traversal {
|
class Traversal {
|
||||||
INode* start;
|
INode* start;
|
||||||
@@ -18,5 +22,6 @@ public:
|
|||||||
Policy end() const { return Policy(nullptr); }
|
Policy end() const { return Policy(nullptr); }
|
||||||
};
|
};
|
||||||
|
|
||||||
using TraversalDFS = Traversal<DFSIterator<INode>>;
|
using DFS = Traversal<DFSIterator<INode>>;
|
||||||
using TraversalBFS = Traversal<BFSIterator<INode>>;
|
using BFS = Traversal<BFSIterator<INode>>;
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
~BaseLink() override {
|
~BaseLink() override {
|
||||||
Logger::get("Link").dbg("--- Destructor called for: BaseLink");
|
Logger::get("ConDes").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("Link").dbg("--- Destructor called for: NotImplementedLink");
|
Logger::get("ConDes").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("Mixin").dbg("--- Destructor called for: BaseLinkMixin");
|
Logger::get("ConDes").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("Mixin").dbg("--- Destructor called for: HierarchicalLinkMixin");
|
Logger::get("ConDes").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("Mixin").dbg("--- Destructor called for: LazyLinkMixin");
|
Logger::get("ConDes").info("--- Destructor called for: LazyLinkMixin");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "ifaces/INode.h"
|
#include "ifaces/INode.h"
|
||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
@@ -9,12 +8,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("Node").dbg(std::string("--- Base constructor called for: ") + name_);
|
Logger::get("ConDes").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("Node").dbg(std::string("--- Base destructor called for: ") + name_);
|
Logger::get("ConDes").info(std::string("--- Base destructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "nodes/BaseNode.h"
|
#include "nodes/BaseNode.h"
|
||||||
#include "mixins/HierarchicalLinkMixin.h"
|
#include "mixins/HierarchicalLinkMixin.h"
|
||||||
@@ -11,9 +10,9 @@ class ComplexNode : public BaseNode,
|
|||||||
virtual public HierarchicalLinkMixin<INode> {
|
virtual public HierarchicalLinkMixin<INode> {
|
||||||
public:
|
public:
|
||||||
~ComplexNode() {
|
~ComplexNode() {
|
||||||
Logger::get("Node").dbg(std::string("--- Complex destructor called for: ") + name_);
|
Logger::get("ConDes").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("Node").dbg(std::string("--- Complex constructor called for: ") + name_);
|
Logger::get("ConDes").dbg(std::string("--- Complex constructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "nodes/BaseNode.h"
|
#include "nodes/BaseNode.h"
|
||||||
#include "mixins/LazyLinkMixin.h"
|
#include "mixins/LazyLinkMixin.h"
|
||||||
@@ -12,9 +11,9 @@ class SimpleNode : public BaseNode,
|
|||||||
virtual public LazyLinkMixin<OneToOneLink<INode>> {
|
virtual public LazyLinkMixin<OneToOneLink<INode>> {
|
||||||
public:
|
public:
|
||||||
~SimpleNode() {
|
~SimpleNode() {
|
||||||
Logger::get("Node").dbg(std::string("--- Simple destructor called for: ") + name_);
|
Logger::get("ConDes").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("Node").dbg(std::string("--- Simple constructor called for: ") + name_);
|
Logger::get("ConDes").dbg(std::string("--- Simple constructor called for: ") + name_);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+8
-3
@@ -14,15 +14,15 @@ void printNode(INode& node, size_t level) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printTreeBFS(INode& node) {
|
void printTreeBFS(INode& node) {
|
||||||
for (auto& child : TraversalBFS(&node))
|
for (auto& child : traversal::BFS(&node))
|
||||||
printNode(*child, 0);
|
printNode(*child, 0);
|
||||||
}
|
}
|
||||||
void printTreeList(INode& node) {
|
void printTreeList(INode& node) {
|
||||||
for (auto& child : TraversalDFS(&node))
|
for (auto& child : traversal::DFS(&node))
|
||||||
printNode(*child, 0);
|
printNode(*child, 0);
|
||||||
}
|
}
|
||||||
void printTreeLadder(INode& node) {
|
void printTreeLadder(INode& node) {
|
||||||
for (auto& [child, level] : TraversalDFS(&node))
|
for (auto& [child, level] : traversal::DFS(&node))
|
||||||
printNode(*child, level);
|
printNode(*child, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,6 +31,10 @@ 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...");
|
||||||
|
|
||||||
@@ -137,6 +141,7 @@ 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