ATLAS Offline Software
Loading...
Searching...
No Matches
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
41namespace 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
49namespace CxxUtils {
50
51
63inline
64void 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
83inline
84void 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
103inline
104void 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
123inline
124void set_unaligned_float (uint8_t* ATH_RESTRICT & p, float val)
125{
126 set_unaligned32 (p, std::bit_cast<uint32_t> (val));
127}
128
129
141inline
142void 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
151template <class T>
152void set_unaligned (uint8_t* ATH_RESTRICT & p, T val);
153
154
155template <>
156inline
157void set_unaligned<uint8_t> (uint8_t* ATH_RESTRICT & p, uint8_t val)
158{
159 *p++ = val;
160}
161
162
163template <>
164inline
165void set_unaligned<uint16_t> (uint8_t* ATH_RESTRICT & p, uint16_t val)
166{
167 set_unaligned16 (p, val);
168}
169
170
171template <>
172inline
173void set_unaligned<uint32_t> (uint8_t* ATH_RESTRICT & p, uint32_t val)
174{
175 set_unaligned32 (p, val);
176}
177
178
179template <>
180inline
181void set_unaligned<uint64_t> (uint8_t* ATH_RESTRICT & p, uint64_t val)
182{
183 set_unaligned64 (p, val);
184}
185
186
187template <>
188inline
189void set_unaligned<float> (uint8_t* ATH_RESTRICT & p, float f)
190{
191 set_unaligned_float (p, f);
192}
193
194
195template <>
196inline
197void set_unaligned<double> (uint8_t* ATH_RESTRICT & p, double f)
198{
200}
201
202
203template <>
204inline
205void 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
211template <>
212inline
213void 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
219template <>
220inline
221void 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
227template <>
228inline
229void 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
#define x
void set_unaligned< int8_t >(uint8_t *ATH_RESTRICT &p, int8_t val)
void set_unaligned< float >(uint8_t *ATH_RESTRICT &p, float f)
void set_unaligned16(uint8_t *ATH_RESTRICT &p, uint16_t val)
Write a 2-byte little-endian value to a possibly unaligned pointer.
void set_unaligned< int64_t >(uint8_t *ATH_RESTRICT &p, int64_t val)
void set_unaligned< uint64_t >(uint8_t *ATH_RESTRICT &p, uint64_t val)
void set_unaligned32(uint8_t *ATH_RESTRICT &p, uint32_t val)
Write a 4-byte little-endian value to a possibly unaligned pointer.
void set_unaligned< int32_t >(uint8_t *ATH_RESTRICT &p, int32_t val)
void set_unaligned_double(uint8_t *ATH_RESTRICT &p, double val)
Write a little-endian double value to a possibly unaligned pointer.
void set_unaligned< double >(uint8_t *ATH_RESTRICT &p, double f)
void set_unaligned_float(uint8_t *ATH_RESTRICT &p, float val)
Write a little-endian float value to a possibly unaligned pointer.
void set_unaligned< uint32_t >(uint8_t *ATH_RESTRICT &p, uint32_t val)
void set_unaligned64(uint8_t *ATH_RESTRICT &p, uint64_t val)
Write an 8-byte little-endian value to a possibly unaligned pointer.
void set_unaligned(uint8_t *ATH_RESTRICT &p, T val)
Define templated versions of the above functions.
void set_unaligned< uint16_t >(uint8_t *ATH_RESTRICT &p, uint16_t val)
void set_unaligned< int16_t >(uint8_t *ATH_RESTRICT &p, int16_t val)
void set_unaligned< uint8_t >(uint8_t *ATH_RESTRICT &p, uint8_t val)
uint32_t htole32(uint32_t x)
uint16_t htole16(uint16_t x)
uint64_t htole64(uint64_t x)
Macro wrapping the nonstandard restrict keyword.
#define ATH_RESTRICT
Definition restrict.h:31