10#pragma qt_class(QtEndian)
13#include <QtCore/qfloat16.h>
14#include <QtCore/qglobal.h>
30
31
35template <
typename T> Q_ALWAYS_INLINE
void qToUnaligned(
const T src,
void *dest)
39 const size_t size =
sizeof(T);
48template <
typename T> Q_ALWAYS_INLINE T qFromUnaligned(
const void *src)
51 const size_t size =
sizeof(T);
66 | ((source & Q_UINT64_C(0x00000000000000ff)) << 56)
67 | ((source & Q_UINT64_C(0x000000000000ff00)) << 40)
68 | ((source & Q_UINT64_C(0x0000000000ff0000)) << 24)
69 | ((source & Q_UINT64_C(0x00000000ff000000)) << 8)
70 | ((source & Q_UINT64_C(0x000000ff00000000)) >> 8)
71 | ((source & Q_UINT64_C(0x0000ff0000000000)) >> 24)
72 | ((source & Q_UINT64_C(0x00ff000000000000)) >> 40)
73 | ((source & Q_UINT64_C(0xff00000000000000)) >> 56);
79 | ((source & 0x000000ff) << 24)
80 | ((source & 0x0000ff00) << 8)
81 | ((source & 0x00ff0000) >> 8)
82 | ((source & 0xff000000) >> 24);
88 | ((source & 0x00ff) << 8)
89 | ((source & 0xff00) >> 8) );
98
99
100
101
102
103template <
typename T,
typename = std::enable_if_t<std::is_integral_v<T>>>
104inline constexpr T qbswap(T source)
106 return T(qbswap_helper(
typename QIntegerForSizeof<T>::Unsigned(source)));
109#ifdef QT_SUPPORTS_INT128
111inline constexpr quint128 qbswap(quint128 source)
113 quint128 result = {};
114 result = qbswap_helper(quint64(source));
116 result |= qbswap_helper(quint64(source >> 64));
120inline constexpr qint128 qbswap(qint128 source)
122 return qint128(qbswap(quint128(source)));
127template<
typename Float>
131 auto temp = qFromUnaligned<
typename QIntegerForSizeof<Float>::Unsigned>(&source);
133 return qFromUnaligned<Float>(&temp);
138 return qbswapFloatHelper(source);
143 return qbswapFloatHelper(source);
148 return qbswapFloatHelper(source);
152
153
154
155
156
157template <
typename T>
inline void qbswap(
const T src,
void *dest)
159 qToUnaligned<T>(qbswap(src), dest);
162template <
int Size>
void *
qbswap(
const void *source, qsizetype count,
void *dest)
noexcept;
163template<>
inline void *
qbswap<1>(
const void *source, qsizetype count,
void *dest)
noexcept
165 return source != dest ? memcpy(dest, source, size_t(count)) : dest;
167template<>
Q_CORE_EXPORT void *
qbswap<2>(
const void *source, qsizetype count,
void *dest)
noexcept;
168template<>
Q_CORE_EXPORT void *
qbswap<4>(
const void *source, qsizetype count,
void *dest)
noexcept;
169template<>
Q_CORE_EXPORT void *
qbswap<8>(
const void *source, qsizetype count,
void *dest)
noexcept;
171#if Q_BYTE_ORDER == Q_BIG_ENDIAN
178{
return qbswap(source); }
180{
return qbswap(source); }
182{ qToUnaligned<T>(src, dest); }
184{ qbswap<T>(src, dest); }
186template <
typename T>
inline void qToBigEndian(
const void *source, qsizetype count,
void *dest)
187{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
188template <
typename T>
inline void qToLittleEndian(
const void *source, qsizetype count,
void *dest)
189{ qbswap<
sizeof(T)>(source, count, dest); }
190template <
typename T>
inline void qFromBigEndian(
const void *source, qsizetype count,
void *dest)
191{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
192template <
typename T>
inline void qFromLittleEndian(
const void *source, qsizetype count,
void *dest)
193{ qbswap<
sizeof(T)>(source, count, dest); }
196template <
typename T>
inline constexpr T qToBigEndian(T source)
197{
return qbswap(source); }
198template <
typename T>
inline constexpr T qFromBigEndian(T source)
199{
return qbswap(source); }
200template <
typename T>
inline constexpr T qToLittleEndian(T source)
202template <
typename T>
inline constexpr T qFromLittleEndian(T source)
204template <
typename T>
inline void qToBigEndian(T src,
void *dest)
205{ qbswap<T>(src, dest); }
206template <
typename T>
inline void qToLittleEndian(T src,
void *dest)
207{ qToUnaligned<T>(src, dest); }
209template <
typename T>
inline void qToBigEndian(
const void *source, qsizetype count,
void *dest)
210{ qbswap<
sizeof(T)>(source, count, dest); }
211template <
typename T>
inline void qToLittleEndian(
const void *source, qsizetype count,
void *dest)
212{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
213template <
typename T>
inline void qFromBigEndian(
const void *source, qsizetype count,
void *dest)
214{ qbswap<
sizeof(T)>(source, count, dest); }
215template <
typename T>
inline void qFromLittleEndian(
const void *source, qsizetype count,
void *dest)
216{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
221
222
223
224
227 return qFromLittleEndian(qFromUnaligned<T>(src));
230template <>
inline quint8 qFromLittleEndian<quint8>(
const void *src)
231{
return static_cast<
const quint8 *>(src)[0]; }
232template <>
inline qint8 qFromLittleEndian<qint8>(
const void *src)
233{
return static_cast<
const qint8 *>(src)[0]; }
236
237
238
241 return qFromBigEndian(qFromUnaligned<T>(src));
244template <>
inline quint8 qFromBigEndian<quint8>(
const void *src)
245{
return static_cast<
const quint8 *>(src)[0]; }
246template <>
inline qint8 qFromBigEndian<qint8>(
const void *src)
247{
return static_cast<
const qint8 *>(src)[0]; }
252 typedef typename S::StorageType T;
265 {
return (*
this = S::fromSpecial(val) + i); }
267 {
return (*
this = S::fromSpecial(val) - i); }
269 {
return (*
this = S::fromSpecial(val) * i); }
271 {
return (*
this = S::fromSpecial(val) >> i); }
273 {
return (*
this = S::fromSpecial(val) << i); }
275 {
return (*
this = S::fromSpecial(val) / i); }
277 {
return (*
this = S::fromSpecial(val) % i); }
279 {
return (*
this = S::fromSpecial(val) | i); }
281 {
return (*
this = S::fromSpecial(val) & i); }
283 {
return (*
this = S::fromSpecial(val) ^ i); }
285 {
return (*
this = S::fromSpecial(val) + 1); }
287 {
return (*
this = S::fromSpecial(val) - 1); }
311 static constexpr T
toSpecial(T source) {
return qToLittleEndian(source); }
312 static constexpr T
fromSpecial(T source) {
return qFromLittleEndian(source); }
319 static constexpr T
toSpecial(T source) {
return qToBigEndian(source); }
320 static constexpr T
fromSpecial(T source) {
return qFromBigEndian(source); }
327 explicit constexpr QLEInteger(T i);
328 QLEInteger &operator =(T i);
330 bool operator ==(QLEInteger i)
const;
331 bool operator !=(QLEInteger i)
const;
332 QLEInteger &operator +=(T i);
333 QLEInteger &operator -=(T i);
334 QLEInteger &operator *=(T i);
335 QLEInteger &operator >>=(T i);
336 QLEInteger &operator <<=(T i);
337 QLEInteger &operator /=(T i);
338 QLEInteger &operator %=(T i);
339 QLEInteger &operator |=(T i);
340 QLEInteger &operator &=(T i);
341 QLEInteger &operator ^=(T i);
342 QLEInteger &operator ++();
343 QLEInteger &operator --();
344 QLEInteger operator ++(
int);
345 QLEInteger operator --(
int);
347 static constexpr QLEInteger max();
348 static constexpr QLEInteger min();
354 explicit constexpr QBEInteger(T i);
355 QBEInteger &operator =(T i);
357 bool operator ==(QBEInteger i)
const;
358 bool operator !=(QBEInteger i)
const;
359 QBEInteger &operator +=(T i);
360 QBEInteger &operator -=(T i);
361 QBEInteger &operator *=(T i);
362 QBEInteger &operator >>=(T i);
363 QBEInteger &operator <<=(T i);
364 QBEInteger &operator /=(T i);
365 QBEInteger &operator %=(T i);
366 QBEInteger &operator |=(T i);
367 QBEInteger &operator &=(T i);
368 QBEInteger &operator ^=(T i);
369 QBEInteger &operator ++();
370 QBEInteger &operator --();
371 QBEInteger operator ++(
int);
372 QBEInteger operator --(
int);
374 static constexpr QBEInteger max();
375 static constexpr QBEInteger min();
390class QTypeInfo<QBEInteger<T> >
391 :
public QTypeInfoMerger<QBEInteger<T>, T> {};
static constexpr T fromSpecial(T source)
static constexpr T toSpecial(T source)
static constexpr T fromSpecial(T source)
static constexpr T toSpecial(T source)
bool operator!=(QSpecialInteger< S > i) const
static constexpr QSpecialInteger max()
QSpecialInteger & operator>>=(T i)
constexpr QSpecialInteger(T i)
QSpecialInteger & operator++()
bool operator==(QSpecialInteger< S > i) const
QSpecialInteger & operator=(T i)
QSpecialInteger operator++(int)
QSpecialInteger & operator&=(T i)
QSpecialInteger & operator+=(T i)
QSpecialInteger & operator|=(T i)
QSpecialInteger & operator--()
QSpecialInteger & operator*=(T i)
QSpecialInteger operator--(int)
QSpecialInteger & operator^=(T i)
QSpecialInteger()=default
QSpecialInteger & operator%=(T i)
QSpecialInteger & operator/=(T i)
static constexpr QSpecialInteger min()
QSpecialInteger & operator-=(T i)
Combined button and popup list for selecting options.
static Q_ALWAYS_INLINE void * bswapLoop(const uchar *src, size_t n, uchar *dst) noexcept
void * qbswap< 2 >(const void *source, qsizetype n, void *dest) noexcept
QBEInteger< quint64 > quint64_be
float qbswap(float source)
void qToLittleEndian(T src, void *dest)
void qToLittleEndian(const void *source, qsizetype count, void *dest)
QLEInteger< qint64 > qint64_le
void qToBigEndian(T src, void *dest)
QBEInteger< qint32 > qint32_be
QLEInteger< qint32 > qint32_le
void qFromLittleEndian(const void *source, qsizetype count, void *dest)
void qbswap(const T src, void *dest)
QSpecialInteger< QLittleEndianStorageType< T > > QLEInteger
Constructs a QLEInteger with the given value.
QBEInteger< qint64 > qint64_be
QLEInteger< quint32 > quint32_le
QLEInteger< quint64 > quint64_le
QSpecialInteger< QBigEndianStorageType< T > > QBEInteger
Constructs a QBEInteger with the given value.
constexpr quint64 qbswap_helper(quint64 source)
qfloat16 qbswap(qfloat16 source)
void * qbswap(const void *source, qsizetype count, void *dest) noexcept
QBEInteger< quint32 > quint32_be
constexpr T qFromLittleEndian(T source)
constexpr T qToBigEndian(T source)
QLEInteger< quint16 > quint16_le
T qFromLittleEndian(const void *src)
QLEInteger< qint16 > qint16_le
constexpr T qFromBigEndian(T source)
QBEInteger< qint16 > qint16_be
void qToBigEndian(const void *source, qsizetype count, void *dest)
QBEInteger< quint16 > quint16_be
T qFromBigEndian(const void *src)
double qbswap(double source)
void qFromBigEndian(const void *source, qsizetype count, void *dest)
constexpr T qToLittleEndian(T source)
Float qbswapFloatHelper(Float source)