25 #ifndef SER4CPP_DOUBLE_FLOAT_H 26 #define SER4CPP_DOUBLE_FLOAT_H 28 #include "ser4cpp/container/SequenceTypes.h" 29 #include "ser4cpp/serialization/DoubleFloat.h" 30 #include "ser4cpp/serialization/FloatByteOrder.h" 31 #include "ser4cpp/util/Uncopyable.h" 43 static_assert(
sizeof(
double) == 8,
"Unexpected length of double float");
45 static bool read_from(
rseq_t& input,
double& out)
47 if (input.length() < size)
return false;
54 static bool write_to(
wseq_t& dest,
double value)
56 if (dest.length() < size)
return false;
63 typedef double type_t;
64 static constexpr std::size_t size =
sizeof(double);
65 static constexpr
double max_value = std::numeric_limits<double>::max();
66 static constexpr
double min_value = -std::numeric_limits<double>::max();
69 union DoubleFloatUnion
75 static double read(
const uint8_t* data)
77 if (FloatByteOrder::order() == FloatByteOrder::Value::normal)
79 DoubleFloatUnion x = {{ data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7] }};
84 DoubleFloatUnion x = {{ data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] }};
89 static void write(uint8_t* dest,
double value)
91 if (FloatByteOrder::order() == FloatByteOrder::Value::normal)
93 memcpy(dest, &value, size);
97 auto data = reinterpret_cast<uint8_t*>(&value);
98 uint8_t bytes[8] = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] };
99 memcpy(dest, bytes, size);
ser4cpp header-only library namespace