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  private:
55  mutable DataFrame frame;
56  };
57 
58  typedef boost::transform_iterator<IterHelp,boost::counting_iterator<int> > const_iterator;
59 
61  m_subdetId(0), m_stride(0),
62  m_ids(), m_data(){}
63 
64  explicit DataFrameContainer(size_t istride, int isubdet=0, size_t isize=0) :
65  m_subdetId(isubdet), m_stride(istride),
66  m_ids(isize), m_data(isize*m_stride){}
67 
68  void swap(DataFrameContainer & rh) {
71  m_ids.swap(rh.m_ids);
72  m_data.swap(rh.m_data);
73  }
74 
77  this->swap(temp);
78  return *this;
79  }
80 
81  void swap(IdContainer & iic, DataContainer & idc) {
82  m_ids.swap(iic);
83  m_data.swap(idc);
84  }
85 
86  void reserve(size_t isize) {
87  m_ids.reserve(isize);
88  m_data.reserve(isize*m_stride);
89  }
90 
91  void resize(size_t isize) {
92  m_ids.resize(isize);
93  m_data.resize(isize*m_stride);
94  }
95 
96  void sort();
97 
98  // FIXME not sure what the best way to add one cell to cont
99  void push_back(id_type iid, data_type const * idata) {
100  m_ids.push_back(iid);
101  size_t cs = m_data.size();
102  m_data.resize(m_data.size()+m_stride);
103  std::copy(idata,idata+m_stride,m_data.begin()+cs);
104  }
105  //make space for it
106  void push_back(id_type iid) {
107  m_ids.push_back(iid);
108  m_data.resize(m_data.size()+m_stride);
109  }
110  // overwrite back (very ad hoc interface...)
111  void set_back(id_type iid, data_type const * idata) {
112  m_ids.back() = iid;
113  size_t cs = m_data.size()-m_stride;
114  std::copy(idata,idata+m_stride,m_data.begin()+cs);
115  }
116  void set_back(id_type iid) {
117  m_ids.back() = iid;
118  }
119  void set_back(data_type const * idata) {
120  size_t cs = m_data.size()-m_stride;
121  std::copy(idata,idata+m_stride,m_data.begin()+cs);
122  }
123 
125  return DataFrame(*this,size()-1);
126  }
127 
128  void pop_back() {
129  m_ids.resize(m_ids.size()-1);
130  m_data.resize(m_data.size()-m_stride);
131  }
132 
133  //---------------------------------------------------------
134 
135  IterPair pair(size_t i) {
136  return IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
137  }
138 
139  const_IterPair pair(size_t i) const {
140  return const_IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
141  }
142 
144  return DataFrame(*this,i);
145  }
146 
147  DataFrame operator[](size_t i) const {
148  return DataFrame(*this,i);
149  }
150 
151  // slow interface
152  const_iterator find(id_type i) const {
153  const_IdIter p = std::lower_bound(m_ids.begin(),m_ids.end(),i);
154  return (p==m_ids.end() || (*p)!=i) ? end() :
155  boost::make_transform_iterator(boost::counting_iterator<int>(p-m_ids.begin()),
156  IterHelp(*this));
157  }
158 
159  const_iterator begin() const {
160  return boost::make_transform_iterator(boost::counting_iterator<int>(0),
161  IterHelp(*this));
162  }
163  const_iterator end() const {
164  return boost::make_transform_iterator(boost::counting_iterator<int>(size()),
165  IterHelp(*this));
166  }
167 
168 
169  int subdetId() const { return m_subdetId; }
170 
171  size_type stride() const { return m_stride; }
172 
173  bool empty() const { return m_ids.empty();}
174 
175  size_type size() const { return m_ids.size();}
176 
177  data_type operator()(size_t cell, size_t frame) const {
178  return m_data[cell*m_stride+frame];
179  }
180 
181  data_type const * frame(size_t cell) const {
182  return &m_data[cell*m_stride];
183  }
184 
185  id_type id(size_t cell) const {
186  return m_ids[cell];
187  }
188 
189  // IdContainer const & ids() const { return m_ids;}
190  // DataContainer const & data() const { return m_data;}
191 
192  private:
193  //for testing
194  friend class ::TestDataFrame;
195 
196  template<typename DigiCollection>
197  friend class ::TestEcalDigi;
198 
199  // subdetector id (as returned by DetId::subdetId())
201 
202  // can be a enumerator, or a template argument
203  size_type m_stride;
204 
205  IdContainer m_ids;
206  DataContainer m_data;
207 
208  };
209 
210  inline
212  size_type i) :
213  m_id(icont.id(i)), m_data(icont.frame(i)), m_size(icont.stride()){}
214 
215  inline
216  void DataFrame::set(DataFrameContainer const & icont,
217  size_type i) {
218  m_id=icont.id(i);
219  m_data=icont.frame(i);
220  m_size=icont.stride();
221  }
222 
223  // Free swap function
224  inline
225  void
227  lhs.swap(rhs);
228  }
229 
230 }
231 
232 // The standard allows us to specialize std::swap for non-templates.
233 // This ensures that DataFrameContainer::swap() will be used in algorithms.
234 
235 namespace std {
236  template <> inline void swap(edm::DataFrameContainer& lhs, edm::DataFrameContainer& rhs) {
237  lhs.swap(rhs);
238  }
239 }
240 
241 #endif // DataFormats_Common_DataFrameContainer_h
data_type operator()(size_t cell, size_t frame) const
std::pair< IdIter, DataIter > IterPair
data_type const * m_data
Definition: DataFrame.h:75
auto_ptr< ClusterSequence > cs
void resize(size_t isize)
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
def copy(args, dbName)
std::vector< data_type >::iterator DataIter
void push_back(id_type iid)
IterHelp(DataFrameContainer const &iv)
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:74
id_type id(size_t cell) const
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:116
unsigned int size_type
Definition: DataFrame.h:18
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
std::pair< const_IdIter, const_DataIter > const_IterPair
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:76
void set_back(id_type iid)
void push_back(id_type iid, data_type const *idata)
const_iterator end() const
HLT enums.
std::vector< id_type > IdContainer
DataFrame operator[](size_t i)
const_IterPair pair(size_t i) const
void set_back(id_type iid, data_type const *idata)
data_type const * frame(size_t cell) const