1010
1111#include < array>
1212#include < vector>
13-
1413namespace power_grid_model ::main_core::utils {
1514
1615constexpr Idx invalid_index{-1 };
16+ // ///////////////// To remove ///////////////////
1717
1818template <class ... ComponentTypes> constexpr size_t n_types = sizeof ...(ComponentTypes);
1919template <class CompType , class ... ComponentTypes>
@@ -29,6 +29,7 @@ template <class... Types, class Functor> constexpr void run_functor_with_all_typ
2929template <class ... Types, class Functor > constexpr auto run_functor_with_all_types_return_array (Functor functor) {
3030 return std::array { functor.template operator ()<Types>()... };
3131}
32+ // ///////////////// To remove ///////////////////
3233
3334template <typename Tuple> struct tuple_type_identities_to_tuple_types ;
3435
@@ -45,52 +46,81 @@ constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...>,
4546 constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
4647
4748 return std::tuple_cat (std::conditional_t <sub_type_in_type.template operator ()<Types>(),
48- std::tuple<typename std::type_identity<Types>>, std::tuple<>>{}...);
49+ std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
50+ }
51+
52+ template <typename Tuple, class Functor , std::size_t ... Indices>
53+ constexpr void run_functor_with_tuple_index_return_void (Functor functor, std::index_sequence<Indices...>) {
54+ (functor.template operator ()<std::tuple_element_t <Indices, Tuple>>(), ...);
4955}
5056
51- // concept validate_component_types_c =
52- // dependent_type_check<Source, Node, ComponentType...> && dependent_type_check<Line, Node, ComponentType...> &&
53- // dependent_type_check<ThreeWindingTransformer, Node, ComponentType...> &&
54- // dependent_type_check<Shunt, Node, ComponentType...> &&
55- // dependent_type_check<GenericLoadGen, Node, ComponentType...> &&
56- // dependent_type_check<GenericVoltageSensor, Node, ComponentType...>;
57+ template <typename Tuple, class Functor > constexpr void run_functor_with_tuple_return_void (Functor functor) {
58+ run_functor_with_tuple_index_return_void<Tuple>(functor, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
59+ }
60+
61+ template <typename Tuple, class Functor , std::size_t ... Indices>
62+ constexpr auto run_functor_with_tuple_index_return_array (Functor functor, std::index_sequence<Indices...>) {
63+ return std::array { functor.template operator ()<std::tuple_element_t <Indices, Tuple>>()... };
64+ }
65+
66+ template <typename Tuple, class Functor > constexpr auto run_functor_with_tuple_return_array (Functor functor) {
67+ return run_functor_with_tuple_index_return_array<Tuple>(functor,
68+ std::make_index_sequence<std::tuple_size_v<Tuple>>{});
69+ }
5770
58- // main model implementation template
5971template <class T , class U > struct MainModelType ;
6072
61- template <class ... ExtraRetrievableType, class ... ComponentType>
6273// TODO: discussion on checking dependent types can also be done here.
63- // requires validate_component_types_c<ComponentType ...>
74+ template < class ... ExtraRetrievableType, class ... ComponentType >
6475struct MainModelType <ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
6576
6677 using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
6778 using MainModelState = main_core::MainModelState<ComponentContainer>;
6879 using ExtraRetrievableTypesTuple = std::tuple<std::type_identity<ExtraRetrievableType>...>;
6980 using ComponentTypesTuple = std::tuple<ComponentType...>;
7081
71- // TODO: Clean up using-s
72- using _AllTypesTuple =
73- std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>;
82+ static constexpr size_t n_types = sizeof ...(ComponentType);
83+ // TODO Should not have to go via container_impl.
84+ template <class CompType >
85+ static constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentType...>;
86+
87+ static constexpr auto all_types_tuple_v_ =
88+ std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>{};
7489 // TODO: Would making a unique be necessary? We have Node mentioned as a ExtraRetrievableType and ComponentType so
7590 // summing up is possible but maybe not appropriate. Would it be better to handle them both separately? using
76- // _AllTypesTupleUnique = typename tuple_type_identities_to_tuple_types<decltype(filter_tuple_types(
77- // _TopologyTypesTuple{}, _AllTypesTuple{}))>::type;
7891
79- using _ComponentTypesTuple = std::tuple<std::type_identity<ComponentType>...>;
80- using _TopologyTypesTuple =
92+ static constexpr auto topology_types_tuple_v_ =
8193 std::tuple<std::type_identity<Node>, std::type_identity<Branch>, std::type_identity<Branch3>,
8294 std::type_identity<Source>, std::type_identity<Shunt>, std::type_identity<GenericLoadGen>,
8395 std::type_identity<GenericVoltageSensor>, std::type_identity<GenericPowerSensor>,
84- std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>;
85- using _TopologyConnectionTypes =
86- std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>;
96+ std::type_identity<GenericCurrentSensor>, std::type_identity<Regulator>>{};
8797
88- using TopologyTypesTuple =
89- tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(_TopologyTypesTuple{}, _AllTypesTuple{}))>;
90- using TopologyConnectionTypesTuple = tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(
91- _TopologyConnectionTypes{}, _AllTypesTuple{}))>;
98+ static constexpr auto topology_connection_types_tuple_v_ =
99+ std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>{};
92100
93- static constexpr size_t n_component_types = main_core::utils::n_types<ComponentType...>;
101+ using TopologyTypesTuple = tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(
102+ topology_types_tuple_v_, all_types_tuple_v_))>;
103+ using TopologyConnectionTypesTuple = tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(
104+ topology_connection_types_tuple_v_, all_types_tuple_v_))>;
105+
106+ // Update related types
107+ using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
108+ using SequenceIdxView = std::array<std::span<Idx2D const >, n_types>;
109+ // using UpdateIndependence = std::array<UpdateCompProperties, n_types>;
110+ using SequenceIdx = std::array<std::vector<Idx2D>, n_types>;
111+ using ComponentFlags = std::array<bool , n_types>;
112+
113+ // Clean these 2. They are unused
114+ static constexpr auto branch_param_in_seq_map =
115+ std::array{index_of_component<Line>, index_of_component<Link>, index_of_component<Transformer>};
116+ static constexpr auto shunt_param_in_seq_map = std::array{index_of_component<Shunt>};
117+
118+ template <class Functor > static constexpr void run_functor_with_all_component_types_return_void (Functor functor) {
119+ (functor.template operator ()<ComponentType>(), ...);
120+ }
121+ template <class Functor > static constexpr auto run_functor_with_all_component_types_return_array (Functor functor) {
122+ return std::array { functor.template operator ()<ComponentType>()... };
123+ }
94124};
95125
96126} // namespace power_grid_model::main_core::utils
0 commit comments