diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/core_utils.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/core_utils.hpp index 9626d4940..cb7872dcd 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/core_utils.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/core_utils.hpp @@ -12,7 +12,26 @@ namespace detail { template constexpr void run_functor_with_tuple_index_return_void(Functor&& functor, std::index_sequence /*unused*/) { - (std::forward(functor).template operator()>(), ...); + if constexpr (sizeof...(Indices) == 1) { + (std::forward(functor).template operator()>(), ...); + } else { + (functor.template operator()>(), ...); + capturing::into_the_void(std::forward(functor)); + } +} + +template +constexpr auto run_functor_with_tuple_index_return_array(Functor&& functor, + std::index_sequence /*unused*/) { + if constexpr (sizeof...(Indices) == 1) { + return std::array { + std::forward(functor).template operator()>()... + }; + } else { + auto result = std::array { functor.template operator()>()... }; + capturing::into_the_void(std::forward(functor)); + return result; + } } } // namespace detail @@ -25,4 +44,9 @@ template constexpr void run_functor_with_tuple_r std::make_index_sequence>{}); } +template constexpr auto run_functor_with_tuple_return_array(Functor&& functor) { + return detail::run_functor_with_tuple_index_return_array( + std::forward(functor), std::make_index_sequence>{}); +} + } // namespace power_grid_model::main_core::utils diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/main_model_type.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/main_model_type.hpp index 32ba2ca73..d86c3729f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/main_model_type.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/main_model_type.hpp @@ -67,7 +67,6 @@ concept validate_component_types_c = template class MainModelType; -// TODO: discussion on checking dependent types can also be done here. template requires detail::validate_component_types_c> class MainModelType, ComponentList> { @@ -111,11 +110,11 @@ class MainModelType, ComponentLis using ComponentFlags = std::array; template static constexpr void run_functor_with_all_component_types_return_void(Functor&& functor) { - (std::forward(functor).template operator()(), ...); + return utils::run_functor_with_tuple_return_void(std::forward(functor)); } template static constexpr auto run_functor_with_all_component_types_return_array(Functor&& functor) { - return std::array { std::forward(functor).template operator()()... }; + return utils::run_functor_with_tuple_return_array(std::forward(functor)); } }; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/observability.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/observability.hpp index b73aac26e..985014837 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/observability.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/observability.hpp @@ -94,8 +94,8 @@ ObservabilitySensorsResult scan_network_sensors(MeasuredValues const& measu // we only need one flow sensor, so the loop will break Idx const branch = element.idx; Idx const neighbour_bus = y_bus_structure.col_indices[ybus_index]; - BusNeighbourhoodInfo::neighbour const neighbour_info{neighbour_bus, - ConnectivityStatus::has_no_measurement}; + BusNeighbourhoodInfo::neighbour const neighbour_info{.bus = neighbour_bus, + .status = ConnectivityStatus::has_no_measurement}; bus_neighbourhood_info[bus].direct_neighbours.push_back(neighbour_info); if (has_flow_sensor(branch) && is_branch_connected(branch)) { result.flow_sensors[ybus_index] = 1; @@ -231,7 +231,7 @@ inline void complete_bidirectional_neighbourhood_info(std::vector vec = { - {{2, 1}, {bft, 5}}, // pos (2,1) - {{0, 0}, {bff, 0}}, // pos (0,0) - {{1, 2}, {btf, 3}}, // pos (1,2) - {{0, 1}, {bft, 1}}, // pos (0,1) - {{2, 1}, {shunt, 6}}, // pos (2,1) - same position as first - {{1, 0}, {btf, 2}}, // pos (1,0) - {{2, 2}, {btt, 7}}, // pos (2,2) + {.pos = {2, 1}, .element = {.element_type = bft, .idx = 5}}, // pos (2,1) + {.pos = {0, 0}, .element = {.element_type = bff, .idx = 0}}, // pos (0,0) + {.pos = {1, 2}, .element = {.element_type = btf, .idx = 3}}, // pos (1,2) + {.pos = {0, 1}, .element = {.element_type = bft, .idx = 1}}, // pos (0,1) + {.pos = {2, 1}, .element = {.element_type = shunt, .idx = 6}}, // pos (2,1) - same position as first + {.pos = {1, 0}, .element = {.element_type = btf, .idx = 2}}, // pos (1,0) + {.pos = {2, 2}, .element = {.element_type = btt, .idx = 7}}, // pos (2,2) }; // Expected sorted order: by row first, then by column @@ -465,7 +465,7 @@ TEST_CASE("Test counting_sort_element") { } SUBCASE("Test with single bus") { - std::vector vec = {{{0, 0}, {shunt, 10}}}; + std::vector vec = {{.pos = {0, 0}, .element = {.element_type = shunt, .idx = 10}}}; counting_sort_element(vec, 1); @@ -483,9 +483,9 @@ TEST_CASE("Test counting_sort_element") { SUBCASE("Test stability - elements with same position maintain relative order") { std::vector vec = { - {{1, 1}, {bff, 100}}, - {{1, 1}, {bft, 200}}, - {{1, 1}, {shunt, 300}}, + {.pos = {1, 1}, .element = {.element_type = bff, .idx = 100}}, + {.pos = {1, 1}, .element = {.element_type = bft, .idx = 200}}, + {.pos = {1, 1}, .element = {.element_type = shunt, .idx = 300}}, }; counting_sort_element(vec, 2); @@ -510,7 +510,7 @@ TEST_CASE("Test counting_sort_element") { Idx const row = i / n_bus; Idx const col = i % n_bus; if ((row + col) % 3 == 0) { // Sparse pattern - vec.push_back({{row, col}, {bff, row * n_bus + col}}); + vec.push_back({.pos = {row, col}, .element = {.element_type = bff, .idx = row * n_bus + col}}); } } @@ -535,8 +535,13 @@ TEST_CASE("Test counting_sort_element") { SUBCASE("Test all YBusElementType values") { std::vector vec = { - {{1, 1}, {fill_in_tf, 6}}, {{0, 1}, {bft, 1}}, {{1, 0}, {btf, 2}}, {{0, 0}, {bff, 0}}, - {{1, 1}, {btt, 3}}, {{2, 2}, {shunt, 4}}, {{1, 2}, {fill_in_ft, 5}}, + {.pos = {1, 1}, .element = {.element_type = fill_in_tf, .idx = 6}}, + {.pos = {0, 1}, .element = {.element_type = bft, .idx = 1}}, + {.pos = {1, 0}, .element = {.element_type = btf, .idx = 2}}, + {.pos = {0, 0}, .element = {.element_type = bff, .idx = 0}}, + {.pos = {1, 1}, .element = {.element_type = btt, .idx = 3}}, + {.pos = {2, 2}, .element = {.element_type = shunt, .idx = 4}}, + {.pos = {1, 2}, .element = {.element_type = fill_in_ft, .idx = 5}}, }; counting_sort_element(vec, 3);