src/corelib/io/qdatastream.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
--- a/src/corelib/io/qdatastream.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/corelib/io/qdatastream.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -48,6 +48,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
+#include "qendian.h"
 
 QT_BEGIN_NAMESPACE
 
@@ -90,8 +91,7 @@
     format that varies depending on the item's type. Supported Qt
     types include QBrush, QColor, QDateTime, QFont, QPixmap, QString,
     QVariant and many others. For the complete list of all Qt types
-    supporting data streaming see the \l{Format of the QDataStream
-    operators}.
+    supporting data streaming see \l{Serializing Qt Data Types}.
 
     For integers it is best to always cast to a Qt integer type for
     writing, and to read back into the same Qt integer type. This
@@ -576,6 +576,7 @@
     \value Qt_4_4 Version 10 (Qt 4.4)
     \value Qt_4_5 Version 11 (Qt 4.5)
     \value Qt_4_6 Version 12 (Qt 4.6)
+    \value Qt_4_7 Same as Qt_4_6.
 
     \sa setVersion(), version()
 */
@@ -678,24 +679,12 @@
 {
     i = 0;
     CHECK_STREAM_PRECOND(*this)
-    if (noswap) {
-        if (dev->read((char *)&i, 2) != 2) {
-            i = 0;
-            setStatus(ReadPastEnd);
-        }
+    if (dev->read((char *)&i, 2) != 2) {
+        i = 0;
+        setStatus(ReadPastEnd);
     } else {
-        union {
-            qint16 val1;
-            char val2[2];
-        } x;
-        char *p = x.val2;
-        char b[2];
-        if (dev->read(b, 2) == 2) {
-            *p++ = b[1];
-            *p = b[0];
-            i = x.val1;
-        } else {
-            setStatus(ReadPastEnd);
+        if (!noswap) {
+            i = qbswap(i);
         }
     }
     return *this;
@@ -721,26 +710,12 @@
 {
     i = 0;
     CHECK_STREAM_PRECOND(*this)
-    if (noswap) {
-        if (dev->read((char *)&i, 4) != 4) {
-            i = 0;
-            setStatus(ReadPastEnd);
-        }
-    } else {                                        // swap bytes
-        union {
-            qint32 val1;
-            char val2[4];
-        } x;
-        char *p = x.val2;
-        char b[4];
-        if (dev->read(b, 4) == 4) {
-            *p++ = b[3];
-            *p++ = b[2];
-            *p++ = b[1];
-            *p   = b[0];
-            i = x.val1;
-        } else {
-            setStatus(ReadPastEnd);
+    if (dev->read((char *)&i, 4) != 4) {
+        i = 0;
+        setStatus(ReadPastEnd);
+    } else {
+        if (!noswap) {
+            i = qbswap(i);
         }
     }
     return *this;
@@ -769,31 +744,14 @@
         quint32 i1, i2;
         *this >> i2 >> i1;
         i = ((quint64)i1 << 32) + i2;
-    } else if (noswap) {                        // no conversion needed
+    } else {
         if (dev->read((char *)&i, 8) != 8) {
             i = qint64(0);
             setStatus(ReadPastEnd);
-        }
-    } else {                                        // swap bytes
-        union {
-            qint64 val1;
-            char val2[8];
-        } x;
-
-        char *p = x.val2;
-        char b[8];
-        if (dev->read(b, 8) == 8) {
-            *p++ = b[7];
-            *p++ = b[6];
-            *p++ = b[5];
-            *p++ = b[4];
-            *p++ = b[3];
-            *p++ = b[2];
-            *p++ = b[1];
-            *p   = b[0];
-            i = x.val1;
         } else {
-            setStatus(ReadPastEnd);
+            if (!noswap) {
+                i = qbswap(i);
+            }
         }
     }
     return *this;
@@ -833,27 +791,17 @@
 
     f = 0.0f;
     CHECK_STREAM_PRECOND(*this)
-    if (noswap) {
-        if (dev->read((char *)&f, 4) != 4) {
-            f = 0.0f;
-            setStatus(ReadPastEnd);
-        }
-    } else {                                        // swap bytes
-        union {
-            float val1;
-            char val2[4];
-        } x;
-
-        char *p = x.val2;
-        char b[4];
-        if (dev->read(b, 4) == 4) {
-            *p++ = b[3];
-            *p++ = b[2];
-            *p++ = b[1];
-            *p = b[0];
+    if (dev->read((char *)&f, 4) != 4) {
+        f = 0.0f;
+        setStatus(ReadPastEnd);
+    } else {
+        if (!noswap) {
+            union {
+                float val1;
+                quint32 val2;
+            } x;
+            x.val2 = qbswap(*reinterpret_cast<quint32 *>(&f));
             f = x.val1;
-        } else {
-            setStatus(ReadPastEnd);
         }
     }
     return *this;
@@ -886,30 +834,17 @@
     f = 0.0;
     CHECK_STREAM_PRECOND(*this)
 #ifndef Q_DOUBLE_FORMAT
-    if (noswap) {
-        if (dev->read((char *)&f, 8) != 8) {
-            f = 0.0;
-            setStatus(ReadPastEnd);
-        }
-    } else {                                        // swap bytes
-        union {
-            double val1;
-            char val2[8];
-        } x;
-        char *p = x.val2;
-        char b[8];
-        if (dev->read(b, 8) == 8) {
-            *p++ = b[7];
-            *p++ = b[6];
-            *p++ = b[5];
-            *p++ = b[4];
-            *p++ = b[3];
-            *p++ = b[2];
-            *p++ = b[1];
-            *p   = b[0];
+    if (dev->read((char *)&f, 8) != 8) {
+        f = 0.0;
+        setStatus(ReadPastEnd);
+    } else {
+        if (!noswap) {
+            union {
+                double val1;
+                quint64 val2;
+            } x;
+            x.val2 = qbswap(*reinterpret_cast<quint64 *>(&f));
             f = x.val1;
-        } else {
-            setStatus(ReadPastEnd);
         }
     }
 #else
@@ -1081,20 +1016,10 @@
 QDataStream &QDataStream::operator<<(qint16 i)
 {
     CHECK_STREAM_PRECOND(*this)
-    if (noswap) {
-        dev->write((char *)&i, sizeof(qint16));
-    } else {                                        // swap bytes
-        union {
-            qint16 val1;
-            char val2[2];
-        } x;
-        x.val1 = i;
-        char *p = x.val2;
-        char b[2];
-        b[1] = *p++;
-        b[0] = *p;
-        dev->write(b, 2);
+    if (!noswap) {
+        i = qbswap(i);
     }
+    dev->write((char *)&i, sizeof(qint16));
     return *this;
 }
 
@@ -1108,22 +1033,10 @@
 QDataStream &QDataStream::operator<<(qint32 i)
 {
     CHECK_STREAM_PRECOND(*this)
-    if (noswap) {
-        dev->write((char *)&i, sizeof(qint32));
-    } else {                                        // swap bytes
-        union {
-            qint32 val1;
-            char val2[4];
-        } x;
-        x.val1 = i;
-        char *p = x.val2;
-        char b[4];
-        b[3] = *p++;
-        b[2] = *p++;
-        b[1] = *p++;
-        b[0] = *p;
-        dev->write(b, 4);
+    if (!noswap) {
+        i = qbswap(i);
     }
+    dev->write((char *)&i, sizeof(qint32));
     return *this;
 }
 
@@ -1149,25 +1062,11 @@
         quint32 i1 = i & 0xffffffff;
         quint32 i2 = i >> 32;
         *this << i2 << i1;
-    } else if (noswap) {                        // no conversion needed
+    } else {
+        if (!noswap) {
+            i = qbswap(i);
+        }
         dev->write((char *)&i, sizeof(qint64));
-    } else {                                        // swap bytes
-        union {
-            qint64 val1;
-            char val2[8];
-        } x;
-        x.val1 = i;
-        char *p = x.val2;
-        char b[8];
-        b[7] = *p++;
-        b[6] = *p++;
-        b[5] = *p++;
-        b[4] = *p++;
-        b[3] = *p++;
-        b[2] = *p++;
-        b[1] = *p++;
-        b[0] = *p;
-        dev->write(b, 8);
     }
     return *this;
 }
@@ -1211,22 +1110,16 @@
 
     CHECK_STREAM_PRECOND(*this)
     float g = f;                                // fixes float-on-stack problem
-    if (noswap) {                                // no conversion needed
-        dev->write((char *)&g, sizeof(float));
-    } else {                                // swap bytes
+    if (!noswap) {
         union {
             float val1;
-            char val2[4];
+            quint32 val2;
         } x;
-        x.val1 = f;
-        char *p = x.val2;
-        char b[4];
-        b[3] = *p++;
-        b[2] = *p++;
-        b[1] = *p++;
-        b[0] = *p;
-        dev->write(b, 4);
+        x.val1 = g;
+        x.val2 = qbswap(x.val2);
+        g = x.val1;
     }
+    dev->write((char *)&g, sizeof(float));
     return *this;
 }
 
@@ -1255,20 +1148,11 @@
     } else {
         union {
             double val1;
-            char val2[8];
+            quint64 val2;
         } x;
         x.val1 = f;
-        char *p = x.val2;
-        char b[8];
-        b[7] = *p++;
-        b[6] = *p++;
-        b[5] = *p++;
-        b[4] = *p++;
-        b[3] = *p++;
-        b[2] = *p++;
-        b[1] = *p++;
-        b[0] = *p;
-        dev->write(b, 8);
+        x.val2 = qbswap(x.val2);
+        dev->write((char *)&x.val2, sizeof(double));
     }
 #else
     union {