File indexing completed on 2026-11-07 10:11:38
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "corecel/data/Collection.hh"
0010 #include "corecel/data/StateDataStore.hh"
0011 #include "celeritas/optical/TrackInitializer.hh"
0012 #include "celeritas/phys/GeneratorInterface.hh"
0013
0014 namespace celeritas
0015 {
0016 namespace optical
0017 {
0018
0019
0020
0021
0022 template<Ownership W, MemSpace M>
0023 struct DirectGeneratorStateData
0024 {
0025
0026
0027 template<class T>
0028 using Items = Collection<T, W, M>;
0029
0030
0031
0032 Items<TrackInitializer> initializers;
0033
0034
0035 CELER_FUNCTION size_type size() const { return initializers.size(); }
0036
0037
0038 explicit CELER_FUNCTION operator bool() const
0039 {
0040 return !initializers.empty();
0041 }
0042
0043
0044 template<Ownership W2, MemSpace M2>
0045 DirectGeneratorStateData<W, M>& operator=(
0046 DirectGeneratorStateData<W2, M2>& other)
0047 {
0048 CELER_EXPECT(other);
0049 initializers = other.initializers;
0050 CELER_ENSURE(*this);
0051 return *this;
0052 }
0053 };
0054
0055
0056
0057
0058
0059 template<MemSpace M>
0060 struct DirectGeneratorState : public GeneratorStateBase
0061 {
0062 StateDataStore<DirectGeneratorStateData, M> store;
0063
0064
0065 auto initializers()
0066 {
0067 return this->store.ref().initializers[ItemRange<TrackInitializer>(
0068 ItemId<TrackInitializer>(this->counters.buffer_size))];
0069 }
0070
0071
0072 explicit operator bool() const { return static_cast<bool>(store); }
0073 };
0074
0075
0076
0077
0078
0079 template<MemSpace M>
0080 void resize(DirectGeneratorStateData<Ownership::value, M>* state,
0081 StreamId,
0082 size_type size)
0083 {
0084 CELER_EXPECT(size > 0);
0085 resize(&state->initializers, size);
0086 CELER_ENSURE(*state);
0087 }
0088
0089
0090 }
0091 }