diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/container.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/container.hpp index 7b87d6dd66..26faf3f09a 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/container.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/container.hpp @@ -9,6 +9,7 @@ #include "common/common.hpp" #include "common/exception.hpp" #include "common/iterator_facade.hpp" +#include "container_fwd.hpp" #include diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/container_fwd.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/container_fwd.hpp new file mode 100644 index 0000000000..5b0f7dc5bc --- /dev/null +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/container_fwd.hpp @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: Contributors to the Power Grid Model project +// +// SPDX-License-Identifier: MPL-2.0 + +#pragma once + +#include "common/common.hpp" + +#include + +namespace power_grid_model::common { + +namespace detail { +template +concept single_component_container_c = requires(ContainerType const& c, ID id, Idx2D idx2d) { + { c.template citer().begin() } -> std::forward_iterator; + { c.template citer().end() } -> std::forward_iterator; + { *(c.template citer().begin()) } -> std::same_as; + { + c.template citer().end() + } -> std::same_as().begin())>; + { c.template get_item(id) } -> std::convertible_to; + { c.template size() } -> std::same_as; + { c.template get_seq(idx2d) } -> std::same_as; +}; +} // namespace detail + +template +concept component_container_c = (detail::single_component_container_c && ...); + +} // namespace power_grid_model::common diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/container_queries.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/container_queries.hpp new file mode 100644 index 0000000000..50cd5fc65f --- /dev/null +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/container_queries.hpp @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: Contributors to the Power Grid Model project +// +// SPDX-License-Identifier: MPL-2.0 + +#pragma once + +#include "../container.hpp" + +namespace power_grid_model::main_core { + +// TODO Reconfirm if there is duplication with state_queries and if we can remove either one of them + +template + requires common::component_container_c +constexpr auto get_component_size(ComponentContainer const& components) { + return components.template size(); +} + +template + requires common::component_container_c +inline Idx get_component_sequence_idx(ComponentContainer const& components, auto const& id_or_index) { + return components.template get_seq(id_or_index); +} + +} // namespace power_grid_model::main_core diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp index 94062f430d..ed8a6a0b8f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/main_core/state.hpp @@ -28,18 +28,9 @@ template struct MainModelState { template concept main_model_state_c = std::same_as>; -template -concept component_container_c = requires(ContainerType const& c, ID id) { - { c.template citer().begin() } -> std::forward_iterator; - { c.template citer().end() } -> std::forward_iterator; - { *(c.template citer().begin()) } -> std::same_as; - { *(c.template citer().end()) } -> std::same_as; - { c.template get_item(id) } -> std::convertible_to; -}; - template