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