Skip to content

Commit 618da38

Browse files
authored
Merge branch 'main' into feature/state-queries-to-container-queries
2 parents e9b7893 + cf9d604 commit 618da38

File tree

6 files changed

+63
-21
lines changed

6 files changed

+63
-21
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/common/common.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ template <typename T> constexpr T map_to_cyclic_range(T value, T period) {
116116
if constexpr (std::is_integral_v<T>) {
117117
return static_cast<T>((value % period + period) % period);
118118
} else {
119-
if (std::is_constant_evaluated()) {
119+
if consteval {
120120
T quotient = value / period;
121121
Idx const floored_quotient =
122122
(quotient >= T{0}) ? static_cast<Idx>(quotient) : static_cast<Idx>(quotient) - 1;

power_grid_model_c/power_grid_model/include/power_grid_model/common/multi_threaded_logging.hpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,23 @@ class MultiThreadedLoggerImpl : public MultiThreadedLogger {
2020
class ThreadLogger : public LoggerType {
2121
public:
2222
ThreadLogger(MultiThreadedLoggerImpl& parent) : parent_{&parent} {}
23-
ThreadLogger(ThreadLogger const&) = default;
24-
ThreadLogger& operator=(ThreadLogger const&) = default;
25-
ThreadLogger(ThreadLogger&&) noexcept = default;
26-
ThreadLogger& operator=(ThreadLogger&&) noexcept = default;
23+
ThreadLogger(ThreadLogger const& other) : LoggerType{other}, parent_{other.parent_} {};
24+
ThreadLogger& operator=(ThreadLogger const& other) {
25+
if (this != &other) {
26+
LoggerType::operator=(other);
27+
parent_ = other.parent_;
28+
}
29+
return *this;
30+
};
31+
ThreadLogger(ThreadLogger&& other) noexcept
32+
: LoggerType{std::move(static_cast<LoggerType>(other))}, parent_{other.parent_} {};
33+
ThreadLogger& operator=(ThreadLogger&& other) noexcept {
34+
if (this != &other) {
35+
parent_ = std::exchange(other.parent_, nullptr);
36+
LoggerType::operator=(std::move(other));
37+
}
38+
return *this;
39+
};
2740
~ThreadLogger() noexcept override {
2841
try {
2942
sync();

power_grid_model_c/power_grid_model/include/power_grid_model/common/timer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ class Timer {
2626
Timer(Logger& log, LogEvent code) : log_{&log}, code_{code}, start_{Clock::now()} {}
2727

2828
Timer(Timer const&) = delete;
29-
Timer(Timer&&) = default;
29+
Timer(Timer&& other) noexcept
30+
: log_{std::exchange(other.log_, nullptr)}, code_{other.code_}, start_{other.start_} {}
3031
Timer& operator=(Timer const&) = delete;
3132

3233
Timer& operator=(Timer&& timer) noexcept {

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)