/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set et sw=2 ts=2: */ /*************************************************************************** * nodetree.h * * Tue Mar 27 11:07:48 CEST 2012 * Copyright 2012 Jonas Suhr Christensen * jsc@umbraculum.org ****************************************************************************/ /* * This file is part of Munia. * * Munia is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Munia is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Munia; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #pragma once #include #include #include "node.h" class Node; typedef std::list NodeList; class Node { public: nodeid_t id; Node* parent; node_t data; NodeList children; std::string toXML(std::string prefix); }; class NodeTree { public: NodeTree(); ~NodeTree(); nodeid_t createId(); bool hasId(nodeid_t nodeid) const; //! May throw: //! - Error::MissingParent if the parent node id does not exist in the tree. //! - Error::NoSuchId if the ancestorList cannot be made from the supplied id. //! - Error::IdAlreadyExists if the supplied id already exists in the tree. //! - Error::NewParentIsSelf if id and parentid are the same. NodeIdList insertAsChild(nodeid_t parentid, nodeid_t id, node_t data, nodeid_t insertBeforeId); //! May throw: //! - Error::NoSuchId if node id does not exist. //! - Error::ProtectedNode if node is protected and cannot be removed. NodeIdList remove(nodeid_t id); //! May throw: //! - Error::NewParentIsSelf if id and parentid are the same. //! - Error::NoSuchId if node id does not exist. //! - Error::MissingParent if new parent node does not exist. //! - Error::ProtectedNode if node is protected and cannot be (re)moved. NodeIdList move(nodeid_t id, nodeid_t newParentId, nodeid_t insertBeforeId); //! May throw: //! - Error::NoSuchId if node id does not exist. NodeIdList updateData(nodeid_t id, const std::string &name, const std::string &value); //! May throw: //! - Error::NoSuchId if node id does not exist. node_t data(nodeid_t id); //! May throw: //! - Error::NoSuchId if node id does not exist. NodeIdList bfs(nodeid_t id); //! May throw: //! - Error::NoSuchId if node id does not exist. NodeIdList ancestorList(nodeid_t id); void toStdOut(); std::string toXML(); void fromXML(const std::string& xml); private: friend class XmlParser; Node* createNode(nodeid_t id); void insertChild(Node* parent, Node* child, nodeid_t insertBeforeId); nodeid_t nextid{10}; Node* root{nullptr}; std::map id2node; };