1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#ifndef DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h
#define DataFormats_SiStripCluster_SiStripApproximateClusterCollection_h
#include <vector>
#include "DataFormats/SiStripCluster/interface/SiStripApproximateCluster.h"
/**
* This class provides a minimal interface that resembles
* edmNew::DetSetVector, but is crafted such that we are comfortable
* to provide an infinite backwards compatibility guarantee for it
* (like all RAW data). Any modifications need to be made with care.
* Please consult core software group if in doubt.
**/
class SiStripApproximateClusterCollection {
public:
// Helper classes to make creation and iteration easier
class Filler {
public:
void push_back(SiStripApproximateCluster const& cluster) { clusters_.push_back(cluster); }
private:
friend SiStripApproximateClusterCollection;
Filler(std::vector<SiStripApproximateCluster>& clusters) : clusters_(clusters) {}
std::vector<SiStripApproximateCluster>& clusters_;
};
class const_iterator;
class DetSet {
public:
using const_iterator = std::vector<SiStripApproximateCluster>::const_iterator;
unsigned int id() const { return coll_->detIds_[detIndex_]; }
const_iterator begin() const { return coll_->clusters_.begin() + clusBegin_; }
const_iterator cbegin() const { return begin(); }
const_iterator end() const { return coll_->clusters_.begin() + clusEnd_; }
const_iterator cend() const { return end(); }
private:
friend SiStripApproximateClusterCollection::const_iterator;
DetSet(SiStripApproximateClusterCollection const* coll, unsigned int detIndex)
: coll_(coll),
detIndex_(detIndex),
clusBegin_(coll_->beginIndices_[detIndex]),
clusEnd_(detIndex == coll_->beginIndices_.size() - 1 ? coll->clusters_.size()
: coll_->beginIndices_[detIndex + 1]) {}
SiStripApproximateClusterCollection const* const coll_;
unsigned int const detIndex_;
unsigned int const clusBegin_;
unsigned int const clusEnd_;
};
class const_iterator {
public:
DetSet operator*() const { return DetSet(coll_, index_); }
const_iterator& operator++() {
++index_;
if (index_ == coll_->detIds_.size()) {
*this = const_iterator();
}
return *this;
}
const_iterator operator++(int) {
const_iterator clone = *this;
++(*this);
return clone;
}
bool operator==(const_iterator const& other) const { return coll_ == other.coll_ and index_ == other.index_; }
bool operator!=(const_iterator const& other) const { return not operator==(other); }
private:
friend SiStripApproximateClusterCollection;
// default-constructed object acts as the sentinel
const_iterator() = default;
const_iterator(SiStripApproximateClusterCollection const* coll) : coll_(coll) {}
SiStripApproximateClusterCollection const* coll_ = nullptr;
unsigned int index_ = 0;
};
// Actual public interface
SiStripApproximateClusterCollection() = default;
void reserve(std::size_t dets, std::size_t clusters);
Filler beginDet(unsigned int detId);
const_iterator begin() const { return clusters_.empty() ? end() : const_iterator(this); }
const_iterator cbegin() const { return begin(); }
const_iterator end() const { return const_iterator(); }
const_iterator cend() const { return end(); }
private:
// The detIds_ and beginIndices_ have one element for each Det. An
// element of beginIndices_ points to the first cluster of the Det
// in clusters_.
std::vector<unsigned int> detIds_; // DetId for the Det
std::vector<unsigned int> beginIndices_;
std::vector<SiStripApproximateCluster> clusters_;
};
#endif
|