From aed0fb34803583fa2615f81d04c8cf808a1f9c33 Mon Sep 17 00:00:00 2001 From: Jonas Suhr Christensen Date: Fri, 30 Mar 2012 12:05:22 +0200 Subject: Updated interfaces. --- src/tasktree.cc | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 src/tasktree.cc (limited to 'src/tasktree.cc') diff --git a/src/tasktree.cc b/src/tasktree.cc new file mode 100644 index 0000000..e44efee --- /dev/null +++ b/src/tasktree.cc @@ -0,0 +1,213 @@ +/* -*- 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 "debug.h" + + +TaskTree::TaskTree() { + root = NULL; +} + +TaskTree::~TaskTree() { + // cleanup tree +} + +TaskIdList TaskTree::insertAsChild(taskid_t parentid, taskid_t id, task_t data) + throw (std::exception) { + + TaskIdList affectedNodes; + + // Initialize + if(!root) { + node_t* node = createNode(id); + root = node; + + affectedNodes.push_back(id); + + goto finish; + } + + try { + node_t* parent = id2node.at(parentid); + node_t* child = createNode(id); + child->data = data; + insertChild(parent, child); + + affectedNodes.push_back(parentid); + affectedNodes.push_back(id); + + goto finish; + } + catch(std::exception& e) { + throw e; + } + + finish: + return affectedNodes; +} + +TaskIdList TaskTree::remove(taskid_t id) + throw (std::exception) { + //todo: move all childrin to lost+found + WARN(tasktree, "Feature not implemneted yet\n"); + TaskIdList affectedNodes; + return affectedNodes; +} + +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); + + if(!child->parent) { + throw std::exception(); + } + + child->parent->children.remove(child); + newparent->children.push_back(child); + + affectedNodes.push_back(id); + affectedNodes.push_back(child->parent->id); + affectedNodes.push_back(toid); + + goto finish; + } + catch(std::exception& e) { + throw e; + } + + finish: + return affectedNodes; +} + +TaskIdList TaskTree::updateData(taskid_t id, task_t t) + throw (std::exception) { + + TaskIdList affectedNodes; + + try { + node_t* node = id2node.at(id); + node->data = t; + + affectedNodes.push_back(id); + goto finish; + } + catch(std::exception& e) { + throw e; + } + + finish: + return affectedNodes; +} + +task_t TaskTree::getData(taskid_t id) + throw (std::exception) { + + task_t t; + + try { + node_t* node = id2node.at(id); + t = node->data; + goto finish; + } + catch(std::exception& e) { + throw e; + } + + finish: + return t; +} + +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; + } + goto finish; + } + catch(std::exception& e) { + throw e; + } + + finish: + 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) { + parent->children.push_back(child); + child->parent = parent; +} + + + +#ifdef TEST_TASKTREE +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" +#include + +TEST_BEGIN; + +TaskTree tree; + +task_t t; +try { + tree.insertAsChild(-1, t); + } + catch(std::exeception& e) { + } + +// TODO: Put some testcode here (see test.h for usable macros). +TEST_TRUE(false, "No tests yet!"); + +TEST_END; + +#endif/*TEST_TASKTREE*/ -- cgit v1.2.3