Merge pull request #1781 from joakim-hove/gtnode-bug

Bug: pointer -> to stack variable - fix with parent *name*
This commit is contained in:
Joakim Hove 2020-05-08 09:20:52 +02:00 committed by GitHub
commit 55620ac254
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 23 additions and 24 deletions

View File

@ -17,6 +17,7 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <optional>
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp>
@ -29,7 +30,7 @@ namespace Opm {
class GTNode {
public:
GTNode(const Group& group, const GTNode* parent);
GTNode(const Group& group, std::size_t level, const std::optional<std::string>& parent_name);
void add_group(const GTNode& child_group);
void add_well(const Well& well);
@ -37,14 +38,15 @@ public:
const std::vector<Well>& wells() const;
const std::vector<GTNode>& groups() const;
const std::string& name() const;
const GTNode& parent() const;
const std::string& parent_name() const;
const Group& group() const;
std::size_t level() const;
std::vector<const GTNode*> all_nodes() const;
private:
const Group m_group;
const GTNode * m_parent;
std::size_t m_level;
std::optional<std::string> m_parent_name;
/*
Class T with a stl container <T> - supposedly undefined behavior before
C++17 - but it compiles without warnings.

View File

@ -379,8 +379,7 @@ namespace Opm
DynamicState<std::shared_ptr<RPTConfig>> rpt_config;
void updateNetwork(std::shared_ptr<Network::ExtNetwork> network, std::size_t report_step);
GTNode groupTree(const std::string& root_node, std::size_t report_step, const GTNode * parent) const;
GTNode groupTree(const std::string& root_node, std::size_t report_step, std::size_t level, const std::optional<std::string>& parent_name) const;
void updateGroup(std::shared_ptr<Group> group, size_t reportStep);
bool checkGroups(const ParseContext& parseContext, ErrorGuard& errors);
void updateUDQActive( std::size_t timeStep, std::shared_ptr<UDQActive> udq );

View File

@ -392,7 +392,7 @@ namespace {
}
const std::string& group_parent(const context&, std::size_t, std::size_t) const {
return node.parent().group().name();
return node.parent_name();
}
};

View File

@ -21,10 +21,12 @@
namespace Opm {
GTNode::GTNode(const Group& group_arg, const GTNode * parent_arg) :
GTNode::GTNode(const Group& group_arg, std::size_t level, const std::optional<std::string>& parent_name) :
m_group(group_arg),
m_parent(parent_arg)
{}
m_level(level),
m_parent_name(parent_name)
{
}
const std::string& GTNode::name() const {
return this->m_group.name();
@ -34,9 +36,9 @@ const Group& GTNode::group() const {
return this->m_group;
}
const GTNode& GTNode::parent() const {
if (this->m_parent)
return *this->m_parent;
const std::string& GTNode::parent_name() const {
if (this->m_parent_name.has_value())
return *this->m_parent_name;
throw std::invalid_argument("Tried to access parent of root in GroupTree. Root: " + this->name());
}
@ -70,11 +72,7 @@ std::vector<const GTNode*> GTNode::all_nodes() const {
}
std::size_t GTNode::level() const {
if (!m_parent) {
return 0;
} else {
return m_parent->level() + 1;
}
return this->m_level;
}
}

View File

@ -2243,9 +2243,9 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step, const GTNode * parent) const {
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step, std::size_t level, const std::optional<std::string>& parent_name) const {
auto root_group = this->getGroup(root_node, report_step);
GTNode tree(root_group, parent);
GTNode tree(root_group, level, parent_name);
for (const auto& wname : root_group.wells()) {
const auto& well = this->getWell(wname, report_step);
@ -2253,7 +2253,7 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
for (const auto& gname : root_group.groups()) {
auto child_group = this->groupTree(gname, report_step, std::addressof(tree));
auto child_group = this->groupTree(gname, report_step, level + 1, root_node);
tree.add_group(child_group);
}
@ -2261,7 +2261,7 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step) const {
return this->groupTree(root_node, report_step, nullptr);
return this->groupTree(root_node, report_step, 0, {});
}

View File

@ -462,13 +462,13 @@ BOOST_AUTO_TEST_CASE(GroupTree2TEST) {
auto gt = schedule.groupTree(0);
BOOST_CHECK_EQUAL(gt.wells().size(), 0);
BOOST_CHECK_EQUAL(gt.group().name(), "FIELD");
BOOST_CHECK_THROW(gt.parent(), std::invalid_argument);
BOOST_CHECK_THROW(gt.parent_name(), std::invalid_argument);
auto cg = gt.groups();
auto pg = cg[0];
BOOST_CHECK_EQUAL(cg.size(), 1);
BOOST_CHECK_EQUAL(pg.group().name(), "PLATFORM");
BOOST_CHECK_EQUAL(pg.parent().name(), "FIELD");
BOOST_CHECK_EQUAL(pg.parent_name(), "FIELD");
}