ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Control
CxxUtils
CxxUtils
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
*/
26
27
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
64
void
set_unaligned16
(uint8_t*
ATH_RESTRICT
& p, uint16_t val)
65
{
66
uint16_t tmp =
htole16
(val);
67
memcpy (p, &tmp,
sizeof
(tmp));
68
p +=
sizeof
(tmp);
69
}
70
71
83
inline
84
void
set_unaligned32
(uint8_t*
ATH_RESTRICT
& p, uint32_t val)
85
{
86
uint32_t tmp =
htole32
(val);
87
memcpy (p, &tmp,
sizeof
(tmp));
88
p +=
sizeof
(tmp);
89
}
90
91
103
inline
104
void
set_unaligned64
(uint8_t*
ATH_RESTRICT
& p, uint64_t val)
105
{
106
uint64_t tmp =
htole64
(val);
107
memcpy (p, &tmp,
sizeof
(tmp));
108
p +=
sizeof
(tmp);
109
}
110
111
123
inline
124
void
set_unaligned_float
(uint8_t*
ATH_RESTRICT
& p,
float
val)
125
{
126
set_unaligned32
(p, std::bit_cast<uint32_t> (val));
127
}
128
129
141
inline
142
void
set_unaligned_double
(uint8_t*
ATH_RESTRICT
& p,
double
val)
143
{
144
set_unaligned64
(p, std::bit_cast<uint64_t> (val));
145
}
146
147
149
150
151
template
<
class
T>
152
void
set_unaligned
(uint8_t*
ATH_RESTRICT
& p, T val);
153
154
155
template
<>
156
inline
157
void
set_unaligned<uint8_t>
(uint8_t*
ATH_RESTRICT
& p, uint8_t val)
158
{
159
*p++ = val;
160
}
161
162
163
template
<>
164
inline
165
void
set_unaligned<uint16_t>
(uint8_t*
ATH_RESTRICT
& p, uint16_t val)
166
{
167
set_unaligned16
(p, val);
168
}
169
170
171
template
<>
172
inline
173
void
set_unaligned<uint32_t>
(uint8_t*
ATH_RESTRICT
& p, uint32_t val)
174
{
175
set_unaligned32
(p, val);
176
}
177
178
179
template
<>
180
inline
181
void
set_unaligned<uint64_t>
(uint8_t*
ATH_RESTRICT
& p, uint64_t val)
182
{
183
set_unaligned64
(p, val);
184
}
185
186
187
template
<>
188
inline
189
void
set_unaligned<float>
(uint8_t*
ATH_RESTRICT
& p,
float
f)
190
{
191
set_unaligned_float
(p, f);
192
}
193
194
195
template
<>
196
inline
197
void
set_unaligned<double>
(uint8_t*
ATH_RESTRICT
& p,
double
f)
198
{
199
set_unaligned_double
(p, f);
200
}
201
202
203
template
<>
204
inline
205
void
set_unaligned<int8_t>
(uint8_t*
ATH_RESTRICT
& p, int8_t val)
206
{
207
set_unaligned<uint8_t>
(p, std::bit_cast<uint8_t> (val));
208
}
209
210
211
template
<>
212
inline
213
void
set_unaligned<int16_t>
(uint8_t*
ATH_RESTRICT
& p, int16_t val)
214
{
215
set_unaligned<uint16_t>
(p, std::bit_cast<uint16_t> (val));
216
}
217
218
219
template
<>
220
inline
221
void
set_unaligned<int32_t>
(uint8_t*
ATH_RESTRICT
& p, int32_t val)
222
{
223
set_unaligned<uint32_t>
(p, std::bit_cast<uint32_t> (val));
224
}
225
226
227
template
<>
228
inline
229
void
set_unaligned<int64_t>
(uint8_t*
ATH_RESTRICT
& p, int64_t val)
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
x
#define x
CxxUtils
Definition
aligned_vector.h:29
CxxUtils::set_unaligned< int8_t >
void set_unaligned< int8_t >(uint8_t *ATH_RESTRICT &p, int8_t val)
Definition
set_unaligned.h:205
CxxUtils::set_unaligned< float >
void set_unaligned< float >(uint8_t *ATH_RESTRICT &p, float f)
Definition
set_unaligned.h:189
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< int64_t >
void set_unaligned< int64_t >(uint8_t *ATH_RESTRICT &p, int64_t val)
Definition
set_unaligned.h:229
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_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
CxxUtils::set_unaligned< int32_t >
void set_unaligned< int32_t >(uint8_t *ATH_RESTRICT &p, int32_t val)
Definition
set_unaligned.h:221
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< double >
void set_unaligned< double >(uint8_t *ATH_RESTRICT &p, double f)
Definition
set_unaligned.h:197
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< 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::set_unaligned
void set_unaligned(uint8_t *ATH_RESTRICT &p, T val)
Define templated versions of the above functions.
CxxUtils::set_unaligned< uint16_t >
void set_unaligned< uint16_t >(uint8_t *ATH_RESTRICT &p, uint16_t val)
Definition
set_unaligned.h:165
CxxUtils::set_unaligned< int16_t >
void set_unaligned< int16_t >(uint8_t *ATH_RESTRICT &p, int16_t val)
Definition
set_unaligned.h:213
CxxUtils::set_unaligned< uint8_t >
void set_unaligned< uint8_t >(uint8_t *ATH_RESTRICT &p, uint8_t val)
Definition
set_unaligned.h:157
CxxUtils::htole32
uint32_t htole32(uint32_t x)
Definition
set_unaligned.h:43
CxxUtils::htole16
uint16_t htole16(uint16_t x)
Definition
set_unaligned.h:42
CxxUtils::htole64
uint64_t htole64(uint64_t x)
Definition
set_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