#ifndef _YGGDRASIL_LIMITS_H
#define _YGGDRASIL_LIMITS_H 1

#define CHAR_BIT    8

// char
#if !defined(SCHAR_MAX)
#define SCHAR_MAX 127
#endif
#if !defined(SCHAR_MIN)
#define SCHAR_MIN (-128)
#endif
#if !defined(UCHAR_MAX)
#define UCHAR_MAX 255
#endif
#if !defined(CHAR_MAX)
    #if defined(__CHAR_UNSIGNED__)
    #define CHAR_MAX UCHAR_MAX
    #else
    #define CHAR_MAX SCHAR_MAX
    #endif
#endif
#if !defined(CHAR_MIN)
    #if defined(__CHAR_UNSIGNED__)
    #define CHAR_MIN 0
    #else
    #define CHAR_MIN SCHAR_MIN
    #endif
#endif

// short
#if !defined(SHRT_MAX)
#define SHRT_MAX (__SHRT_MAX__)
#endif
#if !defined(SHRT_MIN)
#define SHRT_MIN (-__SHRT_MAX__ - 1)
#endif
#if !defined(USHRT_MAX)
#define USHRT_MAX (__USHRT_MAX__)
#endif
#if !defined(SSHRT_MAX)
#define SSHRT_MAX SHRT_MAX
#endif
#if !defined(SSHRT_MIN)
#define SSHRT_MIN SHRT_MIN
#endif

// int
#if !defined(INT_MAX)
#define INT_MAX (__INT_MAX__)
#endif
#if !defined(INT_MIN)
#define INT_MIN (-__INT_MAX__ - 1)
#endif
#if !defined(UINT_MAX)
#define UINT_MAX (__UINT_MAX__)
#endif
#if !defined(SINT_MAX)
#define SINT_MAX INT_MAX
#endif
#if !defined(SINT_MIN)
#define SINT_MIN INT_MIN
#endif

// long
#if !defined(LONG_MAX)
#define LONG_MAX (__LONG_MAX__)
#endif
#if !defined(LONG_MIN)
#define LONG_MIN (-__LONG_MAX__ - 1)
#endif
#if !defined(ULONG_MAX)
#define ULONG_MAX (__ULONG_MAX__)
#endif
#if !defined(SLONG_MAX)
#define SLONG_MAX LONG_MAX
#endif
#if !defined(SLONG_MIN)
#define SLONG_MIN LONG_MIN
#endif

// long long
#if !defined(LLONG_MAX)
#define LLONG_MAX (__LONG_LONG_MAX__)
#endif
#if !defined(LLONG_MIN)
#define LLONG_MIN (-__LONG_LONG_MAX__ - 1)
#endif
#if !defined(ULLONG_MAX)
#define ULLONG_MAX (__ULONG_LONG_MAX__)
#endif

#endif
