12#include "detray/definitions/actor.hpp"
13#include "detray/definitions/containers.hpp"
14#include "detray/definitions/detail/qualifiers.hpp"
15#include "detray/propagator/base_actor.hpp"
16#include "detray/propagator/concepts.hpp"
17#include "detray/propagator/detail/type_traits.hpp"
18#include "detray/utils/tuple_helpers.hpp"
46 using state =
typename actor_type::state;
48 using result =
typename actor_type::result;
51 static_assert(std::is_base_of_v<detray::actor::result, result>);
55 detail::tuple_cat_t<detail::state_tuple_t<observers>...>;
58 detail::tuple_cat_t<detail::state_ref_tuple_t<observers>...>;
70 template <
typename actor_states_t,
typename propagator_state_t,
72 DETRAY_HOST_DEVICE
void operator()(actor_states_t &states,
73 propagator_state_t &p_state,
74 subj_result_t &&subject_res = {})
const {
76 auto &actor_state = detail::get<typename actor_type::state &>(states);
82 if constexpr (std::same_as<subj_result_t, actor::empty_result>) {
83 res = actor_type::operator()(actor_state, p_state);
85 res = actor_type::operator()(actor_state, p_state,
86 std::forward<subj_result_t>(subject_res));
90 if (res.status == actor::status::e_notify) {
91 notify(states, p_state, res,
92 std::make_index_sequence<
sizeof...(observers)>{});
103 template <concepts::actor observer_t,
typename actor_states_t,
104 typename propagator_state_t>
105 DETRAY_HOST_DEVICE
inline void notify(
const observer_t &observer,
106 actor_states_t &states,
107 propagator_state_t &p_state,
110 if constexpr (!concepts::composite_actor<observer_t>) {
112 if constexpr (std::same_as<
typename observer_t::state,
113 detray::base_actor::state>) {
114 observer(p_state, res);
116 observer(detail::get<typename observer_t::state &>(states), p_state,
120 observer(states, p_state, res);
132 template <std::size_t... indices,
typename actor_states_t,
133 typename propagator_state_t>
134 DETRAY_HOST_DEVICE
inline void notify(
135 actor_states_t &states, propagator_state_t &p_state,
result &res,
136 std::index_sequence<indices...> )
const {
137 (notify(detail::get<indices>(m_observers), states, p_state, res), ...);
141 DETRAY_NO_UNIQUE_ADDRESS
dtuple<observers...> m_observers = {};
Composition of actors.
Definition composite_actor.hpp:37
principal_actor_t actor_type
Definition composite_actor.hpp:44
detail::tuple_cat_t< detail::state_ref_tuple_t< observers >... > observer_state_refs
Definition composite_actor.hpp:57
void operator()(actor_states_t &states, propagator_state_t &p_state, subj_result_t &&subject_res={}) const
Call to the implementation of the actor (the actor possibly being an observer itself).
Definition composite_actor.hpp:72
typename actor_type::result result
Definition composite_actor.hpp:48
typename actor_type::state state
Definition composite_actor.hpp:46
detail::tuple_cat_t< detail::state_tuple_t< observers >... > observer_states
Definition composite_actor.hpp:54
Concept for a simple actor.
Definition concepts.hpp:25
Detray include(s).
Definition array_operators.hpp:18
detray::tuple< types... > dtuple
Tuple type used by detray storage and dispatch.
Definition containers.hpp:46
Dummy result type that signals that no result is present.
Definition base_actor.hpp:31
Base class actor implementation.
Definition base_actor.hpp:20
Tag whether this is a composite type (hides the def in the actor).
Definition composite_actor.hpp:40