From 1ae51ff94d0f1f27a4e4cc657371578db13c3ca1 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 8 Feb 2019 20:26:14 +0100 Subject: Make code compile again (fix bitrot dating back from 2013). --- src/tasktree.cc | 596 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 322 insertions(+), 274 deletions(-) (limited to 'src/tasktree.cc') 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 + "\n"; - xml += prefix + " \n"; - std::map::iterator ai = data.attributes.begin(); - while(ai != data.attributes.end()) { - xml += prefix + " first) + "\">" - + xml_encode(ai->second) + "\n"; - ai++; - } - xml += prefix + " \n"; - xml += prefix + " \n"; - NodeList::iterator ni = children.begin(); - while(ni != children.end()) { - xml += (*ni)->toXML(prefix + " "); - ni++; - } - xml += prefix + " \n"; - xml += prefix + "\n"; - - return xml; + std::string xml; + + xml += prefix + "\n"; + xml += prefix + " \n"; + std::map::iterator ai = data.attributes.begin(); + while(ai != data.attributes.end()) + { + xml += prefix + " first) + "\">" + + xml_encode(ai->second) + "\n"; + ai++; + } + xml += prefix + " \n"; + xml += prefix + " \n"; + NodeList::iterator ni = children.begin(); + while(ni != children.end()) + { + xml += (*ni)->toXML(prefix + " "); + ni++; + } + xml += prefix + " \n"; + xml += prefix + "\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 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 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 += "\n"; - xml += "\n"; - xml += root->toXML(" "); - xml += ""; + std::string xml; + xml += "\n"; + xml += "\n"; + xml += root->toXML(" "); + xml += ""; - 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" -- cgit v1.2.3