Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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  */
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
64 {
65  uint16_t ret;
66  memcpy (&ret, p, sizeof(ret));
67  p += sizeof(ret);
68  return le16toh (ret);
69 }
70 
71 
82 inline
84 {
85  uint32_t ret;
86  memcpy (&ret, p, sizeof(ret));
87  p += sizeof(ret);
88  return le32toh (ret);
89 }
90 
91 
102 inline
104 {
105  uint64_t ret;
106  memcpy (&ret, p, sizeof(ret));
107  p += sizeof(ret);
108  return le64toh (ret);
109 }
110 
111 
122 inline
124 {
125  return std::bit_cast<float> (get_unaligned32 (p));
126 }
127 
128 
139 inline
141 {
142  return std::bit_cast<double> (get_unaligned64 (p));
143 }
144 
145 
147 
148 
149 template <class T>
151 
152 
153 template <>
154 inline
156 {
157  return *p++;
158 }
159 
160 
161 template <>
162 inline
164 {
165  return get_unaligned16 (p);
166 }
167 
168 
169 template <>
170 inline
172 {
173  return get_unaligned32 (p);
174 }
175 
176 
177 template <>
178 inline
180 {
181  return get_unaligned64 (p);
182 }
183 
184 
185 template <>
186 inline
188 {
189  return get_unaligned_float (p);
190 }
191 
192 
193 template <>
194 inline
196 {
197  return get_unaligned_double (p);
198 }
199 
200 
201 template <>
202 inline
204 {
205  return get_unaligned<uint8_t> (p);
206 }
207 
208 
209 template <>
210 inline
212 {
213  return get_unaligned<uint16_t> (p);
214 }
215 
216 
217 template <>
218 inline
220 {
221  return get_unaligned<uint32_t> (p);
222 }
223 
224 
225 template <>
226 inline
228 {
229  return get_unaligned<uint64_t> (p);
230 }
231 
232 
233 } // namespace CxxUtils
234 
235 
236 #endif // not CXXUTILS_GET_UNALIGNED_H
CxxUtils::get_unaligned< int64_t >
int64_t get_unaligned< int64_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:227
CxxUtils::get_unaligned< double >
double get_unaligned< double >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:195
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:557
CxxUtils::get_unaligned< int32_t >
int32_t get_unaligned< int32_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:219
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
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< int16_t >
int16_t get_unaligned< int16_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:211
CxxUtils::le64toh
uint64_t le64toh(uint64_t x)
Definition: get_unaligned.h:44
CxxUtils::get_unaligned
T get_unaligned(const uint8_t *ATH_RESTRICT &p)
Define templated versions of the above functions.
x
#define x
xAOD::int16_t
setScaleOne setStatusOne setSaturated int16_t
Definition: gFexGlobalRoI_v1.cxx:55
ATH_RESTRICT
#define ATH_RESTRICT
Definition: restrict.h:31
CxxUtils::le16toh
uint16_t le16toh(uint16_t x)
Definition: get_unaligned.h:42
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
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
CxxUtils::get_unaligned< uint64_t >
uint64_t get_unaligned< uint64_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:179
CxxUtils::le32toh
uint32_t le32toh(uint32_t x)
Definition: get_unaligned.h:43
CxxUtils
Definition: aligned_vector.h:29
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
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
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
restrict.h
Macro wrapping the nonstandard restrict keyword.
CxxUtils::get_unaligned< uint32_t >
uint32_t get_unaligned< uint32_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:171
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)
Definition: get_unaligned.h:187
CxxUtils::get_unaligned< uint8_t >
uint8_t get_unaligned< uint8_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:155
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< int8_t >
int8_t get_unaligned< int8_t >(const uint8_t *ATH_RESTRICT &p)
Definition: get_unaligned.h:203