Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-22 08:23:55

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/Propagator/ActorConcepts.hpp"
0012 
0013 #include <tuple>
0014 #include <utility>
0015 
0016 namespace Acts::detail {
0017 
0018 namespace {
0019 
0020 struct actor_caller {
0021   template <typename actor_t, typename propagator_state_t, typename stepper_t,
0022             typename navigator_t, typename... Args>
0023   static void act(const actor_t& actor, propagator_state_t& state,
0024                   const stepper_t& stepper, const navigator_t& navigator,
0025                   Args&&... args)
0026     requires(
0027         Actor<actor_t, propagator_state_t, stepper_t, navigator_t, Args...>)
0028   {
0029     if constexpr (ActorHasActWithoutResult<actor_t, propagator_state_t,
0030                                            stepper_t, navigator_t, Args...>) {
0031       actor.act(state, stepper, navigator, std::forward<Args>(args)...);
0032       return;
0033     }
0034 
0035     if constexpr (ActorHasActWithResult<actor_t, propagator_state_t, stepper_t,
0036                                         navigator_t, Args...>) {
0037       actor.act(state, stepper, navigator,
0038                 state.template get<typename actor_t::result_type>(),
0039                 std::forward<Args>(args)...);
0040       return;
0041     }
0042   }
0043 
0044   template <typename actor_t, typename propagator_state_t, typename stepper_t,
0045             typename navigator_t, typename... Args>
0046   static bool checkAbort(const actor_t& actor, propagator_state_t& state,
0047                          const stepper_t& stepper, const navigator_t& navigator,
0048                          Args&&... args)
0049     requires(
0050         Actor<actor_t, propagator_state_t, stepper_t, navigator_t, Args...>)
0051   {
0052     if constexpr (ActorHasAbortWithoutResult<actor_t, propagator_state_t,
0053                                              stepper_t, navigator_t, Args...>) {
0054       return actor.checkAbort(state, stepper, navigator,
0055                               std::forward<Args>(args)...);
0056     }
0057 
0058     if constexpr (ActorHasAbortWithResult<actor_t, propagator_state_t,
0059                                           stepper_t, navigator_t, Args...>) {
0060       return actor.checkAbort(
0061           state, stepper, navigator,
0062           state.template get<typename actor_t::result_type>(),
0063           std::forward<Args>(args)...);
0064     }
0065 
0066     return false;
0067   }
0068 };
0069 
0070 }  // namespace
0071 
0072 template <typename... actors_t>
0073 struct actor_list_impl {
0074   template <typename propagator_state_t, typename stepper_t,
0075             typename navigator_t, typename... Args>
0076   static void act(const std::tuple<actors_t...>& actor_tuple,
0077                   propagator_state_t& state, const stepper_t& stepper,
0078                   const navigator_t& navigator, Args&&... args) {
0079     std::apply(
0080         [&](const actors_t&... actor) {
0081           (actor_caller::act(actor, state, stepper, navigator,
0082                              std::forward<Args>(args)...),
0083            ...);
0084         },
0085         actor_tuple);
0086   }
0087 
0088   template <typename propagator_state_t, typename stepper_t,
0089             typename navigator_t, typename... Args>
0090   static bool checkAbort(const std::tuple<actors_t...>& actor_tuple,
0091                          propagator_state_t& state, const stepper_t& stepper,
0092                          const navigator_t& navigator, Args&&... args) {
0093     return std::apply(
0094         [&](const actors_t&... actor) {
0095           return (actor_caller::checkAbort(actor, state, stepper, navigator,
0096                                            std::forward<Args>(args)...) ||
0097                   ...);
0098         },
0099         actor_tuple);
0100   }
0101 };
0102 
0103 }  // namespace Acts::detail