CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
12 namespace edm {
13 
25  public:
26  typedef unsigned int size_type; // for persistency
27  typedef unsigned int id_type;
28  typedef unsigned short data_type;
29  typedef std::vector<id_type> IdContainer;
30  typedef std::vector<data_type> DataContainer;
31  typedef std::vector<id_type>::iterator IdIter;
32  typedef std::vector<data_type>::iterator DataIter;
33  typedef std::pair<IdIter,DataIter> IterPair;
34  typedef std::vector<id_type>::const_iterator const_IdIter;
35  typedef std::vector<data_type>::const_iterator const_DataIter;
36  typedef std::pair<const_IdIter,const_DataIter> const_IterPair;
37 
38  struct IterHelp {
40  IterHelp(DataFrameContainer const & iv) : v(iv){}
41 
42  DataFrame const & operator()(int i) const {
43  frame.set(v,i);
44  return frame;
45  }
46  private:
48  mutable DataFrame frame;
49  };
50 
51  typedef boost::transform_iterator<IterHelp,boost::counting_iterator<int> > const_iterator;
52 
54  m_subdetId(0), m_stride(0),
55  m_ids(), m_data(){}
56 
57  explicit DataFrameContainer(size_t istride, int isubdet=0, size_t isize=0) :
58  m_subdetId(isubdet), m_stride(istride),
59  m_ids(isize), m_data(isize*m_stride){}
60 
61  void swap(DataFrameContainer & rh) {
64  m_ids.swap(rh.m_ids);
65  m_data.swap(rh.m_data);
66  }
67 
70  this->swap(temp);
71  return *this;
72  }
73 
74  void swap(IdContainer & iic, DataContainer & idc) {
75  m_ids.swap(iic);
76  m_data.swap(idc);
77  }
78 
79  void reserve(size_t isize) {
80  m_ids.reserve(isize);
81  m_data.reserve(isize*m_stride);
82  }
83 
84  void resize(size_t isize) {
85  m_ids.resize(isize);
86  m_data.resize(isize*m_stride);
87  }
88 
89  void sort();
90 
91  // FIXME not sure what the best way to add one cell to cont
92  void push_back(id_type iid, data_type const * idata) {
93  m_ids.push_back(iid);
94  size_t cs = m_data.size();
95  m_data.resize(m_data.size()+m_stride);
96  std::copy(idata,idata+m_stride,m_data.begin()+cs);
97  }
98  //make space for it
99  void push_back(id_type iid) {
100  m_ids.push_back(iid);
101  m_data.resize(m_data.size()+m_stride);
102  }
103  // overwrite back (very ad hoc interface...)
104  void set_back(id_type iid, data_type const * idata) {
105  m_ids.back() = iid;
106  size_t cs = m_data.size()-m_stride;
107  std::copy(idata,idata+m_stride,m_data.begin()+cs);
108  }
109  void set_back(id_type iid) {
110  m_ids.back() = iid;
111  }
112  void set_back(data_type const * idata) {
113  size_t cs = m_data.size()-m_stride;
114  std::copy(idata,idata+m_stride,m_data.begin()+cs);
115  }
116 
118  return DataFrame(*this,size()-1);
119  }
120 
121  void pop_back() {
122  m_ids.resize(m_ids.size()-1);
123  m_data.resize(m_data.size()-m_stride);
124  }
125 
126  //---------------------------------------------------------
127 
128  IterPair pair(size_t i) {
129  return IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
130  }
131 
132  const_IterPair pair(size_t i) const {
133  return const_IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
134  }
135 
137  return DataFrame(*this,i);
138  }
139 
140  DataFrame operator[](size_t i) const {
141  return DataFrame(*this,i);
142  }
143 
144  // slow interface
146  const_IdIter p = std::lower_bound(m_ids.begin(),m_ids.end(),i);
147  return (p==m_ids.end() || (*p)!=i) ? end() :
148  boost::make_transform_iterator(boost::counting_iterator<int>(p-m_ids.begin()),
149  IterHelp(*this));
150  }
151 
153  return boost::make_transform_iterator(boost::counting_iterator<int>(0),
154  IterHelp(*this));
155  }
156  const_iterator end() const {
157  return boost::make_transform_iterator(boost::counting_iterator<int>(size()),
158  IterHelp(*this));
159  }
160 
161 
162  int subdetId() const { return m_subdetId; }
163 
164  size_type stride() const { return m_stride; }
165 
166  bool empty() const { return m_ids.empty();}
167 
168  size_type size() const { return m_ids.size();}
169 
170  data_type operator()(size_t cell, size_t frame) const {
171  return m_data[cell*m_stride+frame];
172  }
173 
174  data_type const * frame(size_t cell) const {
175  return &m_data[cell*m_stride];
176  }
177 
178  id_type id(size_t cell) const {
179  return m_ids[cell];
180  }
181 
182  // IdContainer const & ids() const { return m_ids;}
183  // DataContainer const & data() const { return m_data;}
184 
185  private:
186  // subdetector id (as returned by DetId::subdetId())
188 
189  // can be a enumerator, or a template argument
191 
194 
195  };
196 
197  inline
199  size_type i) :
200  m_id(icont.id(i)), m_data(icont.frame(i)), m_size(icont.stride()){}
201 
202  inline
203  void DataFrame::set(DataFrameContainer const & icont,
204  size_type i) {
205  m_id=icont.id(i);
206  m_data=icont.frame(i);
207  m_size=icont.stride();
208  }
209 
210  // Free swap function
211  inline
212  void
214  lhs.swap(rhs);
215  }
216 
217 }
218 
219 // The standard allows us to specialize std::swap for non-templates.
220 // This ensures that DataFrameContainer::swap() will be used in algorithms.
221 
222 namespace std {
223  template <> inline void swap(edm::DataFrameContainer& lhs, edm::DataFrameContainer& rhs) {
224  lhs.swap(rhs);
225  }
226 }
227 
228 #endif // DataFormats_Common_DataFrameContainer_h
data_type operator()(size_t cell, size_t frame) const
int i
Definition: DBlmapReader.cc:9
std::pair< IdIter, DataIter > IterPair
data_type const * m_data
Definition: DataFrame.h:71
auto_ptr< ClusterSequence > cs
void resize(size_t isize)
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
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:70
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: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
std::pair< const_IdIter, const_DataIter > const_IterPair
DataFrameContainer & operator=(DataFrameContainer const &rhs)
void swap(DataFrameContainer &rh)
std::vector< id_type >::iterator IdIter
m_id("(unknown)")
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:72
void set_back(id_type iid)
void push_back(id_type iid, data_type const *idata)
const_iterator end() const
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