master uint/libule / include / uletypes.h
  1/* Copyright 2026 uint (and contributors)
  2
  3Permission to use, copy, modify, and distribute this software for any
  4purpose with or without fee is hereby granted, provided that the above
  5copyright notice and this permission notice appear in all copies.
  6
  7THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 10ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 11WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 12ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 13OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
 14
 15/* Guidance:
 16   If you want to use the shorthand type names (eg u8 instead of ule_u8), you
 17   must define ULE_SHORT_TYPE_NAMES before including this header. 
 18
 19   If you want to define your own pointer types, you must define ULE_UPTR_TYPE
 20   and ULE_IPTR_TYPE before including this header. */
 21
 22#ifndef ULETYPES_H
 23#define ULETYPES_H
 24
 25#include <limits.h>
 26#include <stddef.h>
 27
 28#if CHAR_BIT != 8
 29	#error "libule: 8-bit bytes are required"
 30#endif
 31
 32/* 8-bit */
 33typedef unsigned char ule_u8;
 34typedef signed char   ule_i8;
 35
 36/* 16-bit */
 37#if USHRT_MAX == 0xFFFFU
 38	typedef unsigned short ule_u16;
 39	typedef signed short   ule_i16;
 40#elif UINT_MAX == 0xFFFFU
 41	typedef unsigned int ule_u16;
 42	typedef signed int   ule_i16;
 43#else
 44	#error "libule: no 16-bit integer type"
 45#endif
 46
 47/* 32-bit */
 48#if UINT_MAX == 0xFFFFFFFFUL
 49	typedef unsigned int ule_u32;
 50	typedef signed int   ule_i32;
 51#elif ULONG_MAX == 0xFFFFFFFFUL
 52	typedef unsigned long ule_u32;
 53	typedef signed long   ule_i32;
 54#elif USHRT_MAX == 0xFFFFFFFFUL
 55	typedef unsigned short ule_u32;
 56	typedef signed short   ule_i32;
 57#else
 58	#error "libule: no 32-bit integer type"
 59#endif
 60
 61/* 64-bit */
 62#if ULONG_MAX > 0xFFFFFFFFUL
 63	typedef unsigned long ule_u64;
 64	typedef signed long   ule_i64;
 65	#define ULE_HAS_64 1
 66
 67#elif defined(_MSC_VER)
 68	typedef unsigned __int64 ule_u64;
 69	typedef signed __int64   ule_i64;
 70	#define ULE_HAS_64 1
 71
 72#elif defined(__GNUC__) || defined(__clang__)
 73	__extension__ typedef unsigned long long ule_u64;
 74	__extension__ typedef signed long long   ule_i64;
 75	#define ULE_HAS_64 1
 76#endif
 77
 78/* Pointer Length Sizes */
 79#if defined(ULE_UPTR_TYPE) != defined(ULE_IPTR_TYPE)
 80	#error "libule: define both ULE_UPTR_TYPE and ULE_IPTR_TYPE"
 81#endif
 82
 83#if defined(ULE_UPTR_TYPE)
 84	typedef ULE_UPTR_TYPE ule_uptr;
 85	typedef ULE_IPTR_TYPE ule_iptr;
 86
 87#elif defined(_WIN64)
 88	typedef unsigned __int64 ule_uptr;
 89	typedef signed __int64   ule_iptr;
 90
 91#elif defined(_WIN32)
 92	typedef unsigned long ule_uptr;
 93	typedef signed long   ule_iptr;
 94
 95#elif defined(__LP64__) || defined(_LP64)
 96	typedef unsigned long ule_uptr;
 97	typedef signed long   ule_iptr;
 98
 99#elif defined(__ILP32__) || defined(_ILP32)
100	typedef unsigned int ule_uptr;
101	typedef signed int   ule_iptr;
102
103#else
104	#error "libule: define ULE_UPTR_TYPE and ULE_IPTR_TYPE for this target"
105#endif
106
107/* Limits */
108#define ULE_U8_MAX ((ule_u8)0xFFU)
109#define ULE_I8_MAX ((ule_i8)0x7F)
110#define ULE_I8_MIN ((ule_i8)(-0x7F - 1))
111
112#define ULE_U16_MAX ((ule_u16)0xFFFFU)
113#define ULE_I16_MAX ((ule_i16)0x7FFF)
114#define ULE_I16_MIN ((ule_i16)(-0x7FFF - 1))
115
116#define ULE_U32_MAX ((ule_u32)0xFFFFFFFFUL)
117#define ULE_I32_MAX ((ule_i32)0x7FFFFFFFL)
118#define ULE_I32_MIN ((ule_i32)(-0x7FFFFFFFL - 1L))
119
120#ifdef ULE_HAS_64
121	#define ULE_U64_MAX ((ule_u64)-1)
122	#define ULE_I64_MAX ((ule_i64)(ULE_U64_MAX >> 1))
123	#define ULE_I64_MIN ((ule_i64)(-ULE_I64_MAX - 1))
124#endif /* ULE_HAS_64 */
125
126/* Size types */
127typedef size_t    ule_usize;
128typedef ptrdiff_t ule_isize;
129
130/* (Optional) Short names */
131#ifdef ULE_SHORT_TYPE_NAMES
132	typedef ule_u8  u8;
133	typedef ule_i8  i8;
134	typedef ule_u16 u16;
135	typedef ule_i16 i16;
136	typedef ule_u32 u32;
137	typedef ule_i32 i32;
138
139	#if defined(ULE_HAS_64)
140		typedef ule_u64 u64;
141		typedef ule_i64 i64;
142	#endif
143
144	typedef ule_uptr  uptr;
145	typedef ule_iptr  iptr;
146	typedef ule_usize usize;
147	typedef ule_isize isize;
148#endif /* ULE_SHORT_TYPE_NAMES */
149
150#endif /* ULETYPES_H */
151