CMS 3D CMS Logo

DataFrameContainer.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_DataFrameContainer_h
2 #define DataFormats_Common_DataFrameContainer_h
3 
5 
6 #include <boost/iterator/transform_iterator.hpp>
7 #include <boost/iterator/counting_iterator.hpp>
8 
9 #include <vector>
10 #include <algorithm>
11 #include <cstddef> // for size_t
12 #include <utility> // for pair
13 
14 class TestDataFrame;
15 
16 template <typename DigiCollection>
18 
19 namespace edm {
20 
32  public:
33  typedef unsigned int size_type; // for persistency
34  typedef unsigned int id_type;
35  typedef unsigned short data_type;
36  typedef std::vector<id_type> IdContainer;
37  typedef std::vector<data_type> DataContainer;
38  typedef std::vector<id_type>::iterator IdIter;
39  typedef std::vector<data_type>::iterator DataIter;
40  typedef std::pair<IdIter, DataIter> IterPair;
41  typedef std::vector<id_type>::const_iterator const_IdIter;
42  typedef std::vector<data_type>::const_iterator const_DataIter;
43  typedef std::pair<const_IdIter, const_DataIter> const_IterPair;
44 
45  struct IterHelp {
47  IterHelp(DataFrameContainer const& iv) : v(iv) {}
48 
49  DataFrame const& operator()(int i) const {
50  frame.set(v, i);
51  return frame;
52  }
53 
54  private:
56  mutable DataFrame frame;
57  };
58 
59  typedef boost::transform_iterator<IterHelp, boost::counting_iterator<int> > const_iterator;
60 
62 
63  explicit DataFrameContainer(size_t istride, int isubdet = 0, size_t isize = 0)
64  : m_subdetId(isubdet), m_stride(istride), m_ids(isize), m_data(isize * m_stride) {}
65 
69  m_ids.swap(rh.m_ids);
70  m_data.swap(rh.m_data);
71  }
72 
75  this->swap(temp);
76  return *this;
77  }
78 
79  void swap(IdContainer& iic, DataContainer& idc) {
80  m_ids.swap(iic);
81  m_data.swap(idc);
82  }
83 
84  void reserve(size_t isize) {
85  m_ids.reserve(isize);
86  m_data.reserve(isize * m_stride);
87  }
88 
89  void resize(size_t isize) {
90  m_ids.resize(isize);
91  m_data.resize(isize * m_stride);
92  }
93 
94  void sort();
95 
96  // FIXME not sure what the best way to add one cell to cont
97  void push_back(id_type iid, data_type const* idata) {
98  m_ids.push_back(iid);
99  size_t cs = m_data.size();
100  m_data.resize(m_data.size() + m_stride);
101  std::copy(idata, idata + m_stride, m_data.begin() + cs);
102  }
103  //make space for it
104  void push_back(id_type iid) {
105  m_ids.push_back(iid);
106  m_data.resize(m_data.size() + m_stride);
107  }
108  // overwrite back (very ad hoc interface...)
109  void set_back(id_type iid, data_type const* idata) {
110  m_ids.back() = iid;
111  size_t cs = m_data.size() - m_stride;
112  std::copy(idata, idata + m_stride, m_data.begin() + cs);
113  }
114  void set_back(id_type iid) { m_ids.back() = iid; }
115  void set_back(data_type const* idata) {
116  size_t cs = m_data.size() - m_stride;
117  std::copy(idata, idata + m_stride, m_data.begin() + cs);
118  }
119 
120  DataFrame back() { return DataFrame(*this, size() - 1); }
121 
122  void pop_back() {
123  m_ids.resize(m_ids.size() - 1);
124  m_data.resize(m_data.size() - m_stride);
125  }
126 
127  //---------------------------------------------------------
128 
129  IterPair pair(size_t i) { return IterPair(m_ids.begin() + i, m_data.begin() + i * m_stride); }
130 
131  const_IterPair pair(size_t i) const { return const_IterPair(m_ids.begin() + i, m_data.begin() + i * m_stride); }
132 
133  DataFrame operator[](size_t i) { return DataFrame(*this, i); }
134 
135  DataFrame operator[](size_t i) const { return DataFrame(*this, i); }
136 
137  // slow interface
138  const_iterator find(id_type i) const {
139  const_IdIter p = std::lower_bound(m_ids.begin(), m_ids.end(), i);
140  return (p == m_ids.end() || (*p) != i)
141  ? end()
142  : boost::make_transform_iterator(boost::counting_iterator<int>(p - m_ids.begin()), IterHelp(*this));
143  }
144 
145  const_iterator begin() const {
146  return boost::make_transform_iterator(boost::counting_iterator<int>(0), IterHelp(*this));
147  }
148  const_iterator end() const {
149  return boost::make_transform_iterator(boost::counting_iterator<int>(size()), IterHelp(*this));
150  }
151 
152  int subdetId() const { return m_subdetId; }
153 
154  size_type stride() const { return m_stride; }
155 
156  bool empty() const { return m_ids.empty(); }
157 
158  size_type size() const { return m_ids.size(); }
159 
160  data_type operator()(size_t cell, size_t frame) const { return m_data[cell * m_stride + frame]; }
161 
162  data_type const* frame(size_t cell) const { return &m_data[cell * m_stride]; }
163 
164  id_type id(size_t cell) const { return m_ids[cell]; }
165 
166  IdContainer const& ids() const { return m_ids; }
167  DataContainer const& data() const { return m_data; }
168 
169  private:
170  //for testing
171  friend class ::TestDataFrame;
172 
173  template <typename DigiCollection>
174  friend class ::TestEcalDigi;
175 
176  // subdetector id (as returned by DetId::subdetId())
178 
179  // can be a enumerator, or a template argument
180  size_type m_stride;
181 
182  IdContainer m_ids;
183  DataContainer m_data;
184  };
185 
187  : m_id(icont.id(i)), m_data(icont.frame(i)), m_size(icont.stride()) {}
188 
189  inline void DataFrame::set(DataFrameContainer const& icont, size_type i) {
190  m_id = icont.id(i);
191  m_data = icont.frame(i);
192  m_size = icont.stride();
193  }
194 
195  // Free swap function
196  inline void swap(DataFrameContainer& lhs, DataFrameContainer& rhs) { lhs.swap(rhs); }
197 
198 } // namespace edm
199 
200 // The standard allows us to specialize std::swap for non-templates.
201 // This ensures that DataFrameContainer::swap() will be used in algorithms.
202 
203 namespace std {
204  template <>
206  lhs.swap(rhs);
207  }
208 } // namespace std
209 
210 #endif // DataFormats_Common_DataFrameContainer_h
data_type operator()(size_t cell, size_t frame) const
IdContainer const & ids() const
data_type const * m_data
Definition: DataFrame.h:52
void resize(size_t isize)
std::vector< data_type >::iterator DataIter
void push_back(id_type iid)
unique_ptr< ClusterSequence > cs
IterHelp(DataFrameContainer const &iv)
constexpr DataFrame()
Definition: DataFrame.h:23
size_type stride() const
DataFrameContainer(size_t istride, int isubdet=0, size_t isize=0)
const_iterator begin() const
DataFrame operator[](size_t i) const
id_type m_id
Definition: DataFrame.h:51
id_type id(size_t cell) const
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
unsigned int size_type
Definition: DataFrame.h:17
void swap(IdContainer &iic, DataContainer &idc)
DataFrame const & operator()(int i) const
const_iterator find(id_type i) const
std::vector< data_type > DataContainer
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
std::vector< data_type >::const_iterator const_DataIter
std::vector< id_type >::const_iterator const_IdIter
DataFrameContainer & operator=(DataFrameContainer const &rhs)
void swap(DataFrameContainer &rh)
std::vector< id_type >::iterator IdIter
void set_back(data_type const *idata)
void reserve(size_t isize)
void set(DataFrameContainer const &icont, size_type i)
DataFrameContainer const & v
size_type m_size
Definition: DataFrame.h:53
std::pair< IdIter, DataIter > IterPair
void set_back(id_type iid)
std::pair< const_IdIter, const_DataIter > const_IterPair
void push_back(id_type iid, data_type const *idata)
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
const_iterator end() const
HLT enums.
std::vector< id_type > IdContainer
DataFrame operator[](size_t i)
const_IterPair pair(size_t i) const
DataContainer const & data() const
void set_back(id_type iid, data_type const *idata)
data_type const * frame(size_t cell) const