Skip to content

Commit 02f9fd4

Browse files
authored
Merge pull request #828 from PowerGridModel/feature/optional-id-refactor-part2
Optional ID structural refactor
2 parents cf7cdf6 + 1f5bb5f commit 02f9fd4

File tree

11 files changed

+401
-356
lines changed

11 files changed

+401
-356
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
2+
//
3+
// SPDX-License-Identifier: MPL-2.0
4+
5+
#pragma once
6+
7+
#include "../all_components.hpp"
8+
#include "../container.hpp"
9+
10+
#include <array>
11+
#include <vector>
12+
13+
namespace power_grid_model::main_core::utils {
14+
15+
template <class... ComponentTypes> constexpr size_t n_types = sizeof...(ComponentTypes);
16+
template <class CompType, class... ComponentTypes>
17+
constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentTypes...>;
18+
19+
template <class... ComponentTypes> using SequenceIdx = std::array<std::vector<Idx2D>, n_types<ComponentTypes...>>;
20+
template <class... ComponentTypes> using ComponentFlags = std::array<bool, n_types<ComponentTypes...>>;
21+
22+
// run functors with all component types
23+
template <class... Types, class Functor> constexpr void run_functor_with_all_types_return_void(Functor functor) {
24+
(functor.template operator()<Types>(), ...);
25+
}
26+
template <class... Types, class Functor> constexpr auto run_functor_with_all_types_return_array(Functor functor) {
27+
return std::array { functor.template operator()<Types>()... };
28+
}
29+
30+
} // namespace power_grid_model::main_core::utils

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state_queries.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ constexpr Idx get_component_group_idx(MainModelState<ComponentContainer> const&
4141

4242
template <typename ComponentType, class ComponentContainer>
4343
requires model_component_state_c<MainModelState, ComponentContainer, ComponentType>
44-
inline Idx get_component_sequence(MainModelState<ComponentContainer> const& state, auto const& id_or_index) {
44+
inline Idx get_component_sequence_idx(MainModelState<ComponentContainer> const& state, auto const& id_or_index) {
4545
return state.components.template get_seq<ComponentType>(id_or_index);
4646
}
4747

@@ -97,19 +97,19 @@ constexpr auto get_component_citer(MainModelState<ComponentContainer> const& sta
9797
template <std::derived_from<Branch> ComponentType, class ComponentContainer>
9898
requires model_component_state_c<MainModelState, ComponentContainer, ComponentType>
9999
constexpr auto get_topology_index(MainModelState<ComponentContainer> const& state, auto const& id_or_index) {
100-
return get_component_sequence<Branch>(state, id_or_index);
100+
return get_component_sequence_idx<Branch>(state, id_or_index);
101101
}
102102

103103
template <std::derived_from<Branch3> ComponentType, class ComponentContainer>
104104
requires model_component_state_c<MainModelState, ComponentContainer, ComponentType>
105105
constexpr auto get_topology_index(MainModelState<ComponentContainer> const& state, auto const& id_or_index) {
106-
return get_component_sequence<Branch3>(state, id_or_index);
106+
return get_component_sequence_idx<Branch3>(state, id_or_index);
107107
}
108108

109109
template <std::derived_from<Regulator> ComponentType, class ComponentContainer>
110110
requires model_component_state_c<MainModelState, ComponentContainer, ComponentType>
111111
constexpr auto get_topology_index(MainModelState<ComponentContainer> const& state, auto const& id_or_index) {
112-
return get_component_sequence<Regulator>(state, id_or_index);
112+
return get_component_sequence_idx<Regulator>(state, id_or_index);
113113
}
114114

115115
template <std::derived_from<Branch> ComponentType, class ComponentContainer>

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ template <std::same_as<Branch> Component, class ComponentContainer>
4040
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
4141
ComponentTopology& comp_topo) {
4242
detail::register_topo_components<Component>(state, comp_topo.branch_node_idx, [&state](Branch const& branch) {
43-
return BranchIdx{get_component_sequence<Node>(state, branch.from_node()),
44-
get_component_sequence<Node>(state, branch.to_node())};
43+
return BranchIdx{get_component_sequence_idx<Node>(state, branch.from_node()),
44+
get_component_sequence_idx<Node>(state, branch.to_node())};
4545
});
4646
}
4747

@@ -50,9 +50,9 @@ template <std::same_as<Branch3> Component, class ComponentContainer>
5050
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
5151
ComponentTopology& comp_topo) {
5252
detail::register_topo_components<Component>(state, comp_topo.branch3_node_idx, [&state](Branch3 const& branch3) {
53-
return Branch3Idx{get_component_sequence<Node>(state, branch3.node_1()),
54-
get_component_sequence<Node>(state, branch3.node_2()),
55-
get_component_sequence<Node>(state, branch3.node_3())};
53+
return Branch3Idx{get_component_sequence_idx<Node>(state, branch3.node_1()),
54+
get_component_sequence_idx<Node>(state, branch3.node_2()),
55+
get_component_sequence_idx<Node>(state, branch3.node_3())};
5656
});
5757
}
5858

@@ -61,7 +61,7 @@ template <std::same_as<Source> Component, class ComponentContainer>
6161
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
6262
ComponentTopology& comp_topo) {
6363
detail::register_topo_components<Component>(state, comp_topo.source_node_idx, [&state](Source const& source) {
64-
return get_component_sequence<Node>(state, source.node());
64+
return get_component_sequence_idx<Node>(state, source.node());
6565
});
6666
}
6767

@@ -70,7 +70,7 @@ template <std::same_as<Shunt> Component, class ComponentContainer>
7070
constexpr void register_topology_components(MainModelState<ComponentContainer> const& state,
7171
ComponentTopology& comp_topo) {
7272
detail::register_topo_components<Component>(state, comp_topo.shunt_node_idx, [&state](Shunt const& shunt) {
73-
return get_component_sequence<Node>(state, shunt.node());
73+
return get_component_sequence_idx<Node>(state, shunt.node());
7474
});
7575
}
7676

@@ -80,7 +80,7 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
8080
ComponentTopology& comp_topo) {
8181
detail::register_topo_components<Component>(
8282
state, comp_topo.load_gen_node_idx,
83-
[&state](GenericLoadGen const& load_gen) { return get_component_sequence<Node>(state, load_gen.node()); });
83+
[&state](GenericLoadGen const& load_gen) { return get_component_sequence_idx<Node>(state, load_gen.node()); });
8484

8585
detail::register_topo_components<Component>(state, comp_topo.load_gen_type,
8686
[](GenericLoadGen const& load_gen) { return load_gen.type(); });
@@ -92,7 +92,7 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
9292
ComponentTopology& comp_topo) {
9393
detail::register_topo_components<Component>(
9494
state, comp_topo.voltage_sensor_node_idx, [&state](GenericVoltageSensor const& voltage_sensor) {
95-
return get_component_sequence<Node>(state, voltage_sensor.measured_object());
95+
return get_component_sequence_idx<Node>(state, voltage_sensor.measured_object());
9696
});
9797
}
9898

@@ -110,21 +110,21 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
110110
case branch_from:
111111
[[fallthrough]];
112112
case branch_to:
113-
return get_component_sequence<Branch>(state, measured_object);
113+
return get_component_sequence_idx<Branch>(state, measured_object);
114114
case source:
115-
return get_component_sequence<Source>(state, measured_object);
115+
return get_component_sequence_idx<Source>(state, measured_object);
116116
case shunt:
117-
return get_component_sequence<Shunt>(state, measured_object);
117+
return get_component_sequence_idx<Shunt>(state, measured_object);
118118
case load:
119119
[[fallthrough]];
120120
case generator:
121-
return get_component_sequence<GenericLoadGen>(state, measured_object);
121+
return get_component_sequence_idx<GenericLoadGen>(state, measured_object);
122122
case branch3_1:
123123
case branch3_2:
124124
case branch3_3:
125-
return get_component_sequence<Branch3>(state, measured_object);
125+
return get_component_sequence_idx<Branch3>(state, measured_object);
126126
case node:
127-
return get_component_sequence<Node>(state, measured_object);
127+
return get_component_sequence_idx<Node>(state, measured_object);
128128
default:
129129
throw MissingCaseForEnumError("Power sensor idx to seq transformation",
130130
power_sensor.get_terminal_type());
@@ -144,9 +144,9 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
144144
state, comp_topo.regulated_object_idx, [&state](Regulator const& regulator) {
145145
switch (regulator.regulated_object_type()) {
146146
case ComponentType::branch:
147-
return get_component_sequence<Branch>(state, regulator.regulated_object());
147+
return get_component_sequence_idx<Branch>(state, regulator.regulated_object());
148148
case ComponentType::branch3:
149-
return get_component_sequence<Branch3>(state, regulator.regulated_object());
149+
return get_component_sequence_idx<Branch3>(state, regulator.regulated_object());
150150
default:
151151
throw MissingCaseForEnumError("Regulator idx to seq transformation", regulator.regulated_object_type());
152152
}

0 commit comments

Comments
 (0)