summaryrefslogtreecommitdiff
path: root/src/tasktree.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tasktree.cc')
-rw-r--r--src/tasktree.cc596
1 files changed, 322 insertions, 274 deletions
diff --git a/src/tasktree.cc b/src/tasktree.cc
index 39cee98..30494e9 100644
--- a/src/tasktree.cc
+++ b/src/tasktree.cc
@@ -39,348 +39,396 @@
static inline std::string id2str(taskid_t id)
{
- char buf[32];
- sprintf(buf, "%u", id);
- return buf;
+ 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;
+ 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(
- // }
+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()
+{
+ root = NULL;
+ nextid = 10;
}
-TaskTree::~TaskTree() {
- // cleanup tree
+TaskTree::~TaskTree()
+{
+ // cleanup tree
}
-taskid_t TaskTree::createId() {
- taskid_t taskid;
+taskid_t TaskTree::createId()
+{
+ taskid_t taskid;
- do {
- taskid = nextid++;
- } while(id2node.find(taskid) != id2node.end());
+ do
+ {
+ taskid = nextid++;
+ }
+ while(id2node.find(taskid) != id2node.end());
- return taskid;
+ return taskid;
}
static taskid_t rootid = -1;
-TaskIdList TaskTree::insertAsChild(taskid_t parentid, taskid_t id, task_t data)
- throw (std::exception)
+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 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 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;
+ 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;
+ 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 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 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)
+ 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;
+ 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 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;
+ 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 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 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)
+ 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;
+ 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;
+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;
+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);
- }
+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, "");
+void TaskTree::toStdOut()
+{
+ printNode(root, "");
}
std::string TaskTree::toXML()
{
- node_t *root = id2node.at(rootid);
+ 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>";
+ 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;
+ return xml;
}
void TaskTree::fromXML(std::string xml)
{
- XmlParser p(this);
- p.parse(xml.c_str(), xml.size());
+ XmlParser p(this);
+ p.parse(xml.c_str(), xml.size());
}
#ifdef TEST_TASKTREE
//Additional dependency files
-//deps: debug.cc log.cc
+//deps: debug.cc log.cc
//Required cflags (autoconf vars may be used)
-//cflags: -I..
+//cflags: -I..
//Required link options (autoconf vars may be used)
//libs:
#include "test.h"