9#pragma qt_class(QtEndian)
12#include <QtCore/qfloat16.h>
13#include <QtCore/qglobal.h>
29
30
34template <
typename T> Q_ALWAYS_INLINE
void qToUnaligned(
const T src,
void *dest)
38 const size_t size =
sizeof(T);
47template <
typename T> Q_ALWAYS_INLINE T qFromUnaligned(
const void *src)
50 const size_t size =
sizeof(T);
65 | ((source & Q_UINT64_C(0x00000000000000ff)) << 56)
66 | ((source & Q_UINT64_C(0x000000000000ff00)) << 40)
67 | ((source & Q_UINT64_C(0x0000000000ff0000)) << 24)
68 | ((source & Q_UINT64_C(0x00000000ff000000)) << 8)
69 | ((source & Q_UINT64_C(0x000000ff00000000)) >> 8)
70 | ((source & Q_UINT64_C(0x0000ff0000000000)) >> 24)
71 | ((source & Q_UINT64_C(0x00ff000000000000)) >> 40)
72 | ((source & Q_UINT64_C(0xff00000000000000)) >> 56);
78 | ((source & 0x000000ff) << 24)
79 | ((source & 0x0000ff00) << 8)
80 | ((source & 0x00ff0000) >> 8)
81 | ((source & 0xff000000) >> 24);
87 | ((source & 0x00ff) << 8)
88 | ((source & 0xff00) >> 8) );
97
98
99
100
101
102template <
typename T,
typename = std::enable_if_t<std::is_integral_v<T>>>
103inline constexpr T qbswap(T source)
105 return T(qbswap_helper(
typename QIntegerForSizeof<T>::Unsigned(source)));
108#ifdef QT_SUPPORTS_INT128
110inline constexpr quint128 qbswap(quint128 source)
112 quint128 result = {};
113 result = qbswap_helper(quint64(source));
115 result |= qbswap_helper(quint64(source >> 64));
119inline constexpr qint128 qbswap(qint128 source)
121 return qint128(qbswap(quint128(source)));
126template<
typename Float>
130 auto temp = qFromUnaligned<
typename QIntegerForSizeof<Float>::Unsigned>(&source);
132 return qFromUnaligned<Float>(&temp);
137 return qbswapFloatHelper(source);
142 return qbswapFloatHelper(source);
147 return qbswapFloatHelper(source);
151
152
153
154
155
156template <
typename T>
inline void qbswap(
const T src,
void *dest)
158 qToUnaligned<T>(qbswap(src), dest);
161template <
int Size>
void *
qbswap(
const void *source, qsizetype count,
void *dest)
noexcept;
162template<>
inline void *
qbswap<1>(
const void *source, qsizetype count,
void *dest)
noexcept
164 return source != dest ? memcpy(dest, source, size_t(count)) : dest;
166template<>
Q_CORE_EXPORT void *
qbswap<2>(
const void *source, qsizetype count,
void *dest)
noexcept;
167template<>
Q_CORE_EXPORT void *
qbswap<4>(
const void *source, qsizetype count,
void *dest)
noexcept;
168template<>
Q_CORE_EXPORT void *
qbswap<8>(
const void *source, qsizetype count,
void *dest)
noexcept;
170#if Q_BYTE_ORDER == Q_BIG_ENDIAN
177{
return qbswap(source); }
179{
return qbswap(source); }
181{ qToUnaligned<T>(src, dest); }
183{ qbswap<T>(src, dest); }
185template <
typename T>
inline void qToBigEndian(
const void *source, qsizetype count,
void *dest)
186{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
187template <
typename T>
inline void qToLittleEndian(
const void *source, qsizetype count,
void *dest)
188{ qbswap<
sizeof(T)>(source, count, dest); }
189template <
typename T>
inline void qFromBigEndian(
const void *source, qsizetype count,
void *dest)
190{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
191template <
typename T>
inline void qFromLittleEndian(
const void *source, qsizetype count,
void *dest)
192{ qbswap<
sizeof(T)>(source, count, dest); }
195template <
typename T>
inline constexpr T qToBigEndian(T source)
196{
return qbswap(source); }
197template <
typename T>
inline constexpr T qFromBigEndian(T source)
198{
return qbswap(source); }
199template <
typename T>
inline constexpr T qToLittleEndian(T source)
201template <
typename T>
inline constexpr T qFromLittleEndian(T source)
203template <
typename T>
inline void qToBigEndian(T src,
void *dest)
204{ qbswap<T>(src, dest); }
205template <
typename T>
inline void qToLittleEndian(T src,
void *dest)
206{ qToUnaligned<T>(src, dest); }
208template <
typename T>
inline void qToBigEndian(
const void *source, qsizetype count,
void *dest)
209{ qbswap<
sizeof(T)>(source, count, dest); }
210template <
typename T>
inline void qToLittleEndian(
const void *source, qsizetype count,
void *dest)
211{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
212template <
typename T>
inline void qFromBigEndian(
const void *source, qsizetype count,
void *dest)
213{ qbswap<
sizeof(T)>(source, count, dest); }
214template <
typename T>
inline void qFromLittleEndian(
const void *source, qsizetype count,
void *dest)
215{
if (source != dest) memcpy(dest, source, count *
sizeof(T)); }
220
221
222
223
226 return qFromLittleEndian(qFromUnaligned<T>(src));
229template <>
inline quint8 qFromLittleEndian<quint8>(
const void *src)
230{
return static_cast<
const quint8 *>(src)[0]; }
231template <>
inline qint8 qFromLittleEndian<qint8>(
const void *src)
232{
return static_cast<
const qint8 *>(src)[0]; }
235
236
237
240 return qFromBigEndian(qFromUnaligned<T>(src));
243template <>
inline quint8 qFromBigEndian<quint8>(
const void *src)
244{
return static_cast<
const quint8 *>(src)[0]; }
245template <>
inline qint8 qFromBigEndian<qint8>(
const void *src)
246{
return static_cast<
const qint8 *>(src)[0]; }
251 typedef typename S::StorageType T;
264 {
return (*
this = S::fromSpecial(val) + i); }
266 {
return (*
this = S::fromSpecial(val) - i); }
268 {
return (*
this = S::fromSpecial(val) * i); }
270 {
return (*
this = S::fromSpecial(val) >> i); }
272 {
return (*
this = S::fromSpecial(val) << i); }
274 {
return (*
this = S::fromSpecial(val) / i); }
276 {
return (*
this = S::fromSpecial(val) % i); }
278 {
return (*
this = S::fromSpecial(val) | i); }
280 {
return (*
this = S::fromSpecial(val) & i); }
282 {
return (*
this = S::fromSpecial(val) ^ i); }
284 {
return (*
this = S::fromSpecial(val) + 1); }
286 {
return (*
this = S::fromSpecial(val) - 1); }
310 static constexpr T
toSpecial(T source) {
return qToLittleEndian(source); }
311 static constexpr T
fromSpecial(T source) {
return qFromLittleEndian(source); }
318 static constexpr T
toSpecial(T source) {
return qToBigEndian(source); }
319 static constexpr T
fromSpecial(T source) {
return qFromBigEndian(source); }
326 explicit constexpr QLEInteger(T i);
327 QLEInteger &operator =(T i);
329 bool operator ==(QLEInteger i)
const;
330 bool operator !=(QLEInteger i)
const;
331 QLEInteger &operator +=(T i);
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 ++();
342 QLEInteger &operator --();
343 QLEInteger operator ++(
int);
344 QLEInteger operator --(
int);
346 static constexpr QLEInteger max();
347 static constexpr QLEInteger min();
353 explicit constexpr QBEInteger(T i);
354 QBEInteger &operator =(T i);
356 bool operator ==(QBEInteger i)
const;
357 bool operator !=(QBEInteger i)
const;
358 QBEInteger &operator +=(T i);
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 ++();
369 QBEInteger &operator --();
370 QBEInteger operator ++(
int);
371 QBEInteger operator --(
int);
373 static constexpr QBEInteger max();
374 static constexpr QBEInteger min();
389class QTypeInfo<QBEInteger<T> >
390 :
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)
QBEInteger< qint64 > qint64_be
QLEInteger< quint32 > quint32_le
QLEInteger< quint64 > quint64_le
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)