From 4cced4f35789dc8ee8416bb717eeb1fbdf4f1dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Tue, 19 Aug 2014 20:22:18 -0700 Subject: [PATCH] Added check for POD type in templatized read/write function. --- include/bx/macros.h | 6 +++++- include/bx/readerwriter.h | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/bx/macros.h b/include/bx/macros.h index 5e35c14..9d38248 100644 --- a/include/bx/macros.h +++ b/include/bx/macros.h @@ -56,6 +56,7 @@ # else # define BX_THREAD __thread # endif // BX_COMPILER_CLANG +# define BX_ATTRIBUTE(_x) __attribute__( (_x) ) #elif BX_COMPILER_MSVC # define BX_ALIGN_STRUCT(_align, _struct) __declspec(align(_align) ) _struct # define BX_ALLOW_UNUSED @@ -67,12 +68,13 @@ # define BX_OVERRIDE override # define BX_PRINTF_ARGS(_format, _args) # define BX_THREAD __declspec(thread) +# define BX_ATTRIBUTE(_x) #else # error "Unknown BX_COMPILER_?" #endif // #define BX_STATIC_ASSERT(_condition, ...) static_assert(_condition, "" __VA_ARGS__) -#define BX_STATIC_ASSERT(_condition, ...) typedef char BX_CONCATENATE(BX_STATIC_ASSERT_, __LINE__)[1][(_condition)] +#define BX_STATIC_ASSERT(_condition, ...) typedef char BX_CONCATENATE(BX_STATIC_ASSERT_, __LINE__)[1][(_condition)] BX_ATTRIBUTE(unused) #define BX_CACHE_LINE_ALIGN_MARKER() BX_ALIGN_STRUCT(BX_CACHE_LINE_SIZE, struct) BX_CONCATENATE(bx_cache_line_marker_compiler_stfu, __COUNTER__) {} #define BX_CACHE_LINE_ALIGN(_def) BX_CACHE_LINE_ALIGN_MARKER(); _def; BX_CACHE_LINE_ALIGN_MARKER() @@ -104,6 +106,8 @@ # define BX_UNUSED(...) BX_MACRO_DISPATCHER(BX_UNUSED_, __VA_ARGS__)(__VA_ARGS__) #endif // BX_COMPILER_MSVC +#define BX_TYPE_IS_POD(_type) (!__is_class(_type) || __is_pod(_type) ) + #define BX_CLASS_NO_DEFAULT_CTOR(_class) \ private: _class() diff --git a/include/bx/readerwriter.h b/include/bx/readerwriter.h index 6caa236..1877d11 100644 --- a/include/bx/readerwriter.h +++ b/include/bx/readerwriter.h @@ -72,6 +72,7 @@ namespace bx template inline int32_t read(ReaderI* _reader, Ty& _value) { + BX_STATIC_ASSERT(BX_TYPE_IS_POD(Ty) ); return _reader->read(&_value, sizeof(Ty) ); } @@ -80,6 +81,7 @@ namespace bx template inline int32_t readHE(ReaderI* _reader, Ty& _value, bool _fromLittleEndian) { + BX_STATIC_ASSERT(BX_TYPE_IS_POD(Ty) ); Ty value; int32_t result = _reader->read(&value, sizeof(Ty) ); _value = toHostEndian(value, _fromLittleEndian); @@ -96,6 +98,7 @@ namespace bx template inline int32_t write(WriterI* _writer, const Ty& _value) { + BX_STATIC_ASSERT(BX_TYPE_IS_POD(Ty) ); return _writer->write(&_value, sizeof(Ty) ); } @@ -103,6 +106,7 @@ namespace bx template inline int32_t writeLE(WriterI* _writer, const Ty& _value) { + BX_STATIC_ASSERT(BX_TYPE_IS_POD(Ty) ); Ty value = toLittleEndian(_value); int32_t result = _writer->write(&value, sizeof(Ty) ); return result; @@ -112,6 +116,7 @@ namespace bx template inline int32_t writeBE(WriterI* _writer, const Ty& _value) { + BX_STATIC_ASSERT(BX_TYPE_IS_POD(Ty) ); Ty value = toBigEndian(_value); int32_t result = _writer->write(&value, sizeof(Ty) ); return result;