#pragma once #include #include #include #include class node { public: node(const std::string &name = ""); virtual ~node(); std::string get_name() const; void set_name(const std::string new_name); unsigned int get_nr_children() const; node *get_child(std::size_t i) const; void add_child(node *child); void print(std::ostream &str, std::size_t depth = 0) const; std::string print_recursive(std::size_t depth = 0, std::set visited = {}) const; private: std::string name; std::vector children; bool destroy = false; // gets set by the destructor, // allows deletion of recursive trees with a recursive destructor static unsigned int node_id; }; extern std::ostream &operator<<(std::ostream &os, node &n); node *create_complete_tree(std::size_t nr_child_nodes, unsigned int tree_depth);