libguf/src/guf_utils.h

73 lines
2.6 KiB
C

/*
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