@@ -13,6 +13,9 @@ namespace power_grid_model::main_core {
13
13
14
14
namespace detail {
15
15
16
+ template <typename T, typename U>
17
+ concept assignable_to = std::assignable_from<U, T>;
18
+
16
19
template <std::same_as<Node> Component, class ComponentContainer >
17
20
requires model_component_state_c<MainModelState, ComponentContainer, Component>
18
21
constexpr auto comp_base_sequence_cbegin (MainModelState<ComponentContainer> const & state) {
@@ -75,12 +78,11 @@ constexpr auto comp_base_sequence_cbegin(MainModelState<ComponentContainer> cons
75
78
return state.comp_topo ->regulated_object_idx .cbegin () + get_component_sequence_offset<Regulator, Component>(state);
76
79
}
77
80
78
- template <typename Component, typename IndexType, class ComponentContainer , std::forward_iterator ResIt,
79
- typename ResFunc>
81
+ template <typename Component, typename IndexType, class ComponentContainer , typename ResIt, typename ResFunc>
80
82
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
81
83
std::invocable<std::remove_cvref_t <ResFunc>, Component const &, IndexType> &&
82
- std::convertible_to <std::invoke_result_t <ResFunc, Component const &, IndexType>,
83
- std::iter_value_t <ResIt>> &&
84
+ assignable_to <std::invoke_result_t <ResFunc, Component const &, IndexType>,
85
+ std::add_lvalue_reference_t <std:: iter_value_t <ResIt> >> &&
84
86
std::convertible_to<IndexType,
85
87
decltype (*comp_base_sequence_cbegin<Component>(MainModelState<ComponentContainer>{}))>
86
88
constexpr ResIt produce_output (MainModelState<ComponentContainer> const & state, ResIt res_it, ResFunc&& func) {
@@ -359,12 +361,12 @@ output_result(Component const& transformer_tap_regulator, MainModelState<Compone
359
361
360
362
// output base component
361
363
template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
362
- std::forward_iterator ResIt>
364
+ typename ResIt>
363
365
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
364
366
requires (Component const & component, std::vector<SolverOutputType> const & solver_output, Idx2D math_id) {
365
367
{
366
368
output_result<Component>(component, solver_output, math_id)
367
- } -> std::convertible_to <std::iter_value_t <ResIt>>;
369
+ } -> detail::assignable_to< std::add_lvalue_reference_t <std::iter_value_t <ResIt> >>;
368
370
}
369
371
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
370
372
MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
@@ -374,13 +376,13 @@ constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
374
376
});
375
377
}
376
378
template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
377
- std::forward_iterator ResIt>
379
+ typename ResIt>
378
380
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
379
381
requires (Component const & component, MainModelState<ComponentContainer> const & state,
380
382
std::vector<SolverOutputType> const & solver_output, Idx2D math_id) {
381
383
{
382
384
output_result<Component>(component, state, solver_output, math_id)
383
- } -> std::convertible_to <std::iter_value_t <ResIt>>;
385
+ } -> detail::assignable_to< std::add_lvalue_reference_t <std::iter_value_t <ResIt> >>;
384
386
}
385
387
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
386
388
MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
@@ -390,13 +392,13 @@ constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
390
392
});
391
393
}
392
394
template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
393
- std::forward_iterator ResIt>
395
+ typename ResIt>
394
396
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
395
397
requires (Component const & component, MainModelState<ComponentContainer> const & state,
396
398
std::vector<SolverOutputType> const & solver_output, Idx obj_seq) {
397
399
{
398
400
output_result<Component>(component, state, solver_output, obj_seq)
399
- } -> std::convertible_to <std::iter_value_t <ResIt>>;
401
+ } -> detail::assignable_to< std::add_lvalue_reference_t <std::iter_value_t <ResIt> >>;
400
402
}
401
403
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
402
404
MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
@@ -406,13 +408,13 @@ constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
406
408
});
407
409
}
408
410
template <std::derived_from<Base> Component, class ComponentContainer , solver_output_type SolverOutputType,
409
- std::forward_iterator ResIt>
411
+ typename ResIt>
410
412
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
411
413
requires (Component const & component, std::vector<SolverOutputType> const & solver_output,
412
414
Idx2DBranch3 const & math_id) {
413
415
{
414
416
output_result<Component>(component, solver_output, math_id)
415
- } -> std::convertible_to <std::iter_value_t <ResIt>>;
417
+ } -> detail::assignable_to< std::add_lvalue_reference_t <std::iter_value_t <ResIt> >>;
416
418
}
417
419
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
418
420
MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
@@ -421,14 +423,13 @@ constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
421
423
return output_result<Component>(component, math_output.solver_output , math_id);
422
424
});
423
425
}
424
- template <std::derived_from<Base> Component, class ComponentContainer , typename SolverOutputType,
425
- std::forward_iterator ResIt>
426
+ template <std::derived_from<Base> Component, class ComponentContainer , typename SolverOutputType, typename ResIt>
426
427
requires model_component_state_c<MainModelState, ComponentContainer, Component> &&
427
428
requires (Component const & component, MainModelState<ComponentContainer> const & state,
428
429
MathOutput<SolverOutputType> const & math_output, Idx const obj_seq) {
429
430
{
430
431
output_result<Component>(component, state, math_output, obj_seq)
431
- } -> std::convertible_to <std::iter_value_t <ResIt>>;
432
+ } -> detail::assignable_to< std::add_lvalue_reference_t <std::iter_value_t <ResIt> >>;
432
433
}
433
434
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
434
435
MathOutput<SolverOutputType> const & math_output, ResIt res_it) {
@@ -440,7 +441,7 @@ constexpr ResIt output_result(MainModelState<ComponentContainer> const& state,
440
441
441
442
// output source, load_gen, shunt individually
442
443
template <std::same_as<Appliance> Component, class ComponentContainer , solver_output_type SolverOutputType,
443
- std::forward_iterator ResIt>
444
+ typename ResIt>
444
445
requires model_component_state_c<MainModelState, ComponentContainer, Component>
445
446
constexpr ResIt output_result (MainModelState<ComponentContainer> const & state,
446
447
MathOutput<std::vector<SolverOutputType>> const & math_output, ResIt res_it) {
0 commit comments