@@ -14,13 +14,13 @@ namespace power_grid_model::main_core {
1414namespace detail {
1515
1616template <typename Component, class ComponentContainer , typename ResType, typename ResFunc>
17- requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
17+ requires component_container_c< ComponentContainer, Component> &&
1818 std::invocable<std::remove_cvref_t <ResFunc>, Component const &> &&
1919 std::convertible_to<std::invoke_result_t <ResFunc, Component const &>, ResType>
20- constexpr void register_topo_components (MainModelState< ComponentContainer> const & state , std::vector<ResType>& target,
20+ constexpr void register_topo_components (ComponentContainer const & components , std::vector<ResType>& target,
2121 ResFunc&& func) {
22- auto const begin = get_component_citer <Component>(state ).begin ();
23- auto const end = get_component_citer <Component>(state ).end ();
22+ auto const begin = components. template citer <Component>().begin ();
23+ auto const end = components. template citer <Component>().end ();
2424
2525 target.resize (std::distance (begin, end));
2626 std::transform (begin, end, target.begin (), std::forward<ResFunc>(func));
@@ -29,80 +29,75 @@ constexpr void register_topo_components(MainModelState<ComponentContainer> const
2929} // namespace detail
3030
3131template <std::same_as<Node> Component, class ComponentContainer >
32- requires model_component_state_c<MainModelState, ComponentContainer, Component>
33- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
34- ComponentTopology& comp_topo) {
35- comp_topo.n_node = get_component_size<Node>(state.components );
32+ requires component_container_c<ComponentContainer, Component>
33+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
34+ comp_topo.n_node = get_component_size<Node>(components);
3635}
3736
3837template <std::same_as<Branch> Component, class ComponentContainer >
39- requires model_component_state_c<MainModelState, ComponentContainer, Component>
40- constexpr void register_topology_components (MainModelState< ComponentContainer> const & state,
41- ComponentTopology& comp_topo) {
42- detail::register_topo_components<Component>(state , comp_topo.branch_node_idx , [&state ](Branch const & branch) {
43- return BranchIdx{get_component_sequence_idx<Node>(state. components , branch.from_node ()),
44- get_component_sequence_idx<Node>(state. components , branch.to_node ())};
45- });
38+ requires multi_extended_component_container_c< ComponentContainer, Component, Node >
39+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
40+ detail::register_topo_components<Component>(
41+ components , comp_topo.branch_node_idx , [&components ](Branch const & branch) {
42+ return BranchIdx{get_component_sequence_idx<Node>(components, branch.from_node ()),
43+ get_component_sequence_idx<Node>(components, branch.to_node ())};
44+ });
4645}
4746
4847template <std::same_as<Branch3> Component, class ComponentContainer >
49- requires model_component_state_c<MainModelState, ComponentContainer, Component>
50- constexpr void register_topology_components (MainModelState< ComponentContainer> const & state,
51- ComponentTopology& comp_topo) {
52- detail::register_topo_components<Component>(state , comp_topo.branch3_node_idx , [&state ](Branch3 const & branch3) {
53- return Branch3Idx{get_component_sequence_idx<Node>(state. components , branch3.node_1 ()),
54- get_component_sequence_idx<Node>(state. components , branch3.node_2 ()),
55- get_component_sequence_idx<Node>(state. components , branch3.node_3 ())};
56- });
48+ requires multi_extended_component_container_c< ComponentContainer, Component, Node >
49+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
50+ detail::register_topo_components<Component>(
51+ components , comp_topo.branch3_node_idx , [&components ](Branch3 const & branch3) {
52+ return Branch3Idx{get_component_sequence_idx<Node>(components, branch3.node_1 ()),
53+ get_component_sequence_idx<Node>(components, branch3.node_2 ()),
54+ get_component_sequence_idx<Node>(components, branch3.node_3 ())};
55+ });
5756}
5857
5958template <std::same_as<Source> Component, class ComponentContainer >
60- requires model_component_state_c<MainModelState, ComponentContainer, Component>
61- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
62- ComponentTopology& comp_topo) {
63- detail::register_topo_components<Component>(state, comp_topo.source_node_idx , [&state](Source const & source) {
64- return get_component_sequence_idx<Node>(state.components , source.node ());
65- });
59+ requires multi_extended_component_container_c<ComponentContainer, Component, Node>
60+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
61+ detail::register_topo_components<Component>(
62+ components, comp_topo.source_node_idx ,
63+ [&components](Source const & source) { return get_component_sequence_idx<Node>(components, source.node ()); });
6664}
6765
6866template <std::same_as<Shunt> Component, class ComponentContainer >
69- requires model_component_state_c<MainModelState, ComponentContainer, Component>
70- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
71- ComponentTopology& comp_topo) {
72- detail::register_topo_components<Component>(state, comp_topo.shunt_node_idx , [&state](Shunt const & shunt) {
73- return get_component_sequence_idx<Node>(state.components , shunt.node ());
74- });
67+ requires multi_extended_component_container_c<ComponentContainer, Component, Node>
68+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
69+ detail::register_topo_components<Component>(
70+ components, comp_topo.shunt_node_idx ,
71+ [&components](Shunt const & shunt) { return get_component_sequence_idx<Node>(components, shunt.node ()); });
7572}
7673
7774template <std::same_as<GenericLoadGen> Component, class ComponentContainer >
78- requires model_component_state_c<MainModelState, ComponentContainer, Component>
79- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
80- ComponentTopology& comp_topo) {
75+ requires multi_extended_component_container_c<ComponentContainer, Component, Node>
76+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
8177 detail::register_topo_components<Component>(
82- state , comp_topo.load_gen_node_idx , [&state ](GenericLoadGen const & load_gen) {
83- return get_component_sequence_idx<Node>(state. components , load_gen.node ());
78+ components , comp_topo.load_gen_node_idx , [&components ](GenericLoadGen const & load_gen) {
79+ return get_component_sequence_idx<Node>(components, load_gen.node ());
8480 });
8581
86- detail::register_topo_components<Component>(state , comp_topo.load_gen_type ,
82+ detail::register_topo_components<Component>(components , comp_topo.load_gen_type ,
8783 [](GenericLoadGen const & load_gen) { return load_gen.type (); });
8884}
8985
9086template <std::same_as<GenericVoltageSensor> Component, class ComponentContainer >
91- requires model_component_state_c<MainModelState, ComponentContainer, Component>
92- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
93- ComponentTopology& comp_topo) {
87+ requires multi_extended_component_container_c<ComponentContainer, Component, Node>
88+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
9489 detail::register_topo_components<Component>(
95- state , comp_topo.voltage_sensor_node_idx , [&state ](GenericVoltageSensor const & voltage_sensor) {
96- return get_component_sequence_idx<Node>(state. components , voltage_sensor.measured_object ());
90+ components , comp_topo.voltage_sensor_node_idx , [&components ](GenericVoltageSensor const & voltage_sensor) {
91+ return get_component_sequence_idx<Node>(components, voltage_sensor.measured_object ());
9792 });
9893}
9994
10095template <std::same_as<GenericPowerSensor> Component, class ComponentContainer >
101- requires model_component_state_c<MainModelState, ComponentContainer, Component>
102- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
103- ComponentTopology& comp_topo) {
96+ requires multi_extended_component_container_c< ComponentContainer, Component, Branch, Source, Shunt, GenericLoadGen,
97+ Branch3, Node>
98+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
10499 detail::register_topo_components<Component>(
105- state , comp_topo.power_sensor_object_idx , [&state ](GenericPowerSensor const & power_sensor) {
100+ components , comp_topo.power_sensor_object_idx , [&components ](GenericPowerSensor const & power_sensor) {
106101 using enum MeasuredTerminalType;
107102
108103 auto const measured_object = power_sensor.measured_object ();
@@ -111,40 +106,39 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
111106 case branch_from:
112107 [[fallthrough]];
113108 case branch_to:
114- return get_component_sequence_idx<Branch>(state. components , measured_object);
109+ return get_component_sequence_idx<Branch>(components, measured_object);
115110 case source:
116- return get_component_sequence_idx<Source>(state. components , measured_object);
111+ return get_component_sequence_idx<Source>(components, measured_object);
117112 case shunt:
118- return get_component_sequence_idx<Shunt>(state. components , measured_object);
113+ return get_component_sequence_idx<Shunt>(components, measured_object);
119114 case load:
120115 [[fallthrough]];
121116 case generator:
122- return get_component_sequence_idx<GenericLoadGen>(state. components , measured_object);
117+ return get_component_sequence_idx<GenericLoadGen>(components, measured_object);
123118 case branch3_1:
124119 [[fallthrough]];
125120 case branch3_2:
126121 [[fallthrough]];
127122 case branch3_3:
128- return get_component_sequence_idx<Branch3>(state. components , measured_object);
123+ return get_component_sequence_idx<Branch3>(components, measured_object);
129124 case node:
130- return get_component_sequence_idx<Node>(state. components , measured_object);
125+ return get_component_sequence_idx<Node>(components, measured_object);
131126 default :
132127 throw MissingCaseForEnumError (" Power sensor idx to seq transformation" ,
133128 power_sensor.get_terminal_type ());
134129 }
135130 });
136131
137132 detail::register_topo_components<Component>(
138- state , comp_topo.power_sensor_terminal_type ,
133+ components , comp_topo.power_sensor_terminal_type ,
139134 [](GenericPowerSensor const & power_sensor) { return power_sensor.get_terminal_type (); });
140135}
141136
142137template <std::same_as<GenericCurrentSensor> Component, class ComponentContainer >
143- requires model_component_state_c<MainModelState, ComponentContainer, Component>
144- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
145- ComponentTopology& comp_topo) {
138+ requires multi_extended_component_container_c<ComponentContainer, Component, Branch, Branch3>
139+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
146140 detail::register_topo_components<Component>(
147- state , comp_topo.current_sensor_object_idx , [&state ](GenericCurrentSensor const & current_sensor) {
141+ components , comp_topo.current_sensor_object_idx , [&components ](GenericCurrentSensor const & current_sensor) {
148142 using enum MeasuredTerminalType;
149143
150144 auto const measured_object = current_sensor.measured_object ();
@@ -153,57 +147,56 @@ constexpr void register_topology_components(MainModelState<ComponentContainer> c
153147 case branch_from:
154148 [[fallthrough]];
155149 case branch_to:
156- return get_component_sequence_idx<Branch>(state. components , measured_object);
150+ return get_component_sequence_idx<Branch>(components, measured_object);
157151 case branch3_1:
158152 [[fallthrough]];
159153 case branch3_2:
160154 [[fallthrough]];
161155 case branch3_3:
162- return get_component_sequence_idx<Branch3>(state. components , measured_object);
156+ return get_component_sequence_idx<Branch3>(components, measured_object);
163157 default :
164158 throw MissingCaseForEnumError (" Current sensor idx to seq transformation" ,
165159 current_sensor.get_terminal_type ());
166160 }
167161 });
168162
169163 detail::register_topo_components<Component>(
170- state , comp_topo.current_sensor_terminal_type ,
164+ components , comp_topo.current_sensor_terminal_type ,
171165 [](GenericCurrentSensor const & current_sensor) { return current_sensor.get_terminal_type (); });
172166}
173167
174168template <std::derived_from<Regulator> Component, class ComponentContainer >
175- requires model_component_state_c<MainModelState, ComponentContainer, Component>
176- constexpr void register_topology_components (MainModelState<ComponentContainer> const & state,
177- ComponentTopology& comp_topo) {
169+ requires multi_extended_component_container_c<ComponentContainer, Component, Branch, Branch3>
170+ constexpr void register_topology_components (ComponentContainer const & components, ComponentTopology& comp_topo) {
178171 detail::register_topo_components<Component>(
179- state , comp_topo.regulated_object_idx , [&state ](Regulator const & regulator) {
172+ components , comp_topo.regulated_object_idx , [&components ](Regulator const & regulator) {
180173 switch (regulator.regulated_object_type ()) {
181174 case ComponentType::branch:
182- return get_component_sequence_idx<Branch>(state. components , regulator.regulated_object ());
175+ return get_component_sequence_idx<Branch>(components, regulator.regulated_object ());
183176 case ComponentType::branch3:
184- return get_component_sequence_idx<Branch3>(state. components , regulator.regulated_object ());
177+ return get_component_sequence_idx<Branch3>(components, regulator.regulated_object ());
185178 default :
186179 throw MissingCaseForEnumError (" Regulator idx to seq transformation" , regulator.regulated_object_type ());
187180 }
188181 });
189182
190- detail::register_topo_components<Component>(state, comp_topo. regulated_object_type , [](Regulator const & regulator) {
191- return regulator .regulated_object_type ();
192- });
183+ detail::register_topo_components<Component>(
184+ components, comp_topo .regulated_object_type ,
185+ [](Regulator const & regulator) { return regulator. regulated_object_type (); });
193186}
194187
195188ComponentTopology construct_topology (main_model_state_c auto const & state) {
196189 ComponentTopology comp_topo;
197- register_topology_components<Node>(state, comp_topo);
198- register_topology_components<Branch>(state, comp_topo);
199- register_topology_components<Branch3>(state, comp_topo);
200- register_topology_components<Source>(state, comp_topo);
201- register_topology_components<Shunt>(state, comp_topo);
202- register_topology_components<GenericLoadGen>(state, comp_topo);
203- register_topology_components<GenericVoltageSensor>(state, comp_topo);
204- register_topology_components<GenericPowerSensor>(state, comp_topo);
205- register_topology_components<GenericCurrentSensor>(state, comp_topo);
206- register_topology_components<Regulator>(state, comp_topo);
190+ register_topology_components<Node>(state. components , comp_topo);
191+ register_topology_components<Branch>(state. components , comp_topo);
192+ register_topology_components<Branch3>(state. components , comp_topo);
193+ register_topology_components<Source>(state. components , comp_topo);
194+ register_topology_components<Shunt>(state. components , comp_topo);
195+ register_topology_components<GenericLoadGen>(state. components , comp_topo);
196+ register_topology_components<GenericVoltageSensor>(state. components , comp_topo);
197+ register_topology_components<GenericPowerSensor>(state. components , comp_topo);
198+ register_topology_components<GenericCurrentSensor>(state. components , comp_topo);
199+ register_topology_components<Regulator>(state. components , comp_topo);
207200 return comp_topo;
208201}
209202
0 commit comments