Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:31:42

0001 #ifndef TrackingTools_TransientTrackingRecHit_SeedingLayerSetsLooper
0002 #define TrackingTools_TransientTrackingRecHit_SeedingLayerSetsLooper
0003 
0004 #include <vector>
0005 #include <cstddef>
0006 
0007 /**
0008  * Class to loop over arbitrary containers according to seeding layer sets indices
0009  */
0010 class SeedingLayerSetsLooper {
0011 public:
0012   using LayerSetIndex = unsigned short;
0013 
0014   template <typename T>
0015   class LayerSet {
0016   public:
0017     using internal_iterator_type = std::vector<LayerSetIndex>::const_iterator;
0018     using value_type = typename T::value_type;
0019     using difference_type = typename internal_iterator_type::difference_type;
0020 
0021     LayerSet(const T *container, internal_iterator_type begin, internal_iterator_type end)
0022         : container_(container), begin_(begin), end_(end) {}
0023 
0024     LayerSetIndex size() const { return end_ - begin_; }
0025 
0026     const value_type &operator[](size_t i) const { return (*container_)[*(begin_ + i)]; }
0027 
0028   private:
0029     const T *container_ = nullptr;
0030     internal_iterator_type begin_;
0031     internal_iterator_type end_;
0032   };
0033 
0034   template <typename T>
0035   class LayerSetRange {
0036   public:
0037     LayerSetRange(const T *container, const SeedingLayerSetsLooper *info) : container_(container), info_(info) {}
0038 
0039     class const_iterator {
0040     public:
0041       using internal_iterator_type = std::vector<LayerSetIndex>::const_iterator;
0042       using value_type = LayerSet<T>;
0043       using difference_type = typename internal_iterator_type::difference_type;
0044 
0045       //const_iterator() = default;
0046       const_iterator(const T *container, const SeedingLayerSetsLooper *info, internal_iterator_type iter)
0047           : container_(container), info_(info), iter_(iter) {}
0048 
0049       value_type operator*() const { return value_type(container_, iter_, iter_ + info_->nlayers_); }
0050 
0051       const_iterator &operator++() {
0052         std::advance(iter_, info_->nlayers_);
0053         return *this;
0054       }
0055       const_iterator operator++(int) {
0056         const_iterator clone(*this);
0057         ++(*this);
0058         return clone;
0059       }
0060 
0061       bool operator==(const const_iterator &other) const { return iter_ == other.iter_; }
0062       bool operator!=(const const_iterator &other) const { return !operator==(other); }
0063 
0064     private:
0065       const T *container_ = nullptr;
0066       const SeedingLayerSetsLooper *info_ = nullptr;
0067       internal_iterator_type iter_;
0068     };
0069 
0070     const_iterator begin() const { return const_iterator(container_, info_, info_->layerSetIndices_->begin()); }
0071     const_iterator cbegin() const { return begin(); }
0072     const_iterator end() const { return const_iterator(container_, info_, info_->layerSetIndices_->end()); }
0073     const_iterator cend() const { return end(); }
0074 
0075   private:
0076     const T *container_ = nullptr;
0077     const SeedingLayerSetsLooper *info_;
0078   };
0079 
0080   SeedingLayerSetsLooper() = default;
0081 
0082   /**
0083    * Constructor.
0084    *
0085    * \param nlayers         Number of layers in each SeedingLayerSet
0086    * \param layerSetIndices Pointer to a vector holding the indices of layer sets (pointer to vector is stored)
0087    */
0088   SeedingLayerSetsLooper(unsigned short nlayers, const std::vector<LayerSetIndex> *layerSetIndices)
0089       : nlayers_(nlayers), layerSetIndices_(layerSetIndices) {}
0090 
0091   template <typename T>
0092   LayerSetRange<T> makeRange(const T &container) const {
0093     return LayerSetRange<T>(&container, this);
0094   }
0095 
0096 private:
0097   /// Number of layers in a SeedingLayerSet
0098   unsigned short nlayers_ = 0;
0099 
0100   /**
0101    * Stores SeedingLayerSets as nlayers_ consecutive layer indices.
0102    * Layer indices point to layerHitRanges_, layerNames_, and
0103    * layerDets_. Hence layerSetIndices.size() == nlayers_*"number of layer sets"
0104    */
0105   const std::vector<LayerSetIndex> *layerSetIndices_ = nullptr;
0106 };
0107 
0108 #endif