Belle II Software  release-06-02-00
Reader.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include "daq/slc/base/Reader.h"
9 
10 #include "daq/slc/base/Serializable.h"
11 
12 #include <unistd.h>
13 
14 #define __ENDIAN_L__
15 
16 using namespace Belle2;
17 
18 void Reader::reverse(void* buf, size_t len)
19 {
20  char tmp;
21  for (int c = 0 ; c < (int)len / 2 ; c ++) {
22  tmp = *((char*)buf + c);
23  *((char*)buf + c) = *((char*)buf + len - 1 - c);
24  *((char*)buf + len - 1 - c) = tmp;
25  }
26 }
27 
28 bool Reader::readBool()
29 {
30  bool v;
31  read(&v, sizeof(bool));
32  return v;
33 }
34 
35 char Reader::readChar()
36 {
37  char v;
38  read(&v, sizeof(char));
39  return v;
40 }
41 
42 unsigned char Reader::readUChar()
43 {
44  unsigned char v;
45  read(&v, sizeof(unsigned char));
46  return v;
47 }
48 
49 short Reader::readShort()
50 {
51  short v;
52  read(&v, sizeof(short));
53 #if defined(__ENDIAN_L__)
54  reverse(&v, sizeof(short));
55 #endif
56  return v;
57 }
58 
59 unsigned short Reader::readUShort()
60 {
61  unsigned short v;
62  read(&v, sizeof(unsigned short));
63 #if defined(__ENDIAN_L__)
64  reverse(&v, sizeof(unsigned short));
65 #endif
66  return v;
67 }
68 
69 int Reader::readInt()
70 {
71  int v;
72  read(&v, sizeof(int));
73 #if defined(__ENDIAN_L__)
74  reverse(&v, sizeof(int));
75 #endif
76  return v;
77 }
78 
79 unsigned int Reader::readUInt()
80 {
81  unsigned int v;
82  read(&v, sizeof(unsigned int));
83 #if defined(__ENDIAN_L__)
84  reverse(&v, sizeof(unsigned int));
85 #endif
86  return v;
87 }
88 
89 long long Reader::readLong()
90 {
91  long long v;
92  read(&v, sizeof(long long));
93 #if defined(__ENDIAN_L__)
94  reverse(&v, sizeof(long long));
95 #endif
96  return v;
97 }
98 
99 unsigned long long Reader::readULong()
100 {
101  unsigned long long v;
102  read(&v, sizeof(unsigned long long));
103 #if defined(__ENDIAN_L__)
104  reverse(&v, sizeof(unsigned long long));
105 #endif
106  return v;
107 }
108 
109 float Reader::readFloat()
110 {
111  float v;
112  read(&v, sizeof(float));
113 #if defined(__ENDIAN_L__)
114  reverse(&v, sizeof(float));
115 #endif
116  return v;
117 }
118 
119 double Reader::readDouble()
120 {
121  double v;
122  read(&v, sizeof(double));
123 #if defined(__ENDIAN_L__)
124  reverse(&v, sizeof(double));
125 #endif
126  return v;
127 }
128 
129 const std::string Reader::readString()
130 {
131  int count = readInt();
132  char str[1025];
133  std::string v;
134  while (count > 0) {
135  int c = (count > 1024) ? 1024 : count;
136  read(str, c);
137  v.append(str, 0, c);
138  count -= c;
139  }
140  return v;
141 }
142 
143 void Reader::readObject(Serializable& v)
144 {
145  v.readObject(*this);
146 }
Abstract base class for different kinds of events.