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
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
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
0084
0085
0086
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
0098 unsigned short nlayers_ = 0;
0099
0100
0101
0102
0103
0104
0105 const std::vector<LayerSetIndex> *layerSetIndices_ = nullptr;
0106 };
0107
0108 #endif