diff options
Diffstat (limited to 'src/tasktree.cc')
-rw-r--r-- | src/tasktree.cc | 475 |
1 files changed, 0 insertions, 475 deletions
diff --git a/src/tasktree.cc b/src/tasktree.cc deleted file mode 100644 index 30494e9..0000000 --- a/src/tasktree.cc +++ /dev/null @@ -1,475 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set et sw=2 ts=2: */ -/*************************************************************************** - * tasktree.cc - * - * 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. - */ -#include "tasktree.h" - -#include <stdio.h> - -#include "xmlparser.h" - -#include "hugin.hpp" - -#include "xml_encode_decode.h" - -#define ROOT_PARENT_ID -1 - -static inline std::string id2str(taskid_t id) -{ - char buf[32]; - sprintf(buf, "%u", id); - return buf; -} - -std::string node::toXML(std::string prefix) -{ - std::string xml; - - xml += prefix + "<task id=\""+id2str(id)+"\">\n"; - xml += prefix + " <attributes>\n"; - std::map<std::string, std::string>::iterator ai = data.attributes.begin(); - while(ai != data.attributes.end()) - { - xml += prefix + " <attribute name=\"" + xml_encode(ai->first) + "\">" - + xml_encode(ai->second) + "</attribute>\n"; - ai++; - } - xml += prefix + " </attributes>\n"; - xml += prefix + " <children>\n"; - NodeList::iterator ni = children.begin(); - while(ni != children.end()) - { - xml += (*ni)->toXML(prefix + " "); - ni++; - } - xml += prefix + " </children>\n"; - xml += prefix + "</task>\n"; - - return xml; -} - -static void concatTaskIdLists(TaskIdList& pre, TaskIdList& post) -{ - pre.insert(pre.end(), post.begin(), post.end()); - //for(TaskIdList::iterator it = post.begin(); - //it != post.end(); it++) - //{ - // pre.push_back( - //} -} - -TaskTree::TaskTree() -{ - root = NULL; - nextid = 10; -} - -TaskTree::~TaskTree() -{ - // cleanup tree -} - -taskid_t TaskTree::createId() -{ - taskid_t taskid; - - do - { - taskid = nextid++; - } - while(id2node.find(taskid) != id2node.end()); - - return taskid; -} - -static taskid_t rootid = -1; - -TaskIdList TaskTree::insertAsChild(taskid_t parentid, taskid_t id, task_t data) - throw (std::exception) -{ - TaskIdList affectedNodes; - - // Initialize - if(!root) - { - rootid = id; - node_t* node = createNode(id); - root = node; - node->data = data; - affectedNodes.push_back(id); - } - else - { - try - { - node_t* parent = id2node.at(parentid); - node_t* child = createNode(id); - //DEBUG(tasktree, "!!!!!!!id in insert: %d\n", data.id); - child->data = data; - insertChild(parent, child); - - //affectedNodes.push_back(parentid); - affectedNodes.push_back(id); - TaskIdList ancestors = ancestorList(id); - concatTaskIdLists(affectedNodes, ancestors); - } - catch(std::exception& e) - { - throw e; - } - } - - //DEBUG(tasktree, "Child %d added to %d, affecting %d nodes\n", - // id, parentid, affectedNodes.size()); - return affectedNodes; -} - -TaskIdList TaskTree::remove(taskid_t id) - throw (std::exception) -{ - TaskIdList affectedNodes; - affectedNodes.push_back(id); - TaskIdList ancestors = ancestorList(id); - concatTaskIdLists(affectedNodes, ancestors); - - //DEBUG(tasktree, "Removing %d\n", id); - //DEBUG(tasktree, "!!!!!affected nodes %d\n", affectedNodes.size()); - - node_t* node = id2node[id]; - - //DEBUG(tasktree, "node: %p, id %d, parent %p\n", node, node->data.id, node->parent); - - //DEBUG(tasktree, "!!!!!size %d\n", node->parent->children.size()); - node->parent->children.remove(node); - for(NodeList::iterator it = node->parent->children.begin(); - it != node->parent->children.end(); - it++) - { - //DEBUG(tasktree, "%p\n", *it); - } - //DEBUG(tasktree, "!!!!!size %d\n", node->parent->children.size()); - - TaskIdList idlist = bfs(id); - TaskIdList::reverse_iterator it = idlist.rbegin(); - while(it != idlist.rend()) - { - task_t task = data(*it); - //node_t* n = id2node[task.id]; - //delete(n); - it++; - } - - return affectedNodes; -} - -static bool findNode(node_t *needle, node_t *haystack) -{ - if(needle == haystack) return true; - NodeList::iterator i = haystack->children.begin(); - while(i != haystack->children.end()) - { - if(findNode(needle, *i)) - { - return true; - } - i++; - } - return false; -} - -TaskIdList TaskTree::move(taskid_t id, taskid_t toid) - throw (std::exception) -{ - TaskIdList affectedNodes; - - try - { - node_t* child = id2node.at(id); - node_t* newparent = id2node.at(toid); - - // Test if new parent is a child of the node itself... - if(findNode(newparent, child)) - { - throw std::exception(); - } - - if(!child->parent) - { - throw std::exception(); - } - - child->parent->children.remove(child); - newparent->children.push_back(child); - - child->parent = newparent; - - affectedNodes.push_back(id); - // affectedNodes.push_back(child->parent->id); - TaskIdList ancestors = ancestorList(id); - concatTaskIdLists(affectedNodes, ancestors); - affectedNodes.push_back(toid); - ancestors = ancestorList(toid); - } - catch(std::exception& e) - { - throw e; - } - - return affectedNodes; -} - -TaskIdList TaskTree::updateData(taskid_t id, const std::string &name, - const std::string &value) - throw (std::exception) -{ - TaskIdList affectedNodes; - - try - { - node_t* node = id2node.at(id); - node->data.attributes[name] = value; - - affectedNodes.push_back(id); - TaskIdList ancestors = ancestorList(id); - concatTaskIdLists(affectedNodes, ancestors); - } - catch(std::exception& e) - { - throw e; - } - - return affectedNodes; -} - -task_t TaskTree::data(taskid_t id) - throw (std::exception) -{ - task_t t; - - try - { - node_t* node = id2node.at(id); - task_t tmp = node->data; - t.id = node->id; - t.attributes = tmp.attributes; - //DEBUG(tasktree, "!!!!t.id and tmp.id in data: %d and %d\n", t.id, tmp.id); - if(node->parent) - { - t.parentid = node->parent->id; - } - else - { - if(t.id != rootid) - { - throw std::exception(); - } - t.parentid = -1; - } - } - catch(std::exception& e) - { - throw e; - } - - return t; -} - -// bfs search from id in tree -TaskIdList TaskTree::bfs(taskid_t id) - throw (std::exception) -{ - TaskIdList lst; - lst.push_back(id); - - std::list<node_t*> queue; - node_t* current = id2node.at(id); - while(true) - { - NodeList children = current->children; - for(NodeList::iterator it = children.begin(); it != children.end(); it++) - { - node_t* child = *it; - queue.push_back(child); - lst.push_back(child->id); - } - - if(!queue.empty()) - { - current = queue.front(); - queue.pop_front(); - } - else - { - break; - } - } - - return lst; -} - -TaskIdList TaskTree::ancestorList(taskid_t id) - throw (std::exception) -{ - TaskIdList ancestors; - - try - { - node_t* current = id2node.at(id); - while(current->parent) - { - ancestors.push_back(current->parent->id); - current = current->parent; - } - } - catch(std::exception& e) - { - throw e; - } - - //DEBUG(tasktree, "Collected %d ancestors to %u\n", ancestors.size(), id); - //for(TaskIdList::iterator it = ancestors.begin(); - // it != ancestors.end(); it++) - //{ - // DEBUG(tasktree, "\tancestor %u\n", *it); - //} - return ancestors; -} - -node_t* TaskTree::createNode(taskid_t id) -{ - node_t* node = new node_t(); - node->parent = NULL; - node->id = id; - id2node[id] = node; - return node; -} - -void TaskTree::insertChild(node_t* parent, node_t* child) -{ - if(parent) - { - parent->children.push_back(child); - } - else - { - rootid = child->id; - root = child; - } - child->parent = parent; -} - -static void printNode(node_t* node, std::string prefix) -{ - if(!node) - { - return; - } - task_t t = node->data; - DEBUG(tasktree, "%s- %u - %s (%p)\n", prefix.c_str(), node->id, - t.attributes["title"].c_str(), node); - - NodeList::iterator it; - for(it = node->children.begin(); it != node->children.end(); it++) - { - node_t* child = *it; - printNode(child, " " + prefix); - } -} - -void TaskTree::toStdOut() -{ - printNode(root, ""); -} - -std::string TaskTree::toXML() -{ - node_t *root = id2node.at(rootid); - - std::string xml; - xml += "<?xml version='1.0' encoding='UTF-8'?>\n"; - xml += "<tasktree nextid=\""+id2str(nextid)+"\">\n"; - xml += root->toXML(" "); - xml += "</tasktree>"; - - return xml; -} - -void TaskTree::fromXML(std::string xml) -{ - XmlParser p(this); - p.parse(xml.c_str(), xml.size()); -} - - -#ifdef TEST_TASKTREE -//Additional dependency files -//deps: debug.cc log.cc -//Required cflags (autoconf vars may be used) -//cflags: -I.. -//Required link options (autoconf vars may be used) -//libs: -#include "test.h" -#include <exception> - -#define ROOT_ID 0 -#define LOSTFOUND_ID 1 -#define FINISHED_ID 2 -#define BACKLOG_ID 3 -#define PROJECTS_ID 4 -#define FIRST_TASK_ID 10 - -TEST_BEGIN; - -TaskTree tree; - -task_t t; -t.attributes["title"] = "root"; -t.id = ROOT_ID; -tree.insertAsChild(0, ROOT_ID, t); - -t.attributes["title"] = "Finished"; -t.id = FINISHED_ID; -tree.insertAsChild(ROOT_ID, FINISHED_ID, t); - -t.attributes["title"] = "Backlog"; -t.id = BACKLOG_ID; -tree.insertAsChild(ROOT_ID, BACKLOG_ID, t); - -t.attributes["title"] = "Lost+Found"; -t.id = LOSTFOUND_ID; -tree.insertAsChild(ROOT_ID, LOSTFOUND_ID, t); - -t.attributes["title"] = "Projects"; -t.id = PROJECTS_ID; -tree.insertAsChild(ROOT_ID, PROJECTS_ID, t); - -TEST_EQUAL_INT(5, tree.bfs(0).size(), "Testing BFS function"); -TEST_EQUAL_INT(PROJECTS_ID, tree.data(PROJECTS_ID).id, "Testing project id"); -TEST_EQUAL_INT(ROOT_ID, tree.data(ROOT_ID).id, "Testing root id"); - -TEST_END; - -#endif/*TEST_TASKTREE*/ |