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;