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