From d3e5b198afe44dcaafdf996b48cef39a2109e95d Mon Sep 17 00:00:00 2001 From: Kristian Flikka Date: Thu, 14 Nov 2013 16:05:13 +0100 Subject: [PATCH] Fixed a bug in the getNode recursion, added deep copy and print tree (debugging function) --- .../EclipseState/Schedule/GroupTree.cpp | 49 ++++++++++++++++--- .../EclipseState/Schedule/GroupTree.hpp | 7 +++ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/Schedule/GroupTree.cpp b/opm/parser/eclipse/EclipseState/Schedule/GroupTree.cpp index debc3836b..1297ad398 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/GroupTree.cpp +++ b/opm/parser/eclipse/EclipseState/Schedule/GroupTree.cpp @@ -18,6 +18,8 @@ */ #include +#include + #include @@ -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; + } + } + } \ No newline at end of file diff --git a/opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp b/opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp index d2ecb71fa..f3e1b1b35 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp @@ -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 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 GroupTreePtr;