diff options
Diffstat (limited to 'src/corelib/global')
-rw-r--r-- | src/corelib/global/qendian.h | 57 | ||||
-rw-r--r-- | src/corelib/global/qendian.qdoc | 20 |
2 files changed, 43 insertions, 34 deletions
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h index 34bb015a2f..c2028289a7 100644 --- a/src/corelib/global/qendian.h +++ b/src/corelib/global/qendian.h @@ -58,25 +58,26 @@ QT_BEGIN_NAMESPACE /* * ENDIAN FUNCTIONS */ -inline void qbswap_helper(const uchar *src, uchar *dest, int size) +inline void qbswap_helper(const void *src, void *dest, int size) { - for (int i = 0; i < size ; ++i) dest[i] = src[size - 1 - i]; + for (int i = 0; i < size ; ++i) + static_cast<uchar *>(dest)[i] = static_cast<const uchar *>(src)[size - 1 - i]; } /* - * qbswap(const T src, const uchar *dest); + * qbswap(const T src, const void *dest); * Changes the byte order of \a src from big endian to little endian or vice versa * and stores the result in \a dest. * There is no alignment requirements for \a dest. */ -template <typename T> inline void qbswap(const T src, uchar *dest) +template <typename T> inline void qbswap(const T src, void *dest) { - qbswap_helper(reinterpret_cast<const uchar *>(&src), dest, sizeof(T)); + qbswap_helper(&src, dest, sizeof(T)); } // Used to implement a type-safe and alignment-safe copy operation // If you want to avoid the memcpy, you must write specializations for these functions -template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, uchar *dest) +template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, void *dest) { // Using sizeof(T) inside memcpy function produces internal compiler error with // MSVC2008/ARM in tst_endian -> use extra indirection to resolve size of T. @@ -89,7 +90,7 @@ template <typename T> Q_ALWAYS_INLINE void qToUnaligned(const T src, uchar *dest (dest, &src, size); } -template <typename T> Q_ALWAYS_INLINE T qFromUnaligned(const uchar *src) +template <typename T> Q_ALWAYS_INLINE T qFromUnaligned(const void *src) { T dest; const size_t size = sizeof(T); @@ -122,11 +123,11 @@ template <> inline quint32 qbswap<quint32>(quint32 source) return __builtin_bswap32(source); } -template <> inline void qbswap<quint64>(quint64 source, uchar *dest) +template <> inline void qbswap<quint64>(quint64 source, void *dest) { qToUnaligned<quint64>(__builtin_bswap64(source), dest); } -template <> inline void qbswap<quint32>(quint32 source, uchar *dest) +template <> inline void qbswap<quint32>(quint32 source, void *dest) { qToUnaligned<quint32>(__builtin_bswap32(source), dest); } @@ -158,7 +159,7 @@ template <> inline quint16 qbswap<quint16>(quint16 source) { return __builtin_bswap16(source); } -template <> inline void qbswap<quint16>(quint16 source, uchar *dest) +template <> inline void qbswap<quint16>(quint16 source, void *dest) { qToUnaligned<quint16>(__builtin_bswap16(source), dest); } @@ -187,17 +188,17 @@ template <> inline qint16 qbswap<qint16>(qint16 source) return qbswap<quint16>(quint16(source)); } -template <> inline void qbswap<qint64>(qint64 source, uchar *dest) +template <> inline void qbswap<qint64>(qint64 source, void *dest) { qbswap<quint64>(quint64(source), dest); } -template <> inline void qbswap<qint32>(qint32 source, uchar *dest) +template <> inline void qbswap<qint32>(qint32 source, void *dest) { qbswap<quint32>(quint32(source), dest); } -template <> inline void qbswap<qint16>(qint16 source, uchar *dest) +template <> inline void qbswap<qint16>(qint16 source, void *dest) { qbswap<quint16>(quint16(source), dest); } @@ -212,9 +213,9 @@ template <typename T> inline T qToLittleEndian(T source) { return qbswap<T>(source); } template <typename T> inline T qFromLittleEndian(T source) { return qbswap<T>(source); } -template <typename T> inline void qToBigEndian(T src, uchar *dest) +template <typename T> inline void qToBigEndian(T src, void *dest) { qToUnaligned<T>(src, dest); } -template <typename T> inline void qToLittleEndian(T src, uchar *dest) +template <typename T> inline void qToLittleEndian(T src, void *dest) { qbswap<T>(src, dest); } #else // Q_LITTLE_ENDIAN @@ -226,9 +227,9 @@ template <typename T> inline T qToLittleEndian(T source) { return source; } template <typename T> inline T qFromLittleEndian(T source) { return source; } -template <typename T> inline void qToBigEndian(T src, uchar *dest) +template <typename T> inline void qToBigEndian(T src, void *dest) { qbswap<T>(src, dest); } -template <typename T> inline void qToLittleEndian(T src, uchar *dest) +template <typename T> inline void qToLittleEndian(T src, void *dest) { qToUnaligned<T>(src, dest); } #endif // Q_BYTE_ORDER == Q_BIG_ENDIAN @@ -243,34 +244,34 @@ template <> inline qint8 qbswap<qint8>(qint8 source) return source; } -/* T qFromLittleEndian(const uchar *src) +/* T qFromLittleEndian(const void *src) * This function will read a little-endian encoded value from \a src * and return the value in host-endian encoding. * There is no requirement that \a src must be aligned. */ -template <typename T> inline T qFromLittleEndian(const uchar *src) +template <typename T> inline T qFromLittleEndian(const void *src) { return qFromLittleEndian(qFromUnaligned<T>(src)); } -template <> inline quint8 qFromLittleEndian<quint8>(const uchar *src) -{ return static_cast<quint8>(src[0]); } -template <> inline qint8 qFromLittleEndian<qint8>(const uchar *src) -{ return static_cast<qint8>(src[0]); } +template <> inline quint8 qFromLittleEndian<quint8>(const void *src) +{ return static_cast<const quint8 *>(src)[0]; } +template <> inline qint8 qFromLittleEndian<qint8>(const void *src) +{ return static_cast<const qint8 *>(src)[0]; } /* This function will read a big-endian (also known as network order) encoded value from \a src * and return the value in host-endian encoding. * There is no requirement that \a src must be aligned. */ -template <class T> inline T qFromBigEndian(const uchar *src) +template <class T> inline T qFromBigEndian(const void *src) { return qFromBigEndian(qFromUnaligned<T>(src)); } -template <> inline quint8 qFromBigEndian<quint8>(const uchar *src) -{ return static_cast<quint8>(src[0]); } -template <> inline qint8 qFromBigEndian<qint8>(const uchar *src) -{ return static_cast<qint8>(src[0]); } +template <> inline quint8 qFromBigEndian<quint8>(const void *src) +{ return static_cast<const quint8 *>(src)[0]; } +template <> inline qint8 qFromBigEndian<qint8>(const void *src) +{ return static_cast<const qint8 *>(src)[0]; } QT_END_NAMESPACE diff --git a/src/corelib/global/qendian.qdoc b/src/corelib/global/qendian.qdoc index 3b22dcec87..9ce9dbdb0e 100644 --- a/src/corelib/global/qendian.qdoc +++ b/src/corelib/global/qendian.qdoc @@ -35,7 +35,7 @@ /*! \internal - \fn T qFromUnaligned(const uchar *ptr) + \fn T qFromUnaligned(const void *ptr) \since 5.5 Loads a \c{T} from address \a ptr, which may be misaligned. @@ -46,7 +46,7 @@ /*! \internal - \fn void qToUnaligned(T t, uchar *ptr) + \fn void qToUnaligned(T t, void *ptr) \since 4.5 Stores \a t to address \a ptr, which may be misaligned. @@ -57,7 +57,7 @@ /*! - \fn T qFromBigEndian(const uchar *src) + \fn T qFromBigEndian(const void *src) \since 4.3 \relates <QtEndian> @@ -69,6 +69,8 @@ \note Template type \c{T} can either be a qint16, qint32 or qint64. Other types of integers, e.g., qlong, are not applicable. + \note Since Qt 5.7, the type of the \a src parameter is a void pointer. + There are no data alignment constraints for \a src. \sa qFromLittleEndian() @@ -88,7 +90,7 @@ unmodified. */ /*! - \fn T qFromLittleEndian(const uchar *src) + \fn T qFromLittleEndian(const void *src) \since 4.3 \relates <QtEndian> @@ -100,6 +102,8 @@ \note Template type \c{T} can either be a qint16, qint32 or qint64. Other types of integers, e.g., qlong, are not applicable. + \note Since Qt 5.7, the type of the \a src parameter is a void pointer. + There are no data alignment constraints for \a src. \sa qFromBigEndian() @@ -119,7 +123,7 @@ unmodified. */ /*! - \fn void qToBigEndian(T src, uchar *dest) + \fn void qToBigEndian(T src, void *dest) \since 4.3 \relates <QtEndian> @@ -130,6 +134,8 @@ There are no data alignment constraints for \a dest. + \note Since Qt 5.7, the type of the \a dest parameter is a void pointer. + \sa qFromBigEndian() \sa qFromLittleEndian() \sa qToLittleEndian() @@ -147,7 +153,7 @@ unmodified. */ /*! - \fn void qToLittleEndian(T src, uchar *dest) + \fn void qToLittleEndian(T src, void *dest) \since 4.3 \relates <QtEndian> @@ -158,6 +164,8 @@ There are no data alignment constraints for \a dest. + \note Since Qt 5.7, the type of the \a dest parameter is a void pointer. + \sa qFromBigEndian() \sa qFromLittleEndian() \sa qToBigEndian() |