25 #ifndef XAPIAN_INCLUDED_WORDACCESS_H
26 #define XAPIAN_INCLUDED_WORDACCESS_H
29 # error config.h must be included first in each C++ source file
33 #include <type_traits>
39 #if HAVE_DECL__BYTESWAP_USHORT || HAVE_DECL__BYTESWAP_ULONG
44 # if HAVE_DECL___BUILTIN_BSWAP16
45 return __builtin_bswap16(value);
46 # elif HAVE_DECL__BYTESWAP_USHORT
47 return _byteswap_ushort(value);
49 return (value << 8) | (value >> 8);
54 # if HAVE_DECL___BUILTIN_BSWAP32
55 return __builtin_bswap32(value);
56 # elif HAVE_DECL__BYTESWAP_ULONG
57 return _byteswap_ulong(value);
59 return (value << 24) |
60 ((value & 0xff00) << 8) |
61 ((value >> 8) & 0xff00) |
67 # if HAVE_DECL___BUILTIN_BSWAP64
68 return __builtin_bswap64(value);
69 # elif HAVE_DECL__BYTESWAP_UINT64
70 return _byteswap_uint64(value);
72 return (value << 56) |
73 ((value & 0xff00) << 40) |
74 ((value & 0xff0000) << 24) |
75 ((value & 0xff000000) << 8) |
76 ((value >> 8) & 0xff000000) |
77 ((value >> 24) & 0xff0000) |
78 ((value >> 40) & 0xff00) |
83 template<
typename UINT>
87 UINT value = *alignment_cast<const UINT*>(ptr);
88 #ifndef WORDS_BIGENDIAN
94 template<
typename T,
typename UINT>
98 if (std::is_signed_v<T>) {
101 if constexpr(
sizeof(T) >
sizeof(UINT)) {
104 UINT v = UINT(value);
105 #ifndef WORDS_BIGENDIAN
108 *alignment_cast<UINT*>(ptr) = v;
111 template<
typename UINT>
116 memcpy(&value, ptr,
sizeof(UINT));
117 #ifndef WORDS_BIGENDIAN
123 template<
typename T,
typename UINT>
127 if (std::is_signed_v<T>) {
130 if constexpr(
sizeof(T) >
sizeof(UINT)) {
133 UINT v = UINT(value);
134 #ifndef WORDS_BIGENDIAN
137 memcpy(ptr, &v,
sizeof(UINT));
143 return do_aligned_read<uint32_t>(ptr);
149 return do_unaligned_read<uint32_t>(ptr);
155 return do_aligned_read<uint16_t>(ptr);
161 return do_unaligned_read<uint16_t>(ptr);
168 do_aligned_write<T, uint32_t>(ptr, value);
175 do_unaligned_write<T, uint32_t>(ptr, value);
182 do_aligned_write<T, uint16_t>(ptr, value);
189 do_unaligned_write<T, uint16_t>(ptr, value);
Cast a pointer we know is suitably aligned.
Various assertion macros.
#define AssertRel(A, REL, B)
void aligned_write2(unsigned char *ptr, T value)
void aligned_write4(unsigned char *ptr, T value)
uint32_t unaligned_read4(const unsigned char *ptr)
UINT do_unaligned_read(const unsigned char *ptr)
void unaligned_write2(unsigned char *ptr, T value)
UINT do_aligned_read(const unsigned char *ptr)
uint16_t unaligned_read2(const unsigned char *ptr)
void do_aligned_write(unsigned char *ptr, T value)
void do_unaligned_write(unsigned char *ptr, T value)
uint16_t aligned_read2(const unsigned char *ptr)
void unaligned_write4(unsigned char *ptr, T value)
uint32_t aligned_read4(const unsigned char *ptr)
uint16_t do_bswap(uint16_t value)