Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-01-10 10:05:49

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/phys/GeneratorRegistry.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include <memory>
0010 #include <string>
0011 #include <unordered_map>
0012 #include <vector>
0013 
0014 #include "corecel/data/AuxStateVec.hh"
0015 
0016 #include "GeneratorInterface.hh"
0017 
0018 namespace celeritas
0019 {
0020 //---------------------------------------------------------------------------//
0021 /*!
0022  * Manage classes that generate tracks.
0023  *
0024  * This class keeps track of \c GeneratorInterface classes.
0025  */
0026 class GeneratorRegistry
0027 {
0028   public:
0029     //!@{
0030     //! \name Type aliases
0031     using SPGenerator = std::shared_ptr<GeneratorInterface>;
0032     using SPConstGenerator = std::shared_ptr<GeneratorInterface const>;
0033     //!@}
0034 
0035   public:
0036     // Default constructor
0037     GeneratorRegistry() = default;
0038 
0039     //// CONSTRUCTION ////
0040 
0041     //! Get the next available ID
0042     GeneratorId next_id() const { return GeneratorId(generators_.size()); }
0043 
0044     // Register generator
0045     void insert(SPGenerator generator);
0046 
0047     //// ACCESSORS ////
0048 
0049     //! Get the number of defined generators
0050     GeneratorId::size_type size() const { return generators_.size(); }
0051 
0052     //! Whether any generators have been registered
0053     bool empty() const { return generators_.empty(); }
0054 
0055     // Access generator at the given ID
0056     inline SPGenerator const& at(GeneratorId);
0057     inline SPConstGenerator at(GeneratorId) const;
0058 
0059     // Get the label corresponding to the generator
0060     inline std::string const& id_to_label(GeneratorId id) const;
0061 
0062     // Find the ID corresponding to an label
0063     GeneratorId find(std::string const& label) const;
0064 
0065     // Reset the generator counters if the loop aborted early
0066     void reset(AuxStateVec&) const;
0067 
0068   private:
0069     std::vector<SPGenerator> generators_;
0070     std::vector<std::string> labels_;
0071     std::unordered_map<std::string, GeneratorId> gen_ids_;
0072 };
0073 
0074 //---------------------------------------------------------------------------//
0075 // INLINE DEFINITIONS
0076 //---------------------------------------------------------------------------//
0077 /*!
0078  * Access mutable generator at the given ID.
0079  */
0080 auto GeneratorRegistry::at(GeneratorId id) -> SPGenerator const&
0081 {
0082     CELER_EXPECT(id < this->size());
0083     return generators_[id.unchecked_get()];
0084 }
0085 
0086 //---------------------------------------------------------------------------//
0087 /*!
0088  * Access generator at the given ID.
0089  */
0090 auto GeneratorRegistry::at(GeneratorId id) const -> SPConstGenerator
0091 {
0092     CELER_EXPECT(id < this->size());
0093     return generators_[id.unchecked_get()];
0094 }
0095 
0096 //---------------------------------------------------------------------------//
0097 /*!
0098  * Get the label corresponding to the generator.
0099  */
0100 std::string const& GeneratorRegistry::id_to_label(GeneratorId id) const
0101 {
0102     CELER_EXPECT(id < this->size());
0103     return labels_[id.unchecked_get()];
0104 }
0105 
0106 //---------------------------------------------------------------------------//
0107 }  // namespace celeritas