]> git.tdb.fi Git - libs/datafile.git/commitdiff
Perform bit conversion using standard-sanctioned memcpy method
authorMikko Rasa <tdb@tdb.fi>
Sun, 29 Aug 2021 10:33:54 +0000 (13:33 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 29 Aug 2021 10:33:54 +0000 (13:33 +0300)
The compiler should be able to optimize it away.

source/binfloat.h

index 2c74441ad333888f1d47f98b1c3e449b40f98f6f..e50b3204ce974e992ca3cb52f5089456d8b16b39 100644 (file)
@@ -29,9 +29,6 @@ struct BinFloat
        template<typename T>
        struct MatchingInt;
 
-       template<typename T>
-       union Conversion;
-
        bool sign;
        bool infinity;
        int exponent;
@@ -54,27 +51,21 @@ struct BinFloat::MatchingInt<float> { typedef std::uint32_t Type; };
 template<>
 struct BinFloat::MatchingInt<double> { typedef std::uint64_t Type; };
 
-template<typename T>
-union BinFloat::Conversion
-{
-       T f;
-       typename MatchingInt<T>::Type i;
-};
-
 template<typename T>
 inline BinFloat BinFloat::explode_iec559(T v)
 {
-       Conversion<T> c;
-       c.f = v;
-       return explode(c.i, sizeof(T)*CHAR_BIT);
+       typename MatchingInt<T>::Type i;
+       memcpy(&v, &i, sizeof(T));
+       return explode(i, sizeof(T)*CHAR_BIT);
 }
 
 template<typename T>
 inline T BinFloat::compose_iec559()
 {
-       Conversion<T> c;
-       c.i = compose(sizeof(T)*CHAR_BIT);
-       return c.f;
+       typename MatchingInt<T>::Type i = compose(sizeof(T)*CHAR_BIT);
+       T v;
+       memcpy(&v, &i, sizeof(T));
+       return v;
 }
 
 } // namespace DataFile