/* is parametrized: no */ #ifndef GUF_UTILS_H #define GUF_UTILS_H #include "guf_common.h" #include "guf_assert.h" static inline void guf_platform_assert_endianness(void) { const unsigned i = 1; const char *bytes = (const char*)&i; const bool is_big_endian = bytes[0] != 1; #if defined(GUF_PLATFORM_LITTLE_ENDIAN) GUF_ASSERT_RELEASE(!is_big_endian) #elif defined(GUF_PLATFORM_BIG_ENDIAN) GUF_ASSERT_RELEASE(is_big_endian) #endif } static inline void guf_platform_assert_native_word_bits(void) { const int bits = sizeof(void*) * CHAR_BIT; GUF_ASSERT_RELEASE(GUF_PLATFORM_BITS == bits); } #ifdef NDEBUG #define GUF_DBG_STR "release" #else #define GUF_DBG_STR "debug" #endif #if defined(GUF_STDC_AT_LEAST_C23) #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C23 (or above) " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C23 (or above) " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #elif defined(GUF_STDC_AT_LEAST_C17) #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C17 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C17 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #elif defined(GUF_STDC_AT_LEAST_C11) #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C11 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C11 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #elif defined(GUF_STDC_AT_LEAST_C99) #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C99 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C99 " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #elif defined(GUF_STDCPP_AT_LEAST_CPP11) #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C++11 (or above) " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C++11 (or above) " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #else #ifdef GUF_PLATFORM_LITTLE_ENDIAN #define GUF_PLATFORM_STRING "C?? " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "little-endian " GUF_DBG_STR #else #define GUF_PLATFORM_STRING "C?? " GUF_STRINGIFY(GUF_PLATFORM_BITS) "-bit " "big-endian " GUF_DBG_STR #endif #endif #endif