Belle II Software  release-05-01-25
NSMVar.cc
1 #include "daq/slc/nsm/NSMVar.h"
2 
3 #include <string.h>
4 #include <stdlib.h>
5 
6 #include <daq/slc/base/Reader.h>
7 #include <daq/slc/base/Writer.h>
8 
9 using namespace Belle2;
10 
11 NSMVar::NSMVar(const std::string& name, const std::vector<int>& value)
12  : m_value(NULL)
13 {
14  int* v = (int*)malloc(value.size() * sizeof(int));
15  for (size_t i = 0; i < value.size(); i++)
16  v[i] = value[i];
17  m_name = name;
18  m_type = INT;
19  m_len = value.size();
20  m_value = v;
21  m_id = 0;
22  m_date = Date().get();
23 }
24 
25 NSMVar::NSMVar(const std::string& name, const std::vector<float>& value)
26  : m_value(NULL)
27 {
28  float* v = (float*)malloc(value.size() * sizeof(float));
29  for (size_t i = 0; i < value.size(); i++)
30  v[i] = value[i];
31  m_name = name;
32  m_type = INT;
33  m_len = value.size();
34  m_value = v;
35  m_id = 0;
36  m_date = Date().get();
37 }
38 
39 const NSMVar& NSMVar::operator=(const std::vector<int>& val)
40 {
41  if (m_value) free(m_value);
42  int* v = (int*)malloc(val.size() * sizeof(int));
43  for (size_t i = 0; i < val.size(); i++)
44  v[i] = val[i];
45  m_value = v;
46  m_type = INT;
47  m_len = val.size();
48  m_date = Date().get();
49  return *this;
50 }
51 
52 const NSMVar& NSMVar::operator=(const std::vector<float>& val)
53 {
54  if (m_value) free(m_value);
55  float* v = (float*)malloc(val.size() * sizeof(int));
56  for (size_t i = 0; i < val.size(); i++)
57  v[i] = val[i];
58  m_value = v;
59  m_type = FLOAT;
60  m_len = val.size();
61  m_date = Date().get();
62  return *this;
63 }
64 
65 int NSMVar::size() const
66 {
67  int s = 1;
68  switch (m_type) {
69  case NONE: s = 0; return 0;
70  case INT: s = 4; break;
71  case FLOAT: s = 4; break;
72  case TEXT: return m_len + 1;
73  default: break;
74  }
75  return (m_len > 0) ? s * m_len : s;
76 }
77 
78 const char* NSMVar::getTypeLabel() const
79 {
80  switch (m_type) {
81  case INT:
82  if (m_len > 0) return "inta";
83  else return "int";
84  case FLOAT:
85  if (m_len > 0) return "floata";
86  else return "float";
87  case TEXT: return "text";
88  default: break;
89  }
90  return "";
91 }
92 
93 void NSMVar::copy(const std::string& name,
94  Type type, int len, const void* value,
95  int id, int date)
96 {
97  if (m_value) free(m_value);
98  m_value = NULL;
99  m_name = name;
100  m_type = type;
101  m_len = len;
102  m_id = id;
103  m_date = (date > 0) ? date : Date().get();
104  int s = size();
105  if (s > 0) {
106  m_value = malloc(s);
107  memcpy(m_value, value, s);
108  } else {
109  m_type = NONE;
110  m_len = 0;
111  m_value = NULL;
112  }
113 }
114 
115 NSMVar::~NSMVar()
116 {
117  if (m_value) free(m_value);
118 }
119 
120 void NSMVar::readObject(Reader& reader)
121 {
122  m_node = reader.readString();
123  m_name = reader.readString();
124  m_type = (Type)reader.readInt();
125  m_len = reader.readInt();
126  m_id = reader.readInt();
127  m_date = reader.readInt();
128  int len = (m_len > 0) ? m_len : 1;
129  int s = size();
130  if (s > 0) {
131  if (m_value) free(m_value);
132  m_value = malloc(s);
133  memset(m_value, 0, s);
134  switch (m_type) {
135  case INT: {
136  int* v = (int*)m_value;
137  for (int i = 0; i < len; i++) {
138  v[i] = reader.readInt();
139  }
140  } break;
141  case FLOAT: {
142  float* v = (float*)m_value;
143  for (int i = 0; i < len; i++) {
144  v[i] = reader.readFloat();
145  }
146  } break;
147  case TEXT: {
148  char* v = (char*)m_value;
149  // Use m_len condition instead of len due to empty string problem
150  for (int i = 0; i < m_len; i++) {
151  v[i] = reader.readChar();
152  }
153  } break;
154  default: return;
155  }
156  }
157 }
158 
159 void NSMVar::writeObject(Writer& writer) const
160 {
161  writer.writeString(m_node);
162  writer.writeString(m_name);
163  writer.writeInt((int)m_type);
164  writer.writeInt(m_len);
165  writer.writeInt(m_id);
166  writer.writeInt(m_date);
167  int len = (m_len > 0) ? m_len : 1;
168  switch (m_type) {
169  case INT: {
170  int* v = (int*)m_value;
171  for (int i = 0; i < len; i++) {
172  writer.writeInt(v[i]);
173  }
174  } break;
175  case FLOAT: {
176  float* v = (float*)m_value;
177  for (int i = 0; i < len; i++) {
178  writer.writeFloat(v[i]);
179  }
180  } break;
181  case TEXT: {
182  char* v = (char*)m_value;
183  writer.write(v, len);
184  } break;
185  default: return;
186  }
187 }
188 
189 int NSMVar::getInt() const
190 {
191  return (m_type == INT&& m_len == 0) ? *(int*)m_value : 0;
192 }
193 
194 float NSMVar::getFloat() const
195 {
196  return (m_type == FLOAT && m_len == 0) ? *(float*)m_value : 0;
197 }
198 
199 const char* NSMVar::getText() const
200 {
201  return (m_type == TEXT && m_len > 0 && m_value != NULL) ? (const char*)m_value : "";
202 }
203 
204 int NSMVar::getInt(int i) const
205 {
206  return (m_type == INT&& i < m_len) ? ((int*)m_value)[i] : 0;
207 }
208 
209 float NSMVar::getFloat(int i) const
210 {
211  return (m_type == FLOAT && i < m_len) ? ((float*)m_value)[i] : 0;
212 }
213 
214 const NSMVar& NSMVar::operator>>(std::vector<int>& val) const
215 {
216  int* pv = (int*)get();
217  val = std::vector<int>();
218  for (int i = 0; i < getLength(); i++) {
219  val.push_back(pv[i]);
220  }
221  return *this;
222 }
223 
224 const NSMVar& NSMVar::operator>>(std::vector<float>& val) const
225 {
226  float* pv = (float*)get();
227  val = std::vector<float>();
228  for (int i = 0; i < getLength(); i++) {
229  val.push_back(pv[i]);
230  }
231  return *this;
232 }
Belle2::Reader
Definition: Reader.h:15
Belle2::Writer
Definition: Writer.h:15
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::Date
Definition: Date.h:12
Belle2::NSMVar
Definition: NSMVar.h:16