@@ -85,16 +85,25 @@ constexpr auto comp_base_sequence_cbegin(MainModelState<ComponentContainer> cons
8585 return state.comp_topo ->regulated_object_idx .cbegin () + get_component_sequence_offset<Regulator, Component>(state);
8686}
8787
88- template <typename Component, typename IndexType, class ComponentContainer , typename ResIt, typename ResFunc>
88+ template <std::derived_from<Base> Component, class ComponentContainer >
89+ requires model_component_state_c<MainModelState, ComponentContainer, Component>
90+ constexpr auto comp_base_sequence (MainModelState<ComponentContainer> const & state) {
91+ auto const start = comp_base_sequence_cbegin<Component>(state);
92+ return std::ranges::subrange{start, start + get_component_size<Component>(state)};
93+ }
94+
95+ template <typename Component, typename IndexType, class ComponentContainer , std::ranges::viewable_range ComponentOutput,
96+ typename ResFunc>
8997 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
9098 std::invocable<std::remove_cvref_t <ResFunc>, Component const &, IndexType> &&
9199 assignable_to<std::invoke_result_t <ResFunc, Component const &, IndexType>,
92- std::add_lvalue_reference_t <std::iter_value_t <ResIt>>> &&
93- std::convertible_to<IndexType,
94- decltype (*comp_base_sequence_cbegin<Component>(MainModelState<ComponentContainer>{}))>
95- constexpr ResIt produce_output (MainModelState<ComponentContainer> const & state, ResIt res_it, ResFunc&& func) {
96- return std::transform (get_component_citer<Component>(state).begin (), get_component_citer<Component>(state).end (),
97- comp_base_sequence_cbegin<Component>(state), std::move (res_it), std::forward<ResFunc>(func));
100+ std::ranges::range_reference_t <ComponentOutput>> &&
101+ std::convertible_to<IndexType, std::ranges::range_value_t <decltype (comp_base_sequence<Component>(
102+ MainModelState<ComponentContainer>{}))>>
103+ constexpr void produce_output (MainModelState<ComponentContainer> const & state, ComponentOutput&& output,
104+ ResFunc&& func) {
105+ std::ranges::transform (get_component_citer<Component>(state), comp_base_sequence<Component>(state),
106+ std::ranges::begin (output), std::forward<ResFunc>(func));
98107}
99108
100109} // namespace detail
@@ -439,93 +448,86 @@ output_result(Component const& transformer_tap_regulator, MainModelState<Compone
439448
440449// output base component
441450template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
442- typename ResIt >
451+ std::ranges::viewable_range ComponentOutput >
443452 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
444453 requires (Component const & component, std::vector<SolverOutputType> const & solver_output, Idx2D math_id) {
445454 {
446455 output_result<Component>(component, solver_output, math_id)
447- } -> detail::assignable_to<std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >>;
456+ } -> detail::assignable_to<std::ranges:: range_reference_t <ComponentOutput >>;
448457 }
449- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
450- MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it ) {
451- return detail::produce_output<Component, Idx2D>(
452- state, res_it , [&math_output](Component const & component, Idx2D math_id) {
458+ constexpr void output_result (MainModelState<ComponentContainer> const & state,
459+ MathOutput<std::vector<SolverOutputType>> const & math_output, ComponentOutput&& output ) {
460+ detail::produce_output<Component, Idx2D>(
461+ state, std::forward<ComponentOutput>(output) , [&math_output](Component const & component, Idx2D math_id) {
453462 return output_result<Component>(component, math_output.solver_output , math_id);
454463 });
455464}
456465template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
457- typename ResIt >
466+ std::ranges::viewable_range ComponentOutput >
458467 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
459468 requires (Component const & component, MainModelState<ComponentContainer> const & state,
460469 std::vector<SolverOutputType> const & solver_output, Idx2D math_id) {
461470 {
462471 output_result<Component>(component, state, solver_output, math_id)
463- } -> detail::assignable_to<std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >>;
472+ } -> detail::assignable_to<std::ranges:: range_reference_t <ComponentOutput >>;
464473 }
465- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
466- MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
467- return detail::produce_output<Component, Idx2D>(
468- state, res_it, [&state, &math_output](Component const & component, Idx2D const math_id) {
469- return output_result<Component>(component, state, math_output.solver_output , math_id);
470- });
474+ constexpr void output_result (MainModelState<ComponentContainer> const & state,
475+ MathOutput<std::vector<SolverOutputType>> const & math_output, ComponentOutput&& output) {
476+ detail::produce_output<Component, Idx2D>(state, std::forward<ComponentOutput>(output),
477+ [&state, &math_output](Component const & component, Idx2D const math_id) {
478+ return output_result<Component>(component, state,
479+ math_output.solver_output , math_id);
480+ });
471481}
472482template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
473- typename ResIt >
483+ std::ranges::viewable_range ComponentOutput >
474484 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
475485 requires (Component const & component, MainModelState<ComponentContainer> const & state,
476486 std::vector<SolverOutputType> const & solver_output, Idx obj_seq) {
477487 {
478488 output_result<Component>(component, state, solver_output, obj_seq)
479- } -> detail::assignable_to<std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >>;
489+ } -> detail::assignable_to<std::ranges:: range_reference_t <ComponentOutput >>;
480490 }
481- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
482- MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
483- return detail::produce_output<Component, Idx>(
484- state, res_it, [&state, &math_output](Component const & component, Idx const obj_seq) {
485- return output_result<Component, ComponentContainer>(component, state, math_output.solver_output , obj_seq);
486- });
491+ constexpr void output_result (MainModelState<ComponentContainer> const & state,
492+ MathOutput<std::vector<SolverOutputType>> const & math_output, ComponentOutput&& output) {
493+ detail::produce_output<Component, Idx>(state, std::forward<ComponentOutput>(output),
494+ [&state, &math_output](Component const & component, Idx const obj_seq) {
495+ return output_result<Component, ComponentContainer>(
496+ component, state, math_output.solver_output , obj_seq);
497+ });
487498}
488499template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
489- typename ResIt >
500+ std::ranges::viewable_range ComponentOutput >
490501 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
491502 requires (Component const & component, std::vector<SolverOutputType> const & solver_output,
492503 Idx2DBranch3 const & math_id) {
493504 {
494505 output_result<Component>(component, solver_output, math_id)
495- } -> detail::assignable_to<std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >>;
506+ } -> detail::assignable_to<std::ranges:: range_reference_t <ComponentOutput >>;
496507 }
497- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
498- MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
499- return detail::produce_output<Component, Idx2DBranch3>(
500- state, res_it, [&math_output](Component const & component, Idx2DBranch3 const & math_id) {
508+ constexpr void output_result (MainModelState<ComponentContainer> const & state,
509+ MathOutput<std::vector<SolverOutputType>> const & math_output, ComponentOutput&& output) {
510+ detail::produce_output<Component, Idx2DBranch3>(
511+ state, std::forward<ComponentOutput>(output),
512+ [&math_output](Component const & component, Idx2DBranch3 const & math_id) {
501513 return output_result<Component>(component, math_output.solver_output , math_id);
502514 });
503515}
504- template <std::derived_from<Base> Component, class ComponentContainer , typename SolverOutputType, typename ResIt>
516+ template <std::derived_from<Base> Component, class ComponentContainer , typename SolverOutputType,
517+ std::ranges::viewable_range ComponentOutput>
505518 requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
506519 requires (Component const & component, MainModelState<ComponentContainer> const & state,
507520 MathOutput<SolverOutputType> const & math_output, Idx const obj_seq) {
508521 {
509522 output_result<Component>(component, state, math_output, obj_seq)
510- } -> detail::assignable_to<std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >>;
523+ } -> detail::assignable_to<std::ranges:: range_reference_t <ComponentOutput >>;
511524 }
512- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
513- MathOutput<SolverOutputType> const & math_output, ResIt res_it) {
514- return detail::produce_output<Component, Idx>(
515- state, std::move (res_it), [&state, &math_output](Component const & component, Idx const obj_seq) {
516- return output_result<Component, ComponentContainer>(component, state, math_output, obj_seq);
517- });
518- }
519-
520- // output source, load_gen, shunt individually
521- template <std::same_as<Appliance> Component, class ComponentContainer , solver_output_type SolverOutputType,
522- typename ResIt>
523- requires model_component_state_c<MainModelState, ComponentContainer, Component>
524- constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
525- MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
526- res_it = output_result<Source>(state, math_output, res_it);
527- res_it = output_result<GenericLoadGen>(state, math_output, res_it);
528- res_it = output_result<Shunt>(state, math_output, res_it);
529- return res_it;
525+ constexpr void output_result (MainModelState<ComponentContainer> const & state,
526+ MathOutput<SolverOutputType> const & math_output, ComponentOutput&& output) {
527+ detail::produce_output<Component, Idx>(state, std::forward<ComponentOutput>(output),
528+ [&state, &math_output](Component const & component, Idx const obj_seq) {
529+ return output_result<Component, ComponentContainer>(
530+ component, state, math_output, obj_seq);
531+ });
530532}
531533} // namespace power_grid_model::main_core
0 commit comments