File indexing completed on 2026-03-28 07:45:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Definitions/TrackParametrization.hpp"
0012
0013 #include <tuple>
0014
0015 namespace Acts::detail {
0016
0017 template <typename cmp_t>
0018 concept ComponentWithoutCovarianceConcept =
0019 requires { typename std::tuple_size<std::remove_cvref_t<cmp_t>>::type; } &&
0020 (std::tuple_size_v<std::remove_cvref_t<cmp_t>> == 2) &&
0021 requires(const cmp_t& cmp) {
0022 { std::get<0>(cmp) } -> std::convertible_to<const double&>;
0023 { std::get<1>(cmp) } -> std::convertible_to<const BoundVector&>;
0024 };
0025
0026 template <typename cmp_t>
0027 concept ComponentWithCovarianceConcept =
0028 requires { typename std::tuple_size<std::remove_cvref_t<cmp_t>>::type; } &&
0029 (std::tuple_size_v<std::remove_cvref_t<cmp_t>> == 3) &&
0030 requires(const cmp_t& cmp) {
0031 { std::get<0>(cmp) } -> std::convertible_to<const double&>;
0032 { std::get<1>(cmp) } -> std::convertible_to<const BoundVector&>;
0033 { std::get<2>(cmp) } -> std::convertible_to<const BoundMatrix&>;
0034 };
0035
0036 template <typename cmp_t>
0037 concept ComponentConcept = ComponentWithoutCovarianceConcept<cmp_t> ||
0038 ComponentWithCovarianceConcept<cmp_t>;
0039
0040 template <typename projector_t, typename cmp_t>
0041 concept ComponentWithoutCovarianceProjectorConcept =
0042 requires(const projector_t& proj, const cmp_t& cmp) {
0043 { proj(cmp) } -> ComponentWithoutCovarianceConcept;
0044 };
0045
0046 template <typename projector_t, typename cmp_t>
0047 concept ComponentWithCovarianceProjectorConcept =
0048 requires(const projector_t& proj, const cmp_t& cmp) {
0049 { proj(cmp) } -> ComponentWithCovarianceConcept;
0050 };
0051
0052 template <typename projector_t, typename cmp_t>
0053 concept ComponentProjectorConcept =
0054 ComponentWithoutCovarianceProjectorConcept<projector_t, cmp_t> ||
0055 ComponentWithCovarianceProjectorConcept<projector_t, cmp_t>;
0056
0057 template <typename component_range_t, typename projector_t>
0058 concept ComponentRangeAndProjectorWithoutCovarianceConcept =
0059 std::ranges::range<component_range_t> &&
0060 requires(const component_range_t& cmps, const projector_t& proj) {
0061 { proj(*cmps.begin()) } -> ComponentWithoutCovarianceConcept;
0062 };
0063
0064 template <typename component_range_t, typename projector_t>
0065 concept ComponentRangeAndProjectorWithCovarianceConcept =
0066 std::ranges::range<component_range_t> &&
0067 requires(const component_range_t& cmps, const projector_t& proj) {
0068 { proj(*cmps.begin()) } -> ComponentWithCovarianceConcept;
0069 };
0070
0071 }