Fixed a bug in the getNode recursion, added deep copy and print tree (debugging function)

This commit is contained in:
Kristian Flikka 2013-11-14 16:05:13 +01:00
parent 07827a1751
commit d3e5b198af
2 changed files with 50 additions and 6 deletions

View File

@ -18,6 +18,8 @@
*/
#include <stdexcept>
#include <iostream>
#include <opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp>
@ -27,7 +29,7 @@ namespace Opm {
GroupTree::GroupTree() {
m_root = GroupTreeNode::createFieldNode();
}
GroupTreeNodePtr GroupTree::updateTree(const std::string& childName) {
if (getNode(childName)) {
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
@ -35,18 +37,17 @@ namespace Opm {
return m_root->addChildGroup(childName);
}
GroupTreeNodePtr GroupTree::updateTree(const std::string& childName, const std::string& parentName ) {
GroupTreeNodePtr GroupTree::updateTree(const std::string& childName, const std::string& parentName) {
if (getNode(childName)) {
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
}
GroupTreeNodePtr parentNode = getNode(parentName);
if (!parentNode){
if (!parentNode) {
parentNode = updateTree(parentName);
}
return parentNode->addChildGroup(childName);
}
GroupTreeNodePtr GroupTree::getNode(const std::string& nodeName) const {
GroupTreeNodePtr current = m_root;
return getNode(nodeName, current);
@ -58,8 +59,9 @@ namespace Opm {
} else {
auto iter = current->begin();
while (iter != current->end()) {
if (getNode(nodeName, (*iter).second)) {
return (*iter).second;
GroupTreeNodePtr result = getNode(nodeName, (*iter).second);
if (result) {
return result;
}
++iter;
}
@ -67,4 +69,39 @@ namespace Opm {
}
}
GroupTreePtr GroupTree::deepCopy() const {
GroupTreePtr newTree(new GroupTree());
GroupTreeNodePtr currentOriginNode = m_root;
GroupTreeNodePtr currentNewNode = newTree->getNode("FIELD");
deepCopy(currentOriginNode, currentNewNode);
return newTree;
}
void GroupTree::deepCopy(GroupTreeNodePtr origin, GroupTreeNodePtr copy) const {
auto iter = origin->begin();
while (iter != origin->end()) {
GroupTreeNodePtr originChild = (*iter).second;
GroupTreeNodePtr copyChild = copy->addChildGroup(originChild->name());
deepCopy(originChild, copyChild);
++iter;
}
}
void GroupTree::printTree() const {
printTree(m_root);
}
void GroupTree::printTree(GroupTreeNodePtr fromNode) const {
auto iter = fromNode->begin();
while (iter != fromNode->end()) {
GroupTreeNodePtr child = (*iter).second;
std::cout << fromNode->name() << "(" << fromNode.get() << ")" << "<-" << child->name() << "(" << child.get() << ")" << std::endl;
printTree(child);
++iter;
}
}
}

View File

@ -35,11 +35,18 @@ namespace Opm {
GroupTreeNodePtr updateTree(const std::string& childName, const std::string& parentName );
GroupTreeNodePtr getNode(const std::string& nodeName) const;
boost::shared_ptr<GroupTree> deepCopy() const;
void printTree() const;
private:
GroupTreeNodePtr m_root;
GroupTreeNodePtr getNode(const std::string& nodeName, GroupTreeNodePtr current) const;
void deepCopy(GroupTreeNodePtr origin, GroupTreeNodePtr copy) const;
void printTree(GroupTreeNodePtr fromNode) const;
};
typedef boost::shared_ptr<GroupTree> GroupTreePtr;