Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-03-28 07:45:14

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
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 }  // namespace Acts::detail