From dc3c2ffe1a8d265ab80f31119f6a55f8850edb90 Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 24 Apr 2019 16:30:27 -0400 Subject: [PATCH] Adding remove demand method to toolkit --- src/epanet.c | 28 +++++++++++++--------------- tests/test_demand.cpp | 6 +++--- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 3138be3..02047c4 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -2527,12 +2527,12 @@ int DLLEXPORT EN_setjuncdata(EN_Project p, int index, double elev, } int DLLEXPORT EN_adddemand(EN_Project p, int node_index, double demand, - char *demand_pattern, const char *category_name, int *demand_index) + char *demand_pattern, const char *category_name, int *demand_key) { Network *net = &p->network; int pattern_index, error = 0; - *demand_index = -1; + *demand_key = -1; if (error = EN_getpatternindex(p, demand_pattern, &pattern_index) != 0) return error; @@ -2541,29 +2541,27 @@ int DLLEXPORT EN_adddemand(EN_Project p, int node_index, double demand, if (!demand_list) { demand_list = create_demand_list(demand/p->Ucf[FLOW], pattern_index, category_name); if (!demand_list) return 101; - + Node[node_index].D = demand_list; } else { demand_data_t *demand_data = create_demand_data(demand/p->Ucf[FLOW], pattern_index, category_name); if (!demand_data) return 101; - append_list(demand_list, &demand_data); + *demand_key = append_list(demand_list, &demand_data); } - - *demand_index = size_list(demand_list); return 0; } -int DLLEXPORT EN_removedemand(EN_Project p, int node_index, int demand_index) { - // Problem: Removing a demand will in most cases invalidate the index - // returned previously in EN_adddemand(). This occurs in all cases except - // when the demand at the tail of the list is removed. This is why indexing - // is a flawed strategy for random access to a list data structure. - // One possible solution is to have the user be responsible for creating a - // unique category name. Another possible solution would be for the - // application to create a unique key for each demand entry. They have - // random access based on searching for a key value in the list. +int DLLEXPORT EN_removedemand(EN_Project p, int node_index, int demand_key) +{ + Network *net = &p->network; + Snode *Node = net->Node; + + list_t *dlist = Node[node_index].D; + + remove_node(dlist, search_list(dlist, demand_key)); + return 0; } diff --git a/tests/test_demand.cpp b/tests/test_demand.cpp index fa3d4f9..1f8ead4 100644 --- a/tests/test_demand.cpp +++ b/tests/test_demand.cpp @@ -84,15 +84,15 @@ BOOST_AUTO_TEST_CASE(test_categories_reopen, * boost::unit_test::depends_on("tes BOOST_FIXTURE_TEST_CASE(test_adddemand, FixtureSingleNode) { - int demand_index; + int demand_key; - error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand", &demand_index); + error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand", &demand_key); BOOST_CHECK(error != 0); error = EN_addpattern(ph, (char *)"PrimaryPattern"); BOOST_REQUIRE(error == 0); - error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand", &demand_index); + error = EN_adddemand(ph, node_qhut, 100.0, "PrimaryPattern", "PrimaryDemand", &demand_key); BOOST_CHECK(error == 0); }