From d3c63370684ea7b659bb805cf0d00eb6cded654b Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 6 May 2020 21:23:59 +0200 Subject: [PATCH] Fixed issies with multiple definitions --- include/io/read.h | 24 ++---------------------- include/io/write.h | 28 ++-------------------------- src/read.cpp | 27 +++++++++++++++++++++++++++ src/write.cpp | 33 ++++++++++++++++++++++++++++++++- 4 files changed, 63 insertions(+), 49 deletions(-) create mode 100644 src/read.cpp diff --git a/include/io/read.h b/include/io/read.h index a83a71a..7a0447e 100644 --- a/include/io/read.h +++ b/include/io/read.h @@ -36,30 +36,10 @@ namespace io { } template <> - float read(std::istream& is) { - union { - uint32_t a; - float b; - } u; - - u.a = read_bytes(is, sizeof(uint32_t)); - - return u.b; - } + float read(std::istream& is); template<> - size_t read(std::istream& is) { - size_t value = 0; - uint8_t length = io::read(is); - if (length & 0b10000000) { - value = read_bytes(is, length & 0b01111111); - } else { - value = length; - } - return value; - } - - + size_t read(std::istream& is); template requires std::is_convertible_v T read(std::istream& is, size_t length) { diff --git a/include/io/write.h b/include/io/write.h index 3ed511b..2d83b19 100644 --- a/include/io/write.h +++ b/include/io/write.h @@ -32,35 +32,11 @@ namespace io { } template <> - void write(std::ostream& os, float value) { - union { - uint32_t a; - float b; - } u; - - u.b = value; - write_bytes(os, u.a, sizeof(uint32_t)); - } + void write(std::ostream& os, float value); // Special implementation for size_t (also uint64_t, so maybe this is not that smart) template <> - void write(std::ostream& os, size_t value) { - // Check if we need more then one byte - if (value > 0b01111111) { - // Calculate how many bytes we need to store the number - uint8_t length = 0; - auto x = value; - while (x != 0) { - x >>= 8; - length++; - } - - write(os, length | 0b10000000); - write_bytes(os, value, length); - } else { - write(os, value); - } - } + void write(std::ostream& os, size_t value); template requires std::is_convertible_v void write(std::ostream& os, T value, bool store_length = true) { diff --git a/src/read.cpp b/src/read.cpp new file mode 100644 index 0000000..1b22f4d --- /dev/null +++ b/src/read.cpp @@ -0,0 +1,27 @@ +#include "io/read.h" + +namespace io { + template<> + float read(std::istream& is) { + union { + uint32_t a; + float b; + } u; + + u.a = read_bytes(is, sizeof(uint32_t)); + + return u.b; + } + + template<> + size_t read(std::istream& is) { + size_t value = 0; + uint8_t length = io::read(is); + if (length & 0b10000000) { + value = read_bytes(is, length & 0b01111111); + } else { + value = length; + } + return value; + } +} diff --git a/src/write.cpp b/src/write.cpp index 4b37887..555fc8b 100644 --- a/src/write.cpp +++ b/src/write.cpp @@ -1,3 +1,34 @@ #include "io/write.h" -// We do not implement anything without templates +namespace io { + template<> + void write(std::ostream& os, float value) { + union { + uint32_t a; + float b; + } u; + + u.b = value; + write_bytes(os, u.a, sizeof(uint32_t)); + } + + // Special implementation for size_t (also uint64_t, so maybe this is not that smart) + template<> + void write(std::ostream& os, size_t value) { + // Check if we need more then one byte + if (value > 0b01111111) { + // Calculate how many bytes we need to store the number + uint8_t length = 0; + auto x = value; + while (x != 0) { + x >>= 8; + length++; + } + + write(os, length | 0b10000000); + write_bytes(os, value, length); + } else { + write(os, value); + } + } +}