From 1d51c9a541361693e5d7113f8bef47c63a246436 Mon Sep 17 00:00:00 2001 From: ljfa-ag Date: Tue, 28 Jul 2015 19:56:08 +0200 Subject: Implement endian stream i/o for float --- src/endian_str.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/endian_str.cpp') diff --git a/src/endian_str.cpp b/src/endian_str.cpp index f03ebf2743..15aaa36a3f 100644 --- a/src/endian_str.cpp +++ b/src/endian_str.cpp @@ -19,13 +19,32 @@ */ #include "endian_str.h" #include +#include #include static_assert(CHAR_BIT == 8, "Assuming that a byte has 8 bits"); +static_assert(sizeof(float) == 4, "Assuming that a float is 4 byte long"); +static_assert(sizeof(double) == 8, "Assuming that a double is 8 byte long"); namespace endian { +namespace //anonymous +{ + void pun_int_to_float(float& f, uint32_t i) + { + //Yes we need to do it this way to avoid undefined behavior + memcpy(&f, &i, 4); + } + + uint32_t pun_float_to_int(float f) + { + uint32_t ret; + memcpy(&ret, &f, 4); + return ret; + } +} + void read_little(std::istream& is, uint8_t& x) { is.get(reinterpret_cast(x)); @@ -68,6 +87,13 @@ void read_little(std::istream& is, int16_t& x) { read_little(is, reinterpret_cas void read_little(std::istream& is, int32_t& x) { read_little(is, reinterpret_cast(x)); } void read_little(std::istream& is, int64_t& x) { read_little(is, reinterpret_cast(x)); } +void read_little(std::istream& is, float& x) +{ + uint32_t tmp; + read_little(is, tmp); + pun_int_to_float(x, tmp); +} + //------------------------------------------------------------------------------ void read_big(std::istream& is, uint8_t& x) @@ -112,6 +138,13 @@ void read_big(std::istream& is, int16_t& x) { read_big(is, reinterpret_cast(x)); } void read_big(std::istream& is, int64_t& x) { read_big(is, reinterpret_cast(x)); } +void read_big(std::istream& is, float& x) +{ + uint32_t tmp; + read_big(is, tmp); + pun_int_to_float(x, tmp); +} + //------------------------------------------------------------------------------ void write_little(std::ostream& os, uint8_t x) @@ -156,6 +189,11 @@ void write_little(std::ostream& os, int16_t x) { write_little(os, static_cast(x)); } void write_little(std::ostream& os, int64_t x) { write_little(os, static_cast(x)); } +void write_little(std::ostream& os, float x) +{ + write_little(os, pun_float_to_int(x)); +} + //------------------------------------------------------------------------------ void write_big(std::ostream& os, uint8_t x) @@ -200,4 +238,9 @@ void write_big(std::ostream& os, int16_t x) { write_big(os, static_cast(x)); } void write_big(std::ostream& os, int64_t x) { write_big(os, static_cast(x)); } +void write_big(std::ostream& os, float x) +{ + write_big(os, pun_float_to_int(x)); +} + } -- cgit 0.0.5-2-1-g0f52