Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
set_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-2025 CERN for the benefit of the ATLAS collaboration.
4  */
28 #ifndef CXXUTILS_SET_UNALIGNED_H
29 #define CXXUTILS_SET_UNALIGNED_H
30 
31 
32 #include "CxxUtils/restrict.h"
33 #include <cstring>
34 #include <bit>
35 #include <cstdint>
36 
37 
38 #ifdef __linux__
39 # include <endian.h>
40 #else
41 namespace CxxUtils {
42  inline uint16_t htole16 (uint16_t x) { return x; }
43  inline uint32_t htole32 (uint32_t x) { return x; }
44  inline uint64_t htole64 (uint64_t x) { return x; }
45 }
46 #endif
47 
48 
49 namespace CxxUtils {
50 
51 
63 inline
65 {
66  uint16_t tmp = htole16 (val);
67  memcpy (p, &tmp, sizeof(tmp));
68  p += sizeof(tmp);
69 }
70 
71 
83 inline
85 {
86  uint32_t tmp = htole32 (val);
87  memcpy (p, &tmp, sizeof(tmp));
88  p += sizeof(tmp);
89 }
90 
91 
103 inline
105 {
106  uint64_t tmp = htole64 (val);
107  memcpy (p, &tmp, sizeof(tmp));
108  p += sizeof(tmp);
109 }
110 
111 
123 inline
125 {
126  set_unaligned32 (p, std::bit_cast<uint32_t> (val));
127 }
128 
129 
141 inline
143 {
144  set_unaligned64 (p, std::bit_cast<uint64_t> (val));
145 }
146 
147 
149 
150 
151 template <class T>
153 
154 
155 template <>
156 inline
158 {
159  *p++ = val;
160 }
161 
162 
163 template <>
164 inline
166 {
167  set_unaligned16 (p, val);
168 }
169 
170 
171 template <>
172 inline
174 {
175  set_unaligned32 (p, val);
176 }
177 
178 
179 template <>
180 inline
182 {
183  set_unaligned64 (p, val);
184 }
185 
186 
187 template <>
188 inline
190 {
192 }
193 
194 
195 template <>
196 inline
198 {
200 }
201 
202 
203 template <>
204 inline
206 {
207  set_unaligned<uint8_t> (p, std::bit_cast<uint8_t> (val));
208 }
209 
210 
211 template <>
212 inline
214 {
215  set_unaligned<uint16_t> (p, std::bit_cast<uint16_t> (val));
216 }
217 
218 
219 template <>
220 inline
222 {
223  set_unaligned<uint32_t> (p, std::bit_cast<uint32_t> (val));
224 }
225 
226 
227 template <>
228 inline
230 {
231  set_unaligned<uint64_t> (p, std::bit_cast<uint64_t> (val));
232 }
233 
234 
235 } // namespace CxxUtils
236 
237 
238 #endif // not CXXUTILS_GET_UNALIGNED_H
CxxUtils::set_unaligned
void set_unaligned(uint8_t *ATH_RESTRICT &p, T val)
Define templated versions of the above functions.
CxxUtils::set_unaligned32
void set_unaligned32(uint8_t *ATH_RESTRICT &p, uint32_t val)
Write a 4-byte little-endian value to a possibly unaligned pointer.
Definition: set_unaligned.h:84
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:557
CxxUtils::set_unaligned< uint64_t >
void set_unaligned< uint64_t >(uint8_t *ATH_RESTRICT &p, uint64_t val)
Definition: set_unaligned.h:181
CxxUtils::set_unaligned< int16_t >
void set_unaligned< int16_t >(uint8_t *ATH_RESTRICT &p, int16_t val)
Definition: set_unaligned.h:213
xAOD::uint32_t
setEventNumber uint32_t
Definition: EventInfo_v1.cxx:127
CxxUtils::set_unaligned16
void set_unaligned16(uint8_t *ATH_RESTRICT &p, uint16_t val)
Write a 2-byte little-endian value to a possibly unaligned pointer.
Definition: set_unaligned.h:64
CxxUtils::set_unaligned< double >
void set_unaligned< double >(uint8_t *ATH_RESTRICT &p, double f)
Definition: set_unaligned.h:197
CxxUtils::htole32
uint32_t htole32(uint32_t x)
Definition: set_unaligned.h:43
CxxUtils::set_unaligned< int8_t >
void set_unaligned< int8_t >(uint8_t *ATH_RESTRICT &p, int8_t val)
Definition: set_unaligned.h:205
x
#define x
xAOD::int16_t
setScaleOne setStatusOne setSaturated int16_t
Definition: gFexGlobalRoI_v1.cxx:55
CxxUtils::set_unaligned< int32_t >
void set_unaligned< int32_t >(uint8_t *ATH_RESTRICT &p, int32_t val)
Definition: set_unaligned.h:221
ATH_RESTRICT
#define ATH_RESTRICT
Definition: restrict.h:31
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:93
CxxUtils::set_unaligned< uint32_t >
void set_unaligned< uint32_t >(uint8_t *ATH_RESTRICT &p, uint32_t val)
Definition: set_unaligned.h:173
CxxUtils::set_unaligned64
void set_unaligned64(uint8_t *ATH_RESTRICT &p, uint64_t val)
Write an 8-byte little-endian value to a possibly unaligned pointer.
Definition: set_unaligned.h:104
CxxUtils
Definition: aligned_vector.h:29
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
hist_file_dump.f
f
Definition: hist_file_dump.py:141
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
CxxUtils::htole64
uint64_t htole64(uint64_t x)
Definition: set_unaligned.h:44
CxxUtils::set_unaligned< float >
void set_unaligned< float >(uint8_t *ATH_RESTRICT &p, float f)
Definition: set_unaligned.h:189
restrict.h
Macro wrapping the nonstandard restrict keyword.
CxxUtils::set_unaligned_float
void set_unaligned_float(uint8_t *ATH_RESTRICT &p, float val)
Write a little-endian float value to a possibly unaligned pointer.
Definition: set_unaligned.h:124
CxxUtils::set_unaligned_double
void set_unaligned_double(uint8_t *ATH_RESTRICT &p, double val)
Write a little-endian double value to a possibly unaligned pointer.
Definition: set_unaligned.h:142
CxxUtils::set_unaligned< int64_t >
void set_unaligned< int64_t >(uint8_t *ATH_RESTRICT &p, int64_t val)
Definition: set_unaligned.h:229
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
CxxUtils::set_unaligned< uint8_t >
void set_unaligned< uint8_t >(uint8_t *ATH_RESTRICT &p, uint8_t val)
Definition: set_unaligned.h:157
CxxUtils::set_unaligned< uint16_t >
void set_unaligned< uint16_t >(uint8_t *ATH_RESTRICT &p, uint16_t val)
Definition: set_unaligned.h:165
CxxUtils::htole16
uint16_t htole16(uint16_t x)
Definition: set_unaligned.h:42