File indexing completed on 2025-09-17 08:53:42
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "corecel/Assert.hh"
0010 #include "corecel/Types.hh"
0011 #include "corecel/sys/ThreadId.hh"
0012 #include "celeritas/optical/CoreTrackData.hh"
0013 #include "celeritas/optical/CoreTrackView.hh"
0014 #include "celeritas/optical/SimTrackView.hh"
0015 #include "celeritas/track/TrackFunctors.hh"
0016
0017 namespace celeritas
0018 {
0019 namespace optical
0020 {
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 template<class T>
0034 class TrackSlotExecutor
0035 {
0036 public:
0037
0038
0039 using ParamsPtr = CoreParamsPtr<MemSpace::native>;
0040 using StatePtr = CoreStatePtr<MemSpace::native>;
0041 using Applier = T;
0042
0043
0044 public:
0045
0046 CELER_FUNCTION
0047 TrackSlotExecutor(ParamsPtr params, StatePtr state, T&& execute_track)
0048 : params_{params}
0049 , state_{state}
0050 , execute_track_{celeritas::forward<T>(execute_track)}
0051 {
0052 }
0053
0054
0055 CELER_FUNCTION void operator()(TrackSlotId ts)
0056 {
0057 CELER_EXPECT(ts < state_->size());
0058 CoreTrackView track(*params_, *state_, ts);
0059 return execute_track_(track);
0060 }
0061
0062
0063 CELER_FORCEINLINE_FUNCTION void operator()(ThreadId thread)
0064 {
0065
0066 return (*this)(TrackSlotId{thread.unchecked_get()});
0067 }
0068
0069 private:
0070 ParamsPtr const params_;
0071 StatePtr const state_;
0072 T execute_track_;
0073 };
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 template<class C, class T>
0087 class ConditionalTrackSlotExecutor
0088 {
0089 public:
0090
0091
0092 using ParamsPtr = CoreParamsPtr<MemSpace::native>;
0093 using StatePtr = CoreStatePtr<MemSpace::native>;
0094 using Applier = T;
0095
0096
0097 public:
0098
0099 CELER_FUNCTION
0100 ConditionalTrackSlotExecutor(ParamsPtr params,
0101 StatePtr state,
0102 C&& applies,
0103 T&& execute_track)
0104 : params_{params}
0105 , state_{state}
0106 , applies_{celeritas::forward<C>(applies)}
0107 , execute_track_{celeritas::forward<T>(execute_track)}
0108 {
0109 }
0110
0111
0112 CELER_FUNCTION void operator()(TrackSlotId ts)
0113 {
0114 CELER_EXPECT(ts < state_->size());
0115 CoreTrackView track(*params_, *state_, ts);
0116 if (!applies_(track))
0117 {
0118 return;
0119 }
0120
0121 return execute_track_(track);
0122 }
0123
0124
0125 CELER_FORCEINLINE_FUNCTION void operator()(ThreadId thread)
0126 {
0127
0128 return (*this)(TrackSlotId{thread.unchecked_get()});
0129 }
0130
0131 private:
0132 ParamsPtr const params_;
0133 StatePtr const state_;
0134 C applies_;
0135 T execute_track_;
0136 };
0137
0138
0139
0140
0141 template<class T>
0142 CELER_FUNCTION TrackSlotExecutor(CoreParamsPtr<MemSpace::native>,
0143 CoreStatePtr<MemSpace::native>,
0144 T&&) -> TrackSlotExecutor<T>;
0145
0146 template<class C, class T>
0147 CELER_FUNCTION
0148 ConditionalTrackSlotExecutor(CoreParamsPtr<MemSpace::native>,
0149 CoreStatePtr<MemSpace::native>,
0150 C&&,
0151 T&&) -> ConditionalTrackSlotExecutor<C, T>;
0152
0153
0154
0155
0156
0157
0158
0159 template<class T>
0160 inline CELER_FUNCTION decltype(auto)
0161 make_active_thread_executor(CoreParamsPtr<MemSpace::native> params,
0162 CoreStatePtr<MemSpace::native> const& state,
0163 T&& apply_track)
0164 {
0165 return ConditionalTrackSlotExecutor{
0166 params, state, AppliesValid{}, celeritas::forward<T>(apply_track)};
0167 }
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177 template<class T>
0178 inline CELER_FUNCTION decltype(auto)
0179 make_action_thread_executor(CoreParamsPtr<MemSpace::native> params,
0180 CoreStatePtr<MemSpace::native> state,
0181 ActionId action,
0182 T&& apply_track)
0183 {
0184 CELER_EXPECT(action);
0185 return ConditionalTrackSlotExecutor{params,
0186 state,
0187 IsStepActionEqual{action},
0188 celeritas::forward<T>(apply_track)};
0189 }
0190
0191
0192 }
0193 }