DP3
DataConvert.h
Go to the documentation of this file.
1 // DataConvert.h: Global functions to convert data values
2 //
3 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
4 // SPDX-License-Identifier: GPL-3.0-or-later
5 
6 #ifndef LOFAR_COMMON_DATACONVERT_H
7 #define LOFAR_COMMON_DATACONVERT_H
8 
9 #include "DataFormat.h"
10 
11 #include <complex>
12 #include <cstdint>
13 
14 // If std::complex is used for the complex types, their functions are
15 // template specialisations, so they need template<>.
16 #ifndef LOFAR_BUILTIN_COMPLEXINT
17 #define LFDC_TMPL_INT template <>
18 #else
19 #define LFDC_TMPL_INT
20 #endif
21 #ifndef LOFAR_BUILTIN_COMPLEXFP
22 #define LFDC_TMPL_FP template <>
23 #else
24 #define LFDC_TMPL_FP
25 #endif
26 
27 namespace dp3 {
28 namespace common {
29 
32 
46 
50 void dataConvert(DataFormat, char* inout, unsigned int nrval);
51 void dataConvert(DataFormat, int8_t* inout, unsigned int nrval);
52 void dataConvert(DataFormat, uint8_t* inout, unsigned int nrval);
53 void dataConvert(DataFormat, int16_t* inout, unsigned int nrval);
54 void dataConvert(DataFormat, uint16_t* inout, unsigned int nrval);
55 void dataConvert(DataFormat, int32_t* inout, unsigned int nrval);
56 void dataConvert(DataFormat, uint32_t* inout, unsigned int nrval);
57 void dataConvert(DataFormat, int64_t* inout, unsigned int nrval);
58 void dataConvert(DataFormat, uint64_t* inout, unsigned int nrval);
59 void dataConvert(DataFormat, float* inout, unsigned int nrval);
60 void dataConvert(DataFormat, double* inout, unsigned int nrval);
61 template <class T>
62 void dataConvert(DataFormat, std::complex<T>* inout, unsigned int nrval);
63 LFDC_TMPL_FP void dataConvert(DataFormat, std::complex<float>* inout,
64  unsigned int nrval);
65 LFDC_TMPL_FP void dataConvert(DataFormat, std::complex<double>* inout,
66  unsigned int nrval);
68 
72 char dataConvert(DataFormat, char in);
73 int8_t dataConvert(DataFormat, int8_t in);
74 uint8_t dataConvert(DataFormat, uint8_t in);
76 
79 int16_t dataConvert(DataFormat, int16_t in);
80 uint16_t dataConvert(DataFormat, uint16_t in);
81 void dataConvert16(DataFormat, void* out, const void* in);
82 void dataConvert16(DataFormat, void* inout);
83 void dataConvert16(DataFormat, void* out, const void* in, unsigned int nrval);
84 void dataConvert16(DataFormat, void* inout, unsigned int nrval);
86 
89 int32_t dataConvert(DataFormat, int32_t in);
90 uint32_t dataConvert(DataFormat, uint32_t in);
91 void dataConvert32(DataFormat, void* out, const void* in);
92 void dataConvert32(DataFormat, void* inout);
93 void dataConvert32(DataFormat, void* out, const void* in, unsigned int nrval);
94 void dataConvert32(DataFormat, void* inout, unsigned int nrval);
96 
99 int64_t dataConvert(DataFormat, int64_t in);
100 uint64_t dataConvert(DataFormat, uint64_t in);
101 void dataConvert64(DataFormat, void* out, const void* in);
102 void dataConvert64(DataFormat, void* inout);
103 void dataConvert64(DataFormat, void* out, const void* in, unsigned int nrval);
104 void dataConvert64(DataFormat, void* inout, unsigned int nrval);
106 
109 void dataConvertFloat(DataFormat, void* out, const void* in);
110 void dataConvertFloat(DataFormat, void* inout);
111 void dataConvertFloat(DataFormat, void* out, const void* in,
112  unsigned int nrval);
113 void dataConvertFloat(DataFormat, void* inout, unsigned int nrval);
115 
118 void dataConvertDouble(DataFormat, void* out, const void* in);
119 void dataConvertDouble(DataFormat, void* inout);
120 void dataConvertDouble(DataFormat, void* out, const void* in,
121  unsigned int nrval);
122 void dataConvertDouble(DataFormat, void* inout, unsigned int nrval);
124 
127 int16_t byteSwap(int16_t in);
128 uint16_t byteSwap(uint16_t in);
129 void byteSwap16(void* out, const void* in);
130 void byteSwap16(void* inout);
131 void byteSwap16(void* out, const void* in, unsigned int nrval);
132 void byteSwap16(void* inout, unsigned int nrval);
134 
137 int32_t byteSwap(int32_t in);
138 uint32_t byteSwap(uint32_t in);
139 void byteSwap32(void* out, const void* in);
140 void byteSwap32(void* inout);
141 void byteSwap32(void* out, const void* in, unsigned int nrval);
142 void byteSwap32(void* inout, unsigned int nrval);
144 
147 int64_t byteSwap(int64_t in);
148 uint64_t byteSwap(uint64_t in);
149 void byteSwap64(void* out, const void* in);
150 void byteSwap64(void* inout);
151 void byteSwap64(void* out, const void* in, unsigned int nrval);
152 void byteSwap64(void* inout, unsigned int nrval);
154 
158 unsigned int boolToBit(void* to, const void* from, unsigned int nvalues,
159  unsigned int startbit = 0);
160 
164 unsigned int bitToBool(void* to, const void* from, unsigned int nvalues,
165  unsigned int startbit = 0);
166 
168 
169 template <class T>
170 inline void dataConvert(DataFormat fmt, std::complex<T>* inout,
171  unsigned int nrval) {
172  dataConvert(fmt, (T*)inout, 2 * nrval);
173 }
174 
175 inline void dataConvert(DataFormat, char*, unsigned int) {}
176 inline void dataConvert(DataFormat, int8_t*, unsigned int) {}
177 inline void dataConvert(DataFormat, uint8_t*, unsigned int) {}
178 inline void dataConvert(DataFormat fmt, int16_t* inout, unsigned int nrval) {
179  dataConvert16(fmt, inout, nrval);
180 }
181 inline void dataConvert(DataFormat fmt, uint16_t* inout, unsigned int nrval) {
182  dataConvert16(fmt, inout, nrval);
183 }
184 inline void dataConvert(DataFormat fmt, int32_t* inout, unsigned int nrval) {
185  dataConvert32(fmt, inout, nrval);
186 }
187 inline void dataConvert(DataFormat fmt, uint32_t* inout, unsigned int nrval) {
188  dataConvert32(fmt, inout, nrval);
189 }
190 inline void dataConvert(DataFormat fmt, int64_t* inout, unsigned int nrval) {
191  dataConvert64(fmt, inout, nrval);
192 }
193 inline void dataConvert(DataFormat fmt, uint64_t* inout, unsigned int nrval) {
194  dataConvert64(fmt, inout, nrval);
195 }
196 inline void dataConvert(DataFormat fmt, float* inout, unsigned int nrval) {
197  dataConvert32(fmt, inout, nrval);
198 }
199 inline void dataConvert(DataFormat fmt, double* inout, unsigned int nrval) {
200  dataConvert64(fmt, inout, nrval);
201 }
202 inline void dataConvert(DataFormat fmt, std::complex<int16_t>* inout,
203  unsigned int nrval) {
204  dataConvert16(fmt, inout, 2 * nrval);
205 }
206 LFDC_TMPL_FP inline void dataConvert(DataFormat fmt, std::complex<float>* inout,
207  unsigned int nrval) {
208  dataConvertFloat(fmt, inout, 2 * nrval);
209 }
211  std::complex<double>* inout,
212  unsigned int nrval) {
213  dataConvertDouble(fmt, inout, 2 * nrval);
214 }
215 
216 inline char dataConvert(DataFormat, char in) { return in; }
217 inline int8_t dataConvert(DataFormat, int8_t in) { return in; }
218 inline uint8_t dataConvert(DataFormat, uint8_t in) { return in; }
219 
220 inline int16_t dataConvert(DataFormat, int16_t in) { return byteSwap(in); }
221 inline uint16_t dataConvert(DataFormat, uint16_t in) { return byteSwap(in); }
222 inline void dataConvert16(DataFormat, void* out, const void* in) {
223  byteSwap16(out, in);
224 }
225 inline void dataConvert16(DataFormat, void* inout) { byteSwap16(inout); }
226 inline void dataConvert16(DataFormat, void* out, const void* in,
227  unsigned int nrval) {
228  byteSwap16(out, in, nrval);
229 }
230 inline void dataConvert16(DataFormat, void* inout, unsigned int nrval) {
231  byteSwap16(inout, nrval);
232 }
233 
234 inline int32_t dataConvert(DataFormat, int32_t in) { return byteSwap(in); }
235 inline uint32_t dataConvert(DataFormat, uint32_t in) { return byteSwap(in); }
236 inline void dataConvert32(DataFormat, void* out, const void* in) {
237  byteSwap32(out, in);
238 }
239 inline void dataConvert32(DataFormat, void* inout) { byteSwap32(inout); }
240 inline void dataConvert32(DataFormat, void* out, const void* in,
241  unsigned int nrval) {
242  byteSwap32(out, in, nrval);
243 }
244 inline void dataConvert32(DataFormat, void* inout, unsigned int nrval) {
245  byteSwap32(inout, nrval);
246 }
247 
248 inline int64_t dataConvert(DataFormat, int64_t in) { return byteSwap(in); }
249 inline uint64_t dataConvert(DataFormat, uint64_t in) { return byteSwap(in); }
250 inline void dataConvert64(DataFormat, void* out, const void* in) {
251  byteSwap64(out, in);
252 }
253 inline void dataConvert64(DataFormat, void* inout) { byteSwap64(inout); }
254 inline void dataConvert64(DataFormat, void* out, const void* in,
255  unsigned int nrval) {
256  byteSwap64(out, in, nrval);
257 }
258 inline void dataConvert64(DataFormat, void* inout, unsigned int nrval) {
259  byteSwap64(inout, nrval);
260 }
261 
262 inline void dataConvertFloat(DataFormat, void* out, const void* in) {
263  byteSwap32(out, in);
264 }
265 inline void dataConvertFloat(DataFormat, void* inout) { byteSwap32(inout); }
266 inline void dataConvertFloat(DataFormat, void* out, const void* in,
267  unsigned int nrval) {
268  byteSwap32(out, in, nrval);
269 }
270 inline void dataConvertFloat(DataFormat, void* inout, unsigned int nrval) {
271  byteSwap32(inout, nrval);
272 }
273 
274 inline void dataConvertDouble(DataFormat, void* out, const void* in) {
275  byteSwap64(out, in);
276 }
277 inline void dataConvertDouble(DataFormat, void* inout) { byteSwap64(inout); }
278 inline void dataConvertDouble(DataFormat, void* out, const void* in,
279  unsigned int nrval) {
280  byteSwap64(out, in, nrval);
281 }
282 inline void dataConvertDouble(DataFormat, void* inout, unsigned int nrval) {
283  byteSwap64(inout, nrval);
284 }
285 
286 inline int16_t byteSwap(int16_t in) {
287  int16_t v;
288  byteSwap16(&v, &in);
289  return v;
290 }
291 
292 inline uint16_t byteSwap(uint16_t in) {
293  uint16_t v;
294  byteSwap16(&v, &in);
295  return v;
296 }
297 
298 inline void byteSwap16(void* out, const void* in) {
299  ((char*)(out))[0] = ((const char*)(in))[1];
300  ((char*)(out))[1] = ((const char*)(in))[0];
301 }
302 
303 inline void byteSwap16(void* inout) {
304  char v0 = ((const char*)(inout))[0];
305  ((char*)(inout))[0] = ((const char*)(inout))[1];
306  ((char*)(inout))[1] = v0;
307 }
308 
309 inline int32_t byteSwap(int32_t in) {
310  int32_t v;
311  byteSwap32(&v, &in);
312  return v;
313 }
314 
315 inline uint32_t byteSwap(uint32_t in) {
316  uint32_t v;
317  byteSwap32(&v, &in);
318  return v;
319 }
320 
321 inline void byteSwap32(void* out, const void* in) {
322  ((char*)(out))[0] = ((const char*)(in))[3];
323  ((char*)(out))[1] = ((const char*)(in))[2];
324  ((char*)(out))[2] = ((const char*)(in))[1];
325  ((char*)(out))[3] = ((const char*)(in))[0];
326 }
327 
328 inline void byteSwap32(void* inout) {
329  char v0 = ((const char*)(inout))[0];
330  char v1 = ((const char*)(inout))[1];
331  ((char*)(inout))[0] = ((const char*)(inout))[3];
332  ((char*)(inout))[1] = ((const char*)(inout))[2];
333  ((char*)(inout))[2] = v1;
334  ((char*)(inout))[3] = v0;
335 }
336 
337 inline int64_t byteSwap(int64_t in) {
338  int64_t v;
339  byteSwap64(&v, &in);
340  return v;
341 }
342 
343 inline uint64_t byteSwap(uint64_t in) {
344  uint64_t v;
345  byteSwap64(&v, &in);
346  return v;
347 }
348 
349 inline void byteSwap64(void* out, const void* in) {
350  ((char*)(out))[0] = ((const char*)(in))[7];
351  ((char*)(out))[1] = ((const char*)(in))[6];
352  ((char*)(out))[2] = ((const char*)(in))[5];
353  ((char*)(out))[3] = ((const char*)(in))[4];
354  ((char*)(out))[4] = ((const char*)(in))[3];
355  ((char*)(out))[5] = ((const char*)(in))[2];
356  ((char*)(out))[6] = ((const char*)(in))[1];
357  ((char*)(out))[7] = ((const char*)(in))[0];
358 }
359 
360 inline void byteSwap64(void* inout) {
361  char v0 = ((const char*)(inout))[0];
362  char v1 = ((const char*)(inout))[1];
363  char v2 = ((const char*)(inout))[2];
364  char v3 = ((const char*)(inout))[3];
365  ((char*)(inout))[0] = ((const char*)(inout))[7];
366  ((char*)(inout))[1] = ((const char*)(inout))[6];
367  ((char*)(inout))[2] = ((const char*)(inout))[5];
368  ((char*)(inout))[3] = ((const char*)(inout))[4];
369  ((char*)(inout))[4] = v3;
370  ((char*)(inout))[5] = v2;
371  ((char*)(inout))[6] = v1;
372  ((char*)(inout))[7] = v0;
373 }
374 
375 } // namespace common
376 } // namespace dp3
377 
378 #undef LFDC_TMPL_FP
379 #undef LFDC_TMPL_INT
380 
381 #endif
#define LFDC_TMPL_FP
Definition: DataConvert.h:22
void dataConvertFloat(DataFormat, void *out, const void *in)
Definition: DataConvert.h:262
void dataConvert(DataFormat, char *inout, unsigned int nrval)
Definition: DataConvert.h:175
void dataConvertDouble(DataFormat, void *out, const void *in)
Definition: DataConvert.h:274
void byteSwap32(void *out, const void *in)
Definition: DataConvert.h:321
int16_t byteSwap(int16_t in)
Definition: DataConvert.h:286
void dataConvert16(DataFormat, void *out, const void *in)
Definition: DataConvert.h:222
void byteSwap64(void *out, const void *in)
Definition: DataConvert.h:349
void byteSwap16(void *out, const void *in)
Definition: DataConvert.h:298
void dataConvert32(DataFormat, void *out, const void *in)
Definition: DataConvert.h:236
unsigned int bitToBool(void *to, const void *from, unsigned int nvalues, unsigned int startbit=0)
unsigned int boolToBit(void *to, const void *from, unsigned int nvalues, unsigned int startbit=0)
void dataConvert64(DataFormat, void *out, const void *in)
Definition: DataConvert.h:250
DataFormat
This file defines an enum for the possible machine data formats.
Definition: DataFormat.h:24
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53