1212#include < vector>
1313namespace power_grid_model ::main_core::utils {
1414
15+ namespace detail {
16+
17+ template <typename Tuple> struct tuple_type_identities_to_tuple_types ;
18+
19+ template <typename ... Ts> struct tuple_type_identities_to_tuple_types <std::tuple<std::type_identity<Ts>...>> {
20+ using type = std::tuple<Ts...>;
21+ };
22+
23+ template <typename Tuple>
24+ using tuple_type_identities_to_tuple_types_t = typename tuple_type_identities_to_tuple_types<Tuple>::type;
25+
26+ template <typename ... Types, typename ... SelectTypes>
27+ constexpr auto filter_tuple_types (std::tuple<std::type_identity<Types>...> /* types*/ ,
28+ std::tuple<std::type_identity<SelectTypes>...> /* select_types*/ ) {
29+ constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
30+
31+ return std::tuple_cat (std::conditional_t <sub_type_in_type.template operator ()<Types>(),
32+ std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
33+ }
34+
35+ template <typename Tuple, class Functor , std::size_t ... Indices>
36+ constexpr void run_functor_with_tuple_index_return_void (Functor functor, std::index_sequence<Indices...>) {
37+ (functor.template operator ()<std::tuple_element_t <Indices, Tuple>>(), ...);
38+ }
39+
40+ template <typename Tuple, class Functor , std::size_t ... Indices>
41+ constexpr auto run_functor_with_tuple_index_return_array (Functor functor, std::index_sequence<Indices...>) {
42+ return std::array { functor.template operator ()<std::tuple_element_t <Indices, Tuple>>()... };
43+ }
44+
45+ } // namespace detail
46+
1547constexpr Idx invalid_index{-1 };
1648
1749struct UpdateCompProperties {
@@ -59,41 +91,14 @@ template <class... Types, class Functor> constexpr auto run_functor_with_all_typ
5991}
6092// ///////////////// To remove ///////////////////
6193
62- template <typename Tuple> struct tuple_type_identities_to_tuple_types ;
63-
64- template <typename ... Ts> struct tuple_type_identities_to_tuple_types <std::tuple<std::type_identity<Ts>...>> {
65- using type = std::tuple<Ts...>;
66- };
67-
68- template <typename Tuple>
69- using tuple_type_identities_to_tuple_types_t = typename tuple_type_identities_to_tuple_types<Tuple>::type;
70-
71- template <typename ... Types, typename ... SelectTypes>
72- constexpr auto filter_tuple_types (std::tuple<std::type_identity<Types>...>,
73- std::tuple<std::type_identity<SelectTypes>...>) {
74- constexpr auto sub_type_in_type = []<typename T>() { return (std::is_same_v<T, SelectTypes> || ...); };
75-
76- return std::tuple_cat (std::conditional_t <sub_type_in_type.template operator ()<Types>(),
77- std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
78- }
79-
80- template <typename Tuple, class Functor , std::size_t ... Indices>
81- constexpr void run_functor_with_tuple_index_return_void (Functor functor, std::index_sequence<Indices...>) {
82- (functor.template operator ()<std::tuple_element_t <Indices, Tuple>>(), ...);
83- }
84-
8594template <typename Tuple, class Functor > constexpr void run_functor_with_tuple_return_void (Functor functor) {
86- run_functor_with_tuple_index_return_void<Tuple>(functor, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
87- }
88-
89- template <typename Tuple, class Functor , std::size_t ... Indices>
90- constexpr auto run_functor_with_tuple_index_return_array (Functor functor, std::index_sequence<Indices...>) {
91- return std::array { functor.template operator ()<std::tuple_element_t <Indices, Tuple>>()... };
95+ detail::run_functor_with_tuple_index_return_void<Tuple>(functor,
96+ std::make_index_sequence<std::tuple_size_v<Tuple>>{});
9297}
9398
9499template <typename Tuple, class Functor > constexpr auto run_functor_with_tuple_return_array (Functor functor) {
95- return run_functor_with_tuple_index_return_array<Tuple>(functor,
96- std::make_index_sequence<std::tuple_size_v<Tuple>>{});
100+ return detail:: run_functor_with_tuple_index_return_array<Tuple>(
101+ functor, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
97102}
98103
99104template <class T , class U > struct MainModelType ;
@@ -104,14 +109,14 @@ struct MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLi
104109
105110 using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
106111 using MainModelState = main_core::MainModelState<ComponentContainer>;
107- using ExtraRetrievableTypesTuple = std::tuple<std::type_identity<ExtraRetrievableType>...>;
108112 using ComponentTypesTuple = std::tuple<ComponentType...>;
109113
110114 static constexpr size_t n_types = sizeof ...(ComponentType);
111115 // TODO Should not have to go via container_impl.
112116 template <class CompType >
113117 static constexpr size_t index_of_component = container_impl::get_cls_pos_v<CompType, ComponentType...>;
114118
119+ private:
115120 static constexpr auto all_types_tuple_v_ =
116121 std::tuple<std::type_identity<ComponentType>..., std::type_identity<ExtraRetrievableType>...>{};
117122 // TODO: Would making a unique be necessary? We have Node mentioned as a ExtraRetrievableType and ComponentType so
@@ -126,10 +131,12 @@ struct MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentLi
126131 static constexpr auto topology_connection_types_tuple_v_ =
127132 std::tuple<std::type_identity<Branch>, std::type_identity<Branch3>, std::type_identity<Source>>{};
128133
129- using TopologyTypesTuple = tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(
134+ public:
135+ using TopologyTypesTuple = detail::tuple_type_identities_to_tuple_types_t <decltype (detail::filter_tuple_types(
130136 topology_types_tuple_v_, all_types_tuple_v_))>;
131- using TopologyConnectionTypesTuple = tuple_type_identities_to_tuple_types_t <decltype (filter_tuple_types(
132- topology_connection_types_tuple_v_, all_types_tuple_v_))>;
137+ using TopologyConnectionTypesTuple =
138+ detail::tuple_type_identities_to_tuple_types_t <decltype (detail::filter_tuple_types(
139+ topology_connection_types_tuple_v_, all_types_tuple_v_))>;
133140
134141 // Update related types
135142 using OwnedUpdateDataset = std::tuple<std::vector<typename ComponentType::UpdateType>...>;
0 commit comments