commit 4fbb7f100122a0b189d4218bde0e0d0a9cf4945e
parent f27fc6a13a8a7ed2270de6509f021f9e96db599f
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Mon, 22 May 2023 20:33:22 -0700
Add XXX_BITS macros for the width of each integer typedef
Diffstat:
| M | inc/def.h | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ |
1 file changed, 59 insertions(+), 6 deletions(-)
diff --git a/inc/def.h b/inc/def.h
@@ -59,89 +59,142 @@
#define SHORT_MAX SHRT_MAX
#define USHORT_MAX USHRT_MAX
-typedef signed char schar;
-typedef unsigned char uchar;
-typedef unsigned short ushort;
-typedef unsigned int uint;
-typedef unsigned long ulong;
-typedef long long llong;
+#define CHAR_BITS 8
+
+#define SCHAR_BITS 8
+typedef signed char schar;
+
+#define UCHAR_BITS 8
+typedef unsigned char uchar;
+
+#define SHORT_BITS (8 * sizeof(short))
+
+#define USHORT_BITS (8 * sizeof(ushort))
+typedef unsigned short ushort;
+
+#define INT_BITS (8 * sizeof(int))
+
+#define UINT_BITS (8 * sizeof(uint))
+typedef unsigned int uint;
+
+#define LONG_BITS (8 * sizeof(long))
+
+#define ULONG_BITS (8 * sizeof(ulong))
+typedef unsigned long ulong;
+
+#define LLONG_BITS (8 * sizeof(llong))
+typedef long long llong;
+
+#define ULLONG_BITS (8 * sizeof(ullong))
typedef unsigned long long ullong;
+#define I8_BITS 8
#define I8_MIN INT8_MIN
#define I8_MAX INT8_MAX
#define I8_C INT8_C
typedef int8_t i8;
+#define I16_BITS 16
#define I16_MIN INT16_MIN
#define I16_MAX INT16_MAX
#define I16_C INT16_C
typedef int16_t i16;
+#define I32_BITS 32
#define I32_MIN INT32_MIN
#define I32_MAX INT32_MAX
#define I32_C INT32_C
typedef int32_t i32;
+#define I64_BITS 64
#define I64_MIN INT64_MIN
#define I64_MAX INT64_MAX
#define I64_C INT64_C
typedef int64_t i64;
#ifdef R_HAVE_128
+#define I128_BITS 128
#define I128_MIN ((i128)-1 - I128_MAX)
#define I128_MAX ((i128)(U128_MAX >> 1))
typedef __int128 i128;
#endif
+#define IMAX_BITS (8 * sizeof(imax))
#define IMAX_MIN INTMAX_MIN
#define IMAX_MAX INTMAX_MAX
#define IMAX_C INTMAX_C
typedef intmax_t imax;
+#define IPTR_BITS (8 * sizeof(iptr))
#define IPTR_MIN INTPTR_MIN
#define IPTR_MAX INTPTR_MAX
typedef intptr_t iptr;
/* Avoid dependence on POSIX sys/types.h for ssize_t */
#if SIZE_MAX == UINT32_MAX
+#define ISIZE_BITS 32
+#define ISIZE_MIN INT32_MIN
+#define ISIZE_MAX INT32_MAX
+#define ISIZE_C INT32_C
typedef int32_t isize;
#elif SIZE_MAX == UINT64_MAX
+#define ISIZE_BITS 64
+#define ISIZE_MIN INT64_MIN
+#define ISIZE_MAX INT64_MAX
+#define ISIZE_C INT64_C
typedef int64_t isize;
#else /* This won't happen except on weird archs */
#error "Could not find suitable type for isize"
#endif
+#define U8_BITS 8
#define U8_MAX UINT8_MAX
#define U8_C UINT8_C
typedef uint8_t u8;
+#define U16_BITS 16
#define U16_MAX UINT16_MAX
#define U16_C UINT16_C
typedef uint16_t u16;
+#define U32_BITS 32
#define U32_MAX UINT32_MAX
#define U32_C UINT32_C
typedef uint32_t u32;
+#define U64_BITS 64
#define U64_MAX UINT64_MAX
#define U64_C UINT64_C
typedef uint64_t u64;
#ifdef R_HAVE_128
+#define U128_BITS 128
#define U128_MAX (((u128)U64_MAX << 64) | U64_MAX)
typedef unsigned __int128 u128;
#endif
+#define UMAX_BITS (8 * sizeof(umax))
#define UMAX_MAX UINTMAX_MAX
#define UMAX_C UINTMAX_C
typedef uintmax_t umax;
+#define UPTR_BITS (8 * sizeof(uptr))
#define UPTR_MAX UINTPTR_MAX
typedef uintptr_t uptr;
+#if SIZE_MAX == UINT32_MAX
+#define USIZE_BITS 32
+#define USIZE_C UINT32_C
+#elif SIZE_MAX == UINT64_MAX
+#define USIZE_BITS 64
+#define USIZE_C UINT64_C
+#else /* This won't happen except on weird archs */
+#error "Could not determine width of usize"
+#endif
#define USIZE_MAX SIZE_MAX
typedef size_t usize;
+#define RUNE_BITS 32
#define RUNE_BAD RUNE_C(0xFFFD)
#define RUNE_MAX RUNE_C(0x10FFFF)
#define RUNE_C UINT32_C