File indexing completed on 2026-04-20 07:46:27
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011 #include "Acts/Utilities/Result.hpp"
0012
0013 #include <concepts>
0014 #include <type_traits>
0015 #include <utility>
0016
0017 namespace Acts {
0018
0019 template <typename actor_t>
0020 concept ActorHasResult = requires { typename actor_t::result_type; };
0021
0022
0023 template <typename actor_t>
0024 struct ActorHasResultStruct {
0025
0026 static constexpr bool value = ActorHasResult<actor_t>;
0027 };
0028
0029 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0030 typename navigator_t, typename... Args>
0031 concept ActorHasActWithoutResult = requires(
0032 const actor_t& a, propagator_state_t& state, const stepper_t& stepper,
0033 const navigator_t& navigator, Args&&... args) {
0034 {
0035 a.act(state, stepper, navigator, std::forward<Args>(args)...)
0036 } -> std::same_as<Result<void>>;
0037 };
0038
0039 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0040 typename navigator_t, typename... Args>
0041 concept ActorHasActWithResult =
0042 ActorHasResult<actor_t> &&
0043 requires(const actor_t& a, propagator_state_t& state,
0044 const stepper_t& stepper, const navigator_t& navigator,
0045 typename actor_t::result_type& result, Args&&... args) {
0046 {
0047 a.act(state, stepper, navigator, result, std::forward<Args>(args)...)
0048 } -> std::same_as<Result<void>>;
0049 };
0050
0051 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0052 typename navigator_t, typename... Args>
0053 concept ActorHasOldVoidInterface =
0054
0055 requires(const actor_t& a, propagator_state_t& state,
0056 const stepper_t& stepper, const navigator_t& navigator,
0057 Args&&... args) {
0058 {
0059 a.act(state, stepper, navigator, std::forward<Args>(args)...)
0060 } -> std::same_as<void>;
0061 } ||
0062
0063 (ActorHasResult<actor_t> &&
0064 requires(const actor_t& a, propagator_state_t& state,
0065 const stepper_t& stepper, const navigator_t& navigator,
0066 typename actor_t::result_type& result, Args&&... args) {
0067 {
0068 a.act(state, stepper, navigator, result, std::forward<Args>(args)...)
0069 } -> std::same_as<void>;
0070 });
0071
0072 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0073 typename navigator_t, typename... Args>
0074 concept ActorHasAct =
0075 ActorHasActWithoutResult<actor_t, propagator_state_t, stepper_t,
0076 navigator_t, Args...> ||
0077 ActorHasActWithResult<actor_t, propagator_state_t, stepper_t, navigator_t,
0078 Args...>;
0079
0080 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0081 typename navigator_t, typename... Args>
0082 concept ActorHasAbortWithoutResult = requires(
0083 const actor_t& a, propagator_state_t& state, const stepper_t& stepper,
0084 const navigator_t& navigator, Args&&... args) {
0085 {
0086 a.checkAbort(state, stepper, navigator, std::forward<Args>(args)...)
0087 } -> std::same_as<bool>;
0088 };
0089
0090 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0091 typename navigator_t, typename... Args>
0092 concept ActorHasAbortWithResult =
0093 ActorHasResult<actor_t> &&
0094 requires(const actor_t& a, propagator_state_t& state,
0095 const stepper_t& stepper, const navigator_t& navigator,
0096 typename actor_t::result_type& result, Args&&... args) {
0097 {
0098 a.checkAbort(state, stepper, navigator, result,
0099 std::forward<Args>(args)...)
0100 } -> std::same_as<bool>;
0101 };
0102
0103 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0104 typename navigator_t, typename... Args>
0105 concept ActorHasAbort =
0106 ActorHasAbortWithoutResult<actor_t, propagator_state_t, stepper_t,
0107 navigator_t, Args...> ||
0108 ActorHasAbortWithResult<actor_t, propagator_state_t, stepper_t, navigator_t,
0109 Args...>;
0110
0111 template <typename actor_t, typename propagator_state_t, typename stepper_t,
0112 typename navigator_t, typename... Args>
0113 concept Actor = (ActorHasAct<actor_t, propagator_state_t, stepper_t,
0114 navigator_t, Args...> ||
0115 ActorHasAbort<actor_t, propagator_state_t, stepper_t,
0116 navigator_t, Args...>) &&
0117 !ActorHasOldVoidInterface<actor_t, propagator_state_t,
0118 stepper_t, navigator_t, Args...>;
0119
0120 }