From b238a9292b99ddf2a87150fd32b30135e01f6a9b Mon Sep 17 00:00:00 2001 From: MichalSt Date: Tue, 2 Apr 2024 18:45:44 +0100 Subject: [PATCH] Move the use of Serializable concept into static asserts for better error messages. --- source/Utility/Serialise.hpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/source/Utility/Serialise.hpp b/source/Utility/Serialise.hpp index 04e4d049..8e2ae30e 100644 --- a/source/Utility/Serialise.hpp +++ b/source/Utility/Serialise.hpp @@ -10,24 +10,32 @@ // Helpers for serialising and deserialising objects. namespace Utility { - // Serializable concept for types that can be written to and read from in binary. + // Serializable concept for keeping track of types that can be serialised into binary. template - concept Serializable = + concept Serializable_Type = std::is_arithmetic_v || std::is_same_v || std::is_same_v || std::is_same_v; // Write p_value to p_out in binary. - template + template void write_binary(std::ofstream& p_out, const T& p_value) { + static_assert(sizeof(T) > 0, "Cannot write a type of size 0"); + static_assert(!std::is_pointer_v && !std::is_reference_v, "Cannot write a reference or pointer"); + static_assert(Serializable_Type, "Type is not in serializable list"); + p_out.write(reinterpret_cast(&p_value), sizeof(T)); } // Read into p_value from p_in in binary. - template + template void read_binary(std::ifstream& p_in, T& p_value) { + static_assert(sizeof(T) > 0, "Cannot read into a type of size 0"); + static_assert(!std::is_pointer_v && !std::is_reference_v, "Cannot read into a reference or pointer"); + static_assert(Serializable_Type, "Type is not in serializable list"); + p_in.read(reinterpret_cast(&p_value), sizeof(T)); } } // namespace Utility \ No newline at end of file