#pragma once #include #include #include namespace generator { // This is a tree node, where each node can have many children. Now it is used to build a hierarchy // of places. template class PlaceNode { public: using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; using PtrList = std::vector; explicit PlaceNode(Data && data) : m_data(std::move(data)) {} void AddChild(Ptr child) { m_children.push_back(child); } void SetParent(Ptr parent) { m_parent = parent; } void SetChildren(PtrList && children) { m_children = std::move(children); } void RemoveChildren() { m_children.clear(); } bool HasChildren() const { return !m_children.empty(); } bool HasParent() const { return m_parent.lock() != nullptr; } PtrList const & GetChildren() const { return m_children; } PtrList & GetChildren() { return m_children; } Ptr GetParent() const { return m_parent.lock(); } Data & GetData() { return m_data; } Data const & GetData() const { return m_data; } void ShrinkToFitChildren() { if (m_children.capacity() != m_children.size()) PtrList(m_children).swap(m_children); } private: Data m_data; PtrList m_children; WeakPtr m_parent; }; template void Visit(std::shared_ptr> const & tree, Visitor && visitor) { visitor(tree); for (auto const & subtree : tree->GetChildren()) Visit(subtree, visitor); } } // namespace generator