// This file is under GNU General Public License 3.0 // see LICENSE.txt #ifndef PITYTEST_PITYTREE_HXX #define PITYTEST_PITYTREE_HXX #include #include #include #include #include #include #include #include #include #include #include namespace pEp { namespace PityTest11 { template PityTree::PityTree(T& self, const std::string& name) : _self{ self }, _nodename{ _normalizeName(name) } { } template PityTree::PityTree(T& self, const std::string& name, T& parent) : _self(self), _nodename{ _normalizeName(name) } { parent.add(_self); } template T& PityTree::add(T& node) { node.setParent(&_self); _children.insert(std::pair(node.getName(), node)); return node; } template void PityTree::setParent(T* parent) { _parent = parent; } template T* PityTree::getParent() const { return _parent; } template bool PityTree::isRoot() const { if (_parent == nullptr) { return true; } else { return false; } } template void PityTree::setName(const std::string& name) { _nodename = name; } template std::string PityTree::getName() const { return _nodename; } template std::string PityTree::getPath() const { std::string ret; if (!isRoot()) { ret = _parent->getPath() + "/" + getName(); } else { ret = getName(); } return ret; } template std::string PityTree::to_string(bool recursive, int indent) { std::string ret; std::stringstream builder; builder << std::string(indent * 4, ' '); builder << getName(); builder << std::endl; ret = builder.str(); if (recursive) { if (!getChildren().empty()) { indent++; for (auto child : getChildren()) { ret += child.second.to_string(true, indent); } indent--; } } return ret; } template T& PityTree::getRoot() { if (!isRoot()) { return _parent->getRoot(); } else { return _self; } } template typename PityTree::Children PityTree::getChildren() const { return _children; } template T& PityTree::getChild(const std::string& name) { return _children.at(name); } // name is alphanumeric only (everything else will be replaced by an underscore) // static template std::string PityTree::_normalizeName(std::string name) { replace_if( name.begin(), name.end(), [](char c) -> bool { return !isalnum(c); }, '_'); return name; } } // namespace PityTest11 } // namespace pEp #endif