Skip to content

Commit 0d96300

Browse files
authored
Merge pull request #1120 from PowerGridModel/feature/dependent-component-types-check
Type dependent checks: Checks at all components
2 parents f8a2079 + 2f9bb87 commit 0d96300

File tree

3 files changed

+43
-15
lines changed

3 files changed

+43
-15
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/main_model_type.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,43 @@ constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...> /*unu
3333
std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
3434
}
3535

36+
template <typename List, typename T, typename... NeedsTypes>
37+
concept dependent_type_check = !IsInList<T, List>::value || (IsInList<NeedsTypes, List>::value && ...);
38+
39+
template <typename CompList>
40+
concept validate_component_types_c =
41+
dependent_type_check<CompList, Source, Node> && //
42+
dependent_type_check<CompList, Line, Node> && //
43+
dependent_type_check<CompList, Link, Node> && //
44+
dependent_type_check<CompList, Transformer, Node> && //
45+
dependent_type_check<CompList, GenericBranch, Node> && //
46+
dependent_type_check<CompList, AsymLine, Node> && //
47+
dependent_type_check<CompList, ThreeWindingTransformer, Node> && //
48+
dependent_type_check<CompList, Shunt, Node> && //
49+
dependent_type_check<CompList, SymGenerator, Node> && //
50+
dependent_type_check<CompList, AsymGenerator, Node> && //
51+
dependent_type_check<CompList, SymLoad, Node> && //
52+
dependent_type_check<CompList, AsymLoad, Node> && //
53+
dependent_type_check<CompList, SymVoltageSensor, Node> && //
54+
dependent_type_check<CompList, AsymVoltageSensor, Node> && //
55+
dependent_type_check<CompList, SymPowerSensor, Node, Line, AsymLine, GenericBranch, Transformer,
56+
ThreeWindingTransformer, SymGenerator, AsymGenerator, SymLoad, AsymLoad> && //
57+
dependent_type_check<CompList, AsymPowerSensor, Node, Line, AsymLine, Link, GenericBranch, Transformer,
58+
ThreeWindingTransformer, SymGenerator, AsymGenerator, SymLoad, AsymLoad> && //
59+
dependent_type_check<CompList, SymCurrentSensor, Line, AsymLine, Link, GenericBranch, Transformer,
60+
ThreeWindingTransformer> && //
61+
dependent_type_check<CompList, AsymCurrentSensor, Line, AsymLine, Link, GenericBranch, Transformer,
62+
ThreeWindingTransformer> && //
63+
dependent_type_check<CompList, TransformerTapRegulator, Node, Transformer, ThreeWindingTransformer> && //
64+
dependent_type_check<CompList, Fault, Node>;
65+
3666
} // namespace detail
3767

3868
template <class T, class U> class MainModelType;
3969

4070
// TODO: discussion on checking dependent types can also be done here.
4171
template <class... ExtraRetrievableType, class... ComponentType>
72+
requires detail::validate_component_types_c<ComponentList<ComponentType...>>
4273
class MainModelType<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentList<ComponentType...>> {
4374

4475
public:

power_grid_model_c/power_grid_model/include/power_grid_model/main_core/topology.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ constexpr void register_connections_components(ComponentContainer const& compone
208208
} // namespace detail
209209

210210
template <typename ModelType>
211-
requires common::component_container_c<typename ModelType::ComponentContainer, Branch, Branch3, Source, Shunt,
211+
requires common::component_container_c<typename ModelType::ComponentContainer, Node, Branch, Branch3, Source, Shunt,
212212
GenericLoadGen, GenericVoltageSensor, GenericPowerSensor,
213213
GenericCurrentSensor, Regulator>
214214
ComponentTopology construct_topology(typename ModelType::ComponentContainer const& components) {

tests/cpp_unit_tests/test_main_model_type.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <power_grid_model/container.hpp>
66
#include <power_grid_model/main_core/core_utils.hpp>
77
#include <power_grid_model/main_core/main_model_type.hpp>
8+
#include <power_grid_model/math_solver/math_solver_dispatch.hpp>
89

910
#include <doctest/doctest.h>
1011

@@ -17,6 +18,16 @@ struct AComponent {
1718
};
1819
} // namespace
1920

21+
static_assert(detail::validate_component_types_c<AllComponents>);
22+
23+
static_assert(detail::validate_component_types_c<ComponentList<Node, Source>>);
24+
static_assert(detail::validate_component_types_c<ComponentList<Node, Line>>);
25+
static_assert(detail::validate_component_types_c<ComponentList<Node, Line, AComponent>>);
26+
static_assert(detail::validate_component_types_c<ComponentList<Source, Node>>);
27+
28+
static_assert(!detail::validate_component_types_c<ComponentList<Line>>);
29+
static_assert(!detail::validate_component_types_c<ComponentList<Source, Line>>);
30+
2031
TEST_CASE("MainModelType") {
2132

2233
SUBCASE("Node Source") {
@@ -44,8 +55,6 @@ TEST_CASE("MainModelType") {
4455
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
4556
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
4657
CHECK(calls == std::vector<std::string_view>{"node", "source"});
47-
48-
// static_assert(is_constructible_v<MainModelImpl<ModelType>>);
4958
}
5059
SUBCASE("Node Line Source") {
5160
using ModelType =
@@ -136,18 +145,6 @@ TEST_CASE("MainModelType") {
136145
CHECK(calls == std::vector<std::string_view>{"node", "source"});
137146
}
138147

139-
SUBCASE("Bad case: Line Source") {
140-
// TODO rewrite for checking fail instead of pass
141-
using ModelType = MainModelType<ExtraRetrievableTypes<Base, Branch, Appliance>, ComponentList<Line, Source>>;
142-
143-
static_assert(std::is_same_v<typename ModelType::ComponentContainer,
144-
Container<ExtraRetrievableTypes<Base, Branch, Appliance>, Line, Source>>);
145-
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Line, Source>>);
146-
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Branch, Source>>);
147-
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Branch, Source>>);
148-
static_assert(ModelType::n_types == 2);
149-
}
150-
151148
// TODO add static_assert(std::constructible_from<ModelType, double, meta_data::MetaData const&,
152149
// MathSolverDispatcher const&>);
153150
}

0 commit comments

Comments
 (0)