Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,44 @@ constexpr auto filter_tuple_types(std::tuple<std::type_identity<Types>...> /*unu
std::tuple<std::type_identity<Types>>, std::tuple<>>{}...);
}


template <typename List, typename T, typename... NeedsTypes>
concept dependent_type_check = !IsInList<T, List>::value || (IsInList<NeedsTypes, List>::value && ...);

template <typename CompList>
concept validate_component_types_c =
dependent_type_check<CompList, Source, Node> && //
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// in the end to avoid formatting

dependent_type_check<CompList, Line, Node> && //
dependent_type_check<CompList, Link, Node> && //
dependent_type_check<CompList, Transformer, Node> && //
dependent_type_check<CompList, GenericBranch, Node> && //
dependent_type_check<CompList, AsymLine, Node> && //
dependent_type_check<CompList, ThreeWindingTransformer, Node> && //
dependent_type_check<CompList, Shunt, Node> && //
dependent_type_check<CompList, SymGenerator, Node> && //
dependent_type_check<CompList, AsymGenerator, Node> && //
dependent_type_check<CompList, SymLoad, Node> && //
dependent_type_check<CompList, AsymLoad, Node> && //
dependent_type_check<CompList, SymVoltageSensor, Node> && //
dependent_type_check<CompList, AsymVoltageSensor, Node> && //
dependent_type_check<CompList, SymPowerSensor, Node, Line, AsymLine, Link, GenericBranch, Transformer,
ThreeWindingTransformer, SymGenerator, AsymGenerator, SymLoad, AsymLoad> && //
dependent_type_check<CompList, AsymPowerSensor, Node, Line, AsymLine, Link, GenericBranch, Transformer,
ThreeWindingTransformer, SymGenerator, AsymGenerator, SymLoad, AsymLoad> && //
dependent_type_check<CompList, SymCurrentSensor, Line, AsymLine, Link, GenericBranch, Transformer,
ThreeWindingTransformer> && //
dependent_type_check<CompList, AsymCurrentSensor, Line, AsymLine, Link, GenericBranch, Transformer,
ThreeWindingTransformer> && //
dependent_type_check<CompList, TransformerTapRegulator, Node, Transformer, ThreeWindingTransformer> && //
dependent_type_check<CompList, Fault, Node>;

} // namespace detail

template <class T, class U> struct MainModelType;

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

using ComponentContainer = Container<ExtraRetrievableTypes<ExtraRetrievableType...>, ComponentType...>;
Expand Down
29 changes: 15 additions & 14 deletions tests/cpp_unit_tests/test_main_model_type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <power_grid_model/container.hpp>
#include <power_grid_model/main_core/core_utils.hpp>
#include <power_grid_model/main_core/main_model_type.hpp>
#include <power_grid_model/math_solver/math_solver_dispatch.hpp>

#include <doctest/doctest.h>

Expand All @@ -17,6 +18,20 @@ struct AComponent {
};
} // namespace

static_assert(detail::validate_component_types_c<AllComponents>);

static_assert(detail::validate_component_types_c<ComponentList<Node, Source>>);
static_assert(detail::validate_component_types_c<ComponentList<Node, Line>>);
static_assert(detail::validate_component_types_c<ComponentList<Node, Line, AComponent>>);
static_assert(detail::validate_component_types_c<ComponentList<Source, Node>>);

static_assert(!detail::validate_component_types_c<ComponentList<Line>>);
static_assert(!detail::validate_component_types_c<ComponentList<Source, Line>>);

static_assert(!std::constructible_from<MainModelType<ExtraRetrievableTypes<Base, Branch>, ComponentList<Line>>>);
static_assert(!std::constructible_from<
MainModelType<ExtraRetrievableTypes<Base, Branch, Appliance>, ComponentList<Line, Source>>>);

TEST_CASE("MainModelType") {

SUBCASE("Node Source") {
Expand Down Expand Up @@ -44,8 +59,6 @@ TEST_CASE("MainModelType") {
utils::run_functor_with_tuple_return_void<typename ModelType::TopologyTypesTuple>(
[&calls]<typename CompType>() { calls.push_back(std::string_view(CompType::name)); });
CHECK(calls == std::vector<std::string_view>{"node", "source"});

// static_assert(is_constructible_v<MainModelImpl<ModelType>>);
}
SUBCASE("Node Line Source") {
using ModelType =
Expand Down Expand Up @@ -136,18 +149,6 @@ TEST_CASE("MainModelType") {
CHECK(calls == std::vector<std::string_view>{"node", "source"});
}

SUBCASE("Bad case: Line Source") {
// TODO rewrite for checking fail instead of pass
using ModelType = MainModelType<ExtraRetrievableTypes<Base, Branch, Appliance>, ComponentList<Line, Source>>;

static_assert(std::is_same_v<typename ModelType::ComponentContainer,
Container<ExtraRetrievableTypes<Base, Branch, Appliance>, Line, Source>>);
static_assert(std::is_same_v<typename ModelType::ComponentTypesTuple, std::tuple<Line, Source>>);
static_assert(std::is_same_v<typename ModelType::TopologyTypesTuple, std::tuple<Branch, Source>>);
static_assert(std::is_same_v<typename ModelType::TopologyConnectionTypesTuple, std::tuple<Branch, Source>>);
static_assert(ModelType::n_types == 2);
}

// TODO add static_assert(std::constructible_from<ModelType, double, meta_data::MetaData const&,
// MathSolverDispatcher const&>);
}
Expand Down
Loading