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