Jpp  master_rocky
the software that should make you happy
JDAQFrame.hh
Go to the documentation of this file.
1 #ifndef __JDAQFRAME__
2 #define __JDAQFRAME__
3 
4 #include <stdlib.h>
5 #include <string.h>
6 #include <string>
7 #include <iterator>
8 #include <algorithm>
9 
13 
14 
15 /**
16  * \author mdejong
17  */
18 namespace KM3NETDAQ {
19 
20  /**
21  * Subset of data frame.
22  **/
24  {
25  public:
26 
27  typedef const JDAQHit* const_iterator;
28  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
29 
30 
31  /**
32  * Constructor.
33  *
34  * \param number_of_hits number of hits
35  * \param data pointer to data
36  */
37  JDAQFrameSubset(const int number_of_hits, const JDAQHit* data) :
38  numberOfHits(number_of_hits),
39  buffer(data)
40  {}
41 
42 
43  const_iterator begin() const { return buffer; }
44  const_iterator end() const { return buffer + numberOfHits; }
45 
48 
49  bool empty() const { return numberOfHits == 0; }
50 
51  int size() const { return numberOfHits; }
52 
53  const JDAQHit* data() const { return buffer; }
54 
55 
56  private:
57  const int numberOfHits;
58  const JDAQHit* buffer;
59  };
60 
61 
62  /**
63  * Data frame.
64  */
65  class JDAQFrame
66  {
67  public:
68 
69  typedef const JDAQHit* const_iterator;
70  typedef JDAQHit* iterator;
71  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
72  typedef std::reverse_iterator<iterator> reverse_iterator;
73 
74  friend size_t getSizeof(const JDAQFrame&);
75  friend JReader& operator>>(JReader&, JDAQFrame&);
76  friend JWriter& operator<<(JWriter&, const JDAQFrame&);
77 
78  /**
79  * Default constructor.
80  */
82  numberOfHits(0),
83  buffer(NULL)
84  {}
85 
86 
87  /**
88  * Copy constructor.
89  *
90  * \param frame frame
91  */
92  JDAQFrame(const JDAQFrame& frame) :
93  numberOfHits(0),
94  buffer(NULL)
95  {
96  add(frame);
97  }
98 
99 
100  /**
101  * Move constructor.
102  *
103  * \param frame frame
104  */
105  JDAQFrame(JDAQFrame&& frame) :
106  numberOfHits(frame.numberOfHits),
107  buffer (frame.buffer)
108  {
109  frame.numberOfHits = 0;
110  frame.buffer = NULL;
111  }
112 
113 
114  /**
115  * Constructor.
116  *
117  * \param number_of_hits number of hits
118  * \param data pointer to data
119  */
120  JDAQFrame(const int number_of_hits, const JDAQHit* data) :
121  numberOfHits(0),
122  buffer(NULL)
123  {
124  add(number_of_hits, data);
125  }
126 
127 
128  /**
129  * Destructor.
130  */
131  virtual ~JDAQFrame()
132  {
133  clear();
134  }
135 
136 
137  /**
138  * Assignment operator.
139  *
140  * \param frame frame
141  * \return this frame
142  */
144  {
145  add(frame);
146 
147  return *this;
148  }
149 
150 
151  /**
152  * Clear data.
153  */
154  void clear()
155  {
156  if (buffer != NULL) {
157  free(buffer);
158  }
159 
160  numberOfHits = 0;
161  buffer = NULL;
162  }
163 
164 
165  const_iterator begin() const { return buffer; }
166  const_iterator end() const { return buffer + numberOfHits; }
167 
168 
169  iterator begin() { return buffer; }
170  iterator end() { return buffer + numberOfHits; }
171 
172 
175 
176 
179 
180 
181  bool empty() const { return numberOfHits == 0; }
182 
183  int size() const { return numberOfHits; }
184 
185  const JDAQHit* data() const { return buffer; }
186  JDAQHit* data() { return buffer; }
187 
188 
189  /**
190  * Get hit at given index.
191  *
192  * \param index index
193  * \return hit
194  */
195  const JDAQHit& operator[](int index) const
196  {
197  return buffer[index];
198  }
199 
200  /**
201  * Get subset of data.
202  *
203  * \param i1 first index of hit (included)
204  * \param i2 last index of hit (excluded)
205  * \return frame
206  */
207  JDAQFrameSubset subset(const int i1, const int i2) const
208  {
209  return JDAQFrameSubset(i2 - i1, buffer + i1);
210  }
211 
212 
213  /**
214  * Add data.
215  *
216  * \param frame frame
217  * \return this frame
218  */
219  JDAQFrame& add(const JDAQFrame& frame)
220  {
221  return add(frame.numberOfHits, frame.buffer);
222  }
223 
224 
225  /**
226  * Add data.
227  *
228  * \param number_of_hits number of hits
229  * \param data pointer to data
230  * \return this data frame
231  */
232  JDAQFrame& add(const int number_of_hits, const JDAQHit* data)
233  {
234  if (number_of_hits > 0) {
235 
236  resize(numberOfHits + number_of_hits);
237 
238  memcpy(buffer + numberOfHits - number_of_hits, data, number_of_hits * sizeof(JDAQHit));
239  }
240 
241  return *this;
242  }
243 
244 
245  /**
246  * Swap data.
247  *
248  * \param frame frame
249  */
250  void swap(JDAQFrame& frame)
251  {
252  std::swap(numberOfHits, frame.numberOfHits);
253  std::swap(buffer, frame.buffer);
254  }
255 
256 
257  int numberOfHits; // following comment line is used by rootcint
258  JDAQHit* buffer; // [numberOfHits]
259 
260 
262 
263 
264  protected:
265  /**
266  * Resize internal buffer.
267  *
268  * This method increases the size of the buffer if necessary.
269  * Otherwise, the current size is maintained.
270  *
271  * \param number_of_hits total number of hits to allocate
272  */
273  void resize(const int number_of_hits)
274  {
275  if (number_of_hits > numberOfHits) {
276 
277  const int number_of_bytes = number_of_hits * sizeof(JDAQHit);
278 
279  if (buffer == NULL)
280  buffer = (JDAQHit*) malloc(number_of_bytes);
281  else
282  buffer = (JDAQHit*) realloc(buffer, number_of_bytes);
283 
284  if (buffer == NULL) {
285  throw JDAQException("JDAQFrame::resize(): Memory exception - number of hits = " + std::to_string(number_of_hits));
286  }
287 
288  numberOfHits = number_of_hits;
289  }
290  }
291  };
292 
293 
294  /**
295  * Equal operator for DAQ frames.
296  *
297  * \param first frame
298  * \param second frame
299  * \result true if first frame equal to second; else false
300  */
301  inline bool operator==(const JDAQFrame& first,
302  const JDAQFrame& second)
303  {
304  if (first.size() == second.size()) {
305 
306  for (JDAQFrame::const_iterator p = first.begin(), q = second.begin(); p != first.end(); ++p, ++q) {
307  if (*p != *q) {
308  return false;
309  }
310  }
311 
312  return true;
313 
314  } else {
315 
316  return false;
317  }
318  }
319 
320 
321  /**
322  * Not-equal operator for DAQ frames.
323  *
324  * \param first frame
325  * \param second frame
326  * \result true if first frame not equal to second; else false
327  */
328  inline bool operator!=(const JDAQFrame& first,
329  const JDAQFrame& second)
330  {
331  return !(first == second);
332  }
333 }
334 
335 #endif
Interface for binary input.
Interface for binary output.
General exception.
Subset of data frame.
Definition: JDAQFrame.hh:24
const JDAQHit * buffer
Definition: JDAQFrame.hh:58
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:27
const_reverse_iterator rend() const
Definition: JDAQFrame.hh:47
const_reverse_iterator rbegin() const
Definition: JDAQFrame.hh:46
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: JDAQFrame.hh:28
JDAQFrameSubset(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:37
const_iterator end() const
Definition: JDAQFrame.hh:44
const_iterator begin() const
Definition: JDAQFrame.hh:43
const JDAQHit * data() const
Definition: JDAQFrame.hh:53
JDAQFrame(const int number_of_hits, const JDAQHit *data)
Constructor.
Definition: JDAQFrame.hh:120
friend size_t getSizeof(const JDAQFrame &)
Get size of object.
Definition: JDAQFrameIO.hh:21
int size() const
Definition: JDAQFrame.hh:183
JDAQHit * data()
Definition: JDAQFrame.hh:186
const_iterator end() const
Definition: JDAQFrame.hh:166
JDAQFrame & add(const int number_of_hits, const JDAQHit *data)
Add data.
Definition: JDAQFrame.hh:232
JDAQFrame()
Default constructor.
Definition: JDAQFrame.hh:81
reverse_iterator rend()
Definition: JDAQFrame.hh:178
JDAQFrame(JDAQFrame &&frame)
Move constructor.
Definition: JDAQFrame.hh:105
void swap(JDAQFrame &frame)
Swap data.
Definition: JDAQFrame.hh:250
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: JDAQFrame.hh:71
JDAQFrame & add(const JDAQFrame &frame)
Add data.
Definition: JDAQFrame.hh:219
friend JReader & operator>>(JReader &, JDAQFrame &)
Read DAQ frame from input.
Definition: JDAQFrameIO.hh:34
reverse_iterator rbegin()
Definition: JDAQFrame.hh:177
JDAQFrameSubset subset(const int i1, const int i2) const
Get subset of data.
Definition: JDAQFrame.hh:207
const_reverse_iterator rend() const
Definition: JDAQFrame.hh:174
const JDAQHit * data() const
Definition: JDAQFrame.hh:185
const_reverse_iterator rbegin() const
Definition: JDAQFrame.hh:173
bool empty() const
Definition: JDAQFrame.hh:181
JDAQFrame(const JDAQFrame &frame)
Copy constructor.
Definition: JDAQFrame.hh:92
void resize(const int number_of_hits)
Resize internal buffer.
Definition: JDAQFrame.hh:273
const JDAQHit & operator[](int index) const
Get hit at given index.
Definition: JDAQFrame.hh:195
const JDAQHit * const_iterator
Definition: JDAQFrame.hh:69
friend JWriter & operator<<(JWriter &, const JDAQFrame &)
Write DAQ frame to output.
Definition: JDAQFrameIO.hh:57
JDAQHit * iterator
Definition: JDAQFrame.hh:70
void clear()
Clear data.
Definition: JDAQFrame.hh:154
virtual ~JDAQFrame()
Destructor.
Definition: JDAQFrame.hh:131
std::reverse_iterator< iterator > reverse_iterator
Definition: JDAQFrame.hh:72
ClassDef(JDAQFrame, 1)
const_iterator begin() const
Definition: JDAQFrame.hh:165
JDAQFrame & operator=(const JDAQFrame &frame)
Assignment operator.
Definition: JDAQFrame.hh:143
Hit data structure.
Definition: JDAQHit.hh:35
std::string to_string(const T &value)
Convert value to string.
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
bool operator!=(const JDAQChronometer &first, const JDAQChronometer &second)
Not-equal operator for DAQ chronometers.
bool operator==(const JDAQChronometer &first, const JDAQChronometer &second)
Equal operator for DAQ chronometers.