Fixed a bug in the getNode recursion, added deep copy and print tree (debugging function)
This commit is contained in:
parent
07827a1751
commit
d3e5b198af
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
#include <opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp>
|
#include <opm/parser/eclipse/EclipseState/Schedule/GroupTree.hpp>
|
||||||
|
|
||||||
@ -27,7 +29,7 @@ namespace Opm {
|
|||||||
GroupTree::GroupTree() {
|
GroupTree::GroupTree() {
|
||||||
m_root = GroupTreeNode::createFieldNode();
|
m_root = GroupTreeNode::createFieldNode();
|
||||||
}
|
}
|
||||||
|
|
||||||
GroupTreeNodePtr GroupTree::updateTree(const std::string& childName) {
|
GroupTreeNodePtr GroupTree::updateTree(const std::string& childName) {
|
||||||
if (getNode(childName)) {
|
if (getNode(childName)) {
|
||||||
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
|
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
|
||||||
@ -35,18 +37,17 @@ namespace Opm {
|
|||||||
return m_root->addChildGroup(childName);
|
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)) {
|
if (getNode(childName)) {
|
||||||
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
|
throw std::invalid_argument("Node \"" + childName + "\" is already in tree, cannot move (yet)");
|
||||||
}
|
}
|
||||||
GroupTreeNodePtr parentNode = getNode(parentName);
|
GroupTreeNodePtr parentNode = getNode(parentName);
|
||||||
if (!parentNode){
|
if (!parentNode) {
|
||||||
parentNode = updateTree(parentName);
|
parentNode = updateTree(parentName);
|
||||||
}
|
}
|
||||||
return parentNode->addChildGroup(childName);
|
return parentNode->addChildGroup(childName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GroupTreeNodePtr GroupTree::getNode(const std::string& nodeName) const {
|
GroupTreeNodePtr GroupTree::getNode(const std::string& nodeName) const {
|
||||||
GroupTreeNodePtr current = m_root;
|
GroupTreeNodePtr current = m_root;
|
||||||
return getNode(nodeName, current);
|
return getNode(nodeName, current);
|
||||||
@ -58,8 +59,9 @@ namespace Opm {
|
|||||||
} else {
|
} else {
|
||||||
auto iter = current->begin();
|
auto iter = current->begin();
|
||||||
while (iter != current->end()) {
|
while (iter != current->end()) {
|
||||||
if (getNode(nodeName, (*iter).second)) {
|
GroupTreeNodePtr result = getNode(nodeName, (*iter).second);
|
||||||
return (*iter).second;
|
if (result) {
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
++iter;
|
++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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -35,11 +35,18 @@ namespace Opm {
|
|||||||
GroupTreeNodePtr updateTree(const std::string& childName, const std::string& parentName );
|
GroupTreeNodePtr updateTree(const std::string& childName, const std::string& parentName );
|
||||||
|
|
||||||
GroupTreeNodePtr getNode(const std::string& nodeName) const;
|
GroupTreeNodePtr getNode(const std::string& nodeName) const;
|
||||||
|
boost::shared_ptr<GroupTree> deepCopy() const;
|
||||||
|
void printTree() const;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GroupTreeNodePtr m_root;
|
GroupTreeNodePtr m_root;
|
||||||
GroupTreeNodePtr getNode(const std::string& nodeName, GroupTreeNodePtr current) const;
|
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;
|
typedef boost::shared_ptr<GroupTree> GroupTreePtr;
|
||||||
|
Loading…
Reference in New Issue
Block a user