#include <algorithm>
#include <array>
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <memory>
#include <regex>
#include <sstream>
#include <string>
#include <tuple>
#include <unordered_map>
#include <utility>
#include <vector>
class Serializable {
public:
virtual const std::string get_as_string() const = 0;
virtual ~Serializable(){};
};
static uint64_t ID_GLOBAL = 0;
class Tree {
public:
class Node : public Serializable {
uint64_t uid = ID_GLOBAL++;
Node* parent;
public:
std::vector<std::unique_ptr<Node> > children;
Node(Node* parent)
: parent(parent){
};
const std::string get_as_string() const override {
static std::string depth_string;
std::stringstream accumulator;
if (depth_string.capacity() == 0) {
depth_string.reserve(128);
};
accumulator << "Node#" << std::to_string(uid) << "\n";
if(children.size() == 0) { return accumulator.str(); }
depth_string.push_back(' ');
depth_string.push_back('|');
auto&& pointer_to_child_first = std::cbegin(children);
auto&& pointer_to_child_last = std::cend(children) - 1;
auto pointer_to_child_current = pointer_to_child_first;
//debug logs
std::cout << "f> " << accumulator.str() << "<\n";
if(pointer_to_child_current < pointer_to_child_last) std::cout << " _lt_ " << pointer_to_child_last - pointer_to_child_current << " " << pointer_to_child_current - pointer_to_child_last << "\n";
if(pointer_to_child_current == pointer_to_child_last) std::cout << " _eq_ " << pointer_to_child_last - pointer_to_child_current << " " << pointer_to_child_current - pointer_to_child_last << "\n";
if(pointer_to_child_current > pointer_to_child_last) std::cout << " _gt_ " << pointer_to_child_last - pointer_to_child_current << " " << pointer_to_child_current - pointer_to_child_last << "\n";
if(std::cbegin(children) < std::cend(children)) std::cout << " 2_lt_ " << std::cend(children) - std::cbegin(children) << " " << std::cbegin(children) - std::cend(children) << "\n";
if(std::cbegin(children) == std::cend(children)) std::cout << " 2_eq_ " << std::cend(children) - std::cbegin(children) << " " << std::cbegin(children) - std::cend(children) << "\n";
if(std::cbegin(children) > std::cend(children)) std::cout << " 2_gt_ " << std::cend(children) - std::cbegin(children) << " " << std::cbegin(children) - std::cend(children) << "\n";
//end debug logs
for (; pointer_to_child_current < pointer_to_child_last; pointer_to_child_current += 1) {
std::cout << "pcu < pla \n"; //debug
accumulator << depth_string << "-" << (*pointer_to_child_current)->get_as_string();
};
depth_string.pop_back();
std::cout << "fff";//debug
if (pointer_to_child_current == pointer_to_child_last) {
std::cout << "\npcu==pla\n";//debug
accumulator << depth_string << "`-"
<< (*pointer_to_child_last)->get_as_string();
};
std::cout << accumulator.str() << "\n";
depth_string.pop_back();
return accumulator.str();
};
};
std::unique_ptr<Node> root;
Tree() { root = std::make_unique<Node>(new Node{nullptr}); }
};
int main() {
using Node = Tree::Node;
Tree e;
auto parent = e.root.get();
std::cout << "gj\n";
parent->children.emplace_back(new Node{parent});
parent->children.emplace_back(new Node{parent});
parent->children.emplace_back(new Node{parent});
parent = e.root->children[0].get();
parent->children.emplace_back(new Node{parent});
parent->children.emplace_back(new Node{parent});
parent->children.emplace_back(new Node{parent});
parent = e.root->children[2].get();
parent->children.emplace_back(new Node{parent});
parent = e.root->children[0]->children[1].get();
parent->children.emplace_back(new Node{parent});
parent->children.emplace_back(new Node{parent});
std::cout << e.root->get_as_string();
std::cout << "\n end";
}