ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Control
CxxUtils
CxxUtils
get_unaligned.h
Go to the documentation of this file.
1
// This file's extension implies that it's C, but it's really -*- C++ -*-.
2
/*
3
* Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration.
4
*/
26
27
28
#ifndef CXXUTILS_GET_UNALIGNED_H
29
#define CXXUTILS_GET_UNALIGNED_H
30
31
32
#include "
CxxUtils/restrict.h
"
33
#include <cstring>
34
#include <cstdint>
35
#include <bit>
36
37
38
#ifdef __linux__
39
# include <endian.h>
40
#else
41
namespace
CxxUtils
{
42
inline
uint16_t
le16toh
(uint16_t
x
) {
return
x
; }
43
inline
uint32_t
le32toh
(uint32_t
x
) {
return
x
; }
44
inline
uint64_t
le64toh
(uint64_t
x
) {
return
x
; }
45
}
46
#endif
47
48
49
namespace
CxxUtils
{
50
51
62
inline
63
uint16_t
get_unaligned16
(
const
uint8_t*
ATH_RESTRICT
& p)
64
{
65
uint16_t ret;
66
memcpy (&ret, p,
sizeof
(ret));
67
p +=
sizeof
(ret);
68
return
le16toh
(ret);
69
}
70
71
82
inline
83
uint32_t
get_unaligned32
(
const
uint8_t*
ATH_RESTRICT
& p)
84
{
85
uint32_t ret;
86
memcpy (&ret, p,
sizeof
(ret));
87
p +=
sizeof
(ret);
88
return
le32toh
(ret);
89
}
90
91
102
inline
103
uint64_t
get_unaligned64
(
const
uint8_t*
ATH_RESTRICT
& p)
104
{
105
uint64_t ret;
106
memcpy (&ret, p,
sizeof
(ret));
107
p +=
sizeof
(ret);
108
return
le64toh
(ret);
109
}
110
111
122
inline
123
float
get_unaligned_float
(
const
uint8_t*
ATH_RESTRICT
& p)
124
{
125
return
std::bit_cast<float> (
get_unaligned32
(p));
126
}
127
128
139
inline
140
double
get_unaligned_double
(
const
uint8_t*
ATH_RESTRICT
& p)
141
{
142
return
std::bit_cast<double> (
get_unaligned64
(p));
143
}
144
145
147
148
149
template
<
class
T>
150
T
get_unaligned
(
const
uint8_t*
ATH_RESTRICT
& p);
151
152
153
template
<>
154
inline
155
uint8_t
get_unaligned<uint8_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
156
{
157
return
*p++;
158
}
159
160
161
template
<>
162
inline
163
uint16_t
get_unaligned<uint16_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
164
{
165
return
get_unaligned16
(p);
166
}
167
168
169
template
<>
170
inline
171
uint32_t
get_unaligned<uint32_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
172
{
173
return
get_unaligned32
(p);
174
}
175
176
177
template
<>
178
inline
179
uint64_t
get_unaligned<uint64_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
180
{
181
return
get_unaligned64
(p);
182
}
183
184
185
template
<>
186
inline
187
float
get_unaligned<float>
(
const
uint8_t*
ATH_RESTRICT
& p)
188
{
189
return
get_unaligned_float
(p);
190
}
191
192
193
template
<>
194
inline
195
double
get_unaligned<double>
(
const
uint8_t*
ATH_RESTRICT
& p)
196
{
197
return
get_unaligned_double
(p);
198
}
199
200
201
template
<>
202
inline
203
int8_t
get_unaligned<int8_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
204
{
205
return
get_unaligned<uint8_t>
(p);
206
}
207
208
209
template
<>
210
inline
211
int16_t
get_unaligned<int16_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
212
{
213
return
get_unaligned<uint16_t>
(p);
214
}
215
216
217
template
<>
218
inline
219
int32_t
get_unaligned<int32_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
220
{
221
return
get_unaligned<uint32_t>
(p);
222
}
223
224
225
template
<>
226
inline
227
int64_t
get_unaligned<int64_t>
(
const
uint8_t*
ATH_RESTRICT
& p)
228
{
229
return
get_unaligned<uint64_t>
(p);
230
}
231
232
233
}
// namespace CxxUtils
234
235
236
#endif
// not CXXUTILS_GET_UNALIGNED_H
x
#define x
CxxUtils
Definition
aligned_vector.h:29
CxxUtils::get_unaligned< float >
float get_unaligned< float >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:187
CxxUtils::le32toh
uint32_t le32toh(uint32_t x)
Definition
get_unaligned.h:43
CxxUtils::get_unaligned_double
double get_unaligned_double(const uint8_t *ATH_RESTRICT &p)
Read a little-endian double value from a possibly unaligned pointer.
Definition
get_unaligned.h:140
CxxUtils::get_unaligned32
uint32_t get_unaligned32(const uint8_t *ATH_RESTRICT &p)
Read a 4-byte little-endian value from a possibly unaligned pointer.
Definition
get_unaligned.h:83
CxxUtils::get_unaligned< int16_t >
int16_t get_unaligned< int16_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:211
CxxUtils::get_unaligned
T get_unaligned(const uint8_t *ATH_RESTRICT &p)
Define templated versions of the above functions.
CxxUtils::get_unaligned16
uint16_t get_unaligned16(const uint8_t *ATH_RESTRICT &p)
Read a 2-byte little-endian value from a possibly unaligned pointer.
Definition
get_unaligned.h:63
CxxUtils::get_unaligned< uint32_t >
uint32_t get_unaligned< uint32_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:171
CxxUtils::le16toh
uint16_t le16toh(uint16_t x)
Definition
get_unaligned.h:42
CxxUtils::get_unaligned< uint8_t >
uint8_t get_unaligned< uint8_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:155
CxxUtils::get_unaligned< int64_t >
int64_t get_unaligned< int64_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:227
CxxUtils::get_unaligned64
uint64_t get_unaligned64(const uint8_t *ATH_RESTRICT &p)
Read an 8-byte little-endian value from a possibly unaligned pointer.
Definition
get_unaligned.h:103
CxxUtils::get_unaligned< uint16_t >
uint16_t get_unaligned< uint16_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:163
CxxUtils::get_unaligned_float
float get_unaligned_float(const uint8_t *ATH_RESTRICT &p)
Read a little-endian float value from a possibly unaligned pointer.
Definition
get_unaligned.h:123
CxxUtils::get_unaligned< int32_t >
int32_t get_unaligned< int32_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:219
CxxUtils::get_unaligned< int8_t >
int8_t get_unaligned< int8_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:203
CxxUtils::get_unaligned< double >
double get_unaligned< double >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:195
CxxUtils::get_unaligned< uint64_t >
uint64_t get_unaligned< uint64_t >(const uint8_t *ATH_RESTRICT &p)
Definition
get_unaligned.h:179
CxxUtils::le64toh
uint64_t le64toh(uint64_t x)
Definition
get_unaligned.h:44
restrict.h
Macro wrapping the nonstandard restrict keyword.
ATH_RESTRICT
#define ATH_RESTRICT
Definition
restrict.h:31
Generated on
for ATLAS Offline Software by
1.17.0