summaryrefslogtreecommitdiffstats
path: root/src/corelib/global
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/global')
-rw-r--r--src/corelib/global/qendian.h57
-rw-r--r--src/corelib/global/qendian.qdoc20
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()