File indexing completed on 2025-07-22 08:23:55
0001
0002
0003
0004
0005
0006
0007
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 }
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 }