Zycore 1.5.1.0
Loading...
Searching...
No Matches
Types.h
Go to the documentation of this file.
1/***************************************************************************************************
2
3 Zyan Core Library (Zyan-C)
4
5 Original Author : Florian Bernd, Joel Hoener
6
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24
25***************************************************************************************************/
26
32#ifndef ZYCORE_TYPES_H
33#define ZYCORE_TYPES_H
34
35#include <Zycore/Defines.h>
36
37/* ============================================================================================== */
38/* Integer types */
39/* ============================================================================================== */
40
41#if defined(ZYAN_NO_LIBC) || \
42 (defined(ZYAN_MSVC) && defined(ZYAN_KERNEL)) // The WDK LibC lacks stdint.h.
43 // No LibC mode, use compiler built-in types / macros.
44# if defined(ZYAN_MSVC) || defined(ZYAN_ICC)
45 typedef unsigned __int8 ZyanU8;
46 typedef unsigned __int16 ZyanU16;
47 typedef unsigned __int32 ZyanU32;
48 typedef unsigned __int64 ZyanU64;
49 typedef signed __int8 ZyanI8;
50 typedef signed __int16 ZyanI16;
51 typedef signed __int32 ZyanI32;
52 typedef signed __int64 ZyanI64;
53# if _WIN64
54 typedef ZyanU64 ZyanUSize;
55 typedef ZyanI64 ZyanISize;
56 typedef ZyanU64 ZyanUPointer;
57 typedef ZyanI64 ZyanIPointer;
58# else
59 typedef ZyanU32 ZyanUSize;
60 typedef ZyanI32 ZyanISize;
61 typedef ZyanU32 ZyanUPointer;
62 typedef ZyanI32 ZyanIPointer;
63# endif
64# elif defined(ZYAN_GNUC)
65# ifdef __UINT8_TYPE__
66 typedef __UINT8_TYPE__ ZyanU8;
67# else
68 typedef unsigned char ZyanU8;
69# endif
70# ifdef __UINT16_TYPE__
71 typedef __UINT16_TYPE__ ZyanU16;
72# else
73 typedef unsigned short int ZyanU16;
74# endif
75# ifdef __UINT32_TYPE__
76 typedef __UINT32_TYPE__ ZyanU32;
77# else
78 typedef unsigned int ZyanU32;
79# endif
80# ifdef __UINT64_TYPE__
81 typedef __UINT64_TYPE__ ZyanU64;
82# else
83# if defined(__x86_64__) && !defined(__ILP32__)
84 typedef unsigned long int ZyanU64;
85# else
86 typedef unsigned long long int ZyanU64;
87# endif
88# endif
89# ifdef __INT8_TYPE__
90 typedef __INT8_TYPE__ ZyanI8;
91# else
92 typedef signed char ZyanI8;
93# endif
94# ifdef __INT16_TYPE__
95 typedef __INT16_TYPE__ ZyanI16;
96# else
97 typedef signed short int ZyanI16;
98# endif
99# ifdef __INT32_TYPE__
100 typedef __INT32_TYPE__ ZyanI32;
101# else
102 typedef signed int ZyanI32;
103# endif
104# ifdef __INT64_TYPE__
105 typedef __INT64_TYPE__ ZyanI64;
106# else
107# if defined(__x86_64__) && !defined( __ILP32__)
108 typedef signed long int ZyanI64;
109# else
110 typedef signed long long int ZyanI64;
111# endif
112# endif
113# ifdef __SIZE_TYPE__
114 typedef __SIZE_TYPE__ ZyanUSize;
115# else
116 typedef long unsigned int ZyanUSize;
117# endif
118# ifdef __PTRDIFF_TYPE__
119 typedef __PTRDIFF_TYPE__ ZyanISize;
120# else
121 typedef long int ZyanISize;
122# endif
123# ifdef __UINTPTR_TYPE__
124 typedef __UINTPTR_TYPE__ ZyanUPointer;
125# else
126# if defined(__x86_64__) && !defined( __ILP32__)
127 typedef unsigned long int ZyanUPointer;
128# else
129 typedef unsigned int ZyanUPointer;
130# endif
131# endif
132# ifdef __INTPTR_TYPE__
133 typedef __INTPTR_TYPE__ ZyanIPointer;
134# else
135# if defined(__x86_64__) && !defined( __ILP32__)
136 typedef long int ZyanIPointer;
137# else
138 typedef int ZyanIPointer;
139# endif
140# endif
141# else
142# error "Unsupported compiler for no-libc mode."
143# endif
144
145# if defined(ZYAN_MSVC)
146# define ZYAN_INT8_MIN (-127i8 - 1)
147# define ZYAN_INT16_MIN (-32767i16 - 1)
148# define ZYAN_INT32_MIN (-2147483647i32 - 1)
149# define ZYAN_INT64_MIN (-9223372036854775807i64 - 1)
150# define ZYAN_INT8_MAX 127i8
151# define ZYAN_INT16_MAX 32767i16
152# define ZYAN_INT32_MAX 2147483647i32
153# define ZYAN_INT64_MAX 9223372036854775807i64
154# define ZYAN_UINT8_MAX 0xffui8
155# define ZYAN_UINT16_MAX 0xffffui16
156# define ZYAN_UINT32_MAX 0xffffffffui32
157# define ZYAN_UINT64_MAX 0xffffffffffffffffui64
158# else
159# ifdef __INT8_MAX__
160# define ZYAN_INT8_MAX __INT8_MAX__
161# else
162# define ZYAN_INT8_MAX (127)
163# endif
164# define ZYAN_INT8_MIN (-ZYAN_INT8_MAX - 1)
165# ifdef __INT16_MAX__
166# define ZYAN_INT16_MAX __INT16_MAX__
167# else
168# define ZYAN_INT16_MAX (32767)
169# endif
170# define ZYAN_INT16_MIN (-ZYAN_INT16_MAX - 1)
171# ifdef __INT32_MAX__
172# define ZYAN_INT32_MAX __INT32_MAX__
173# else
174# define ZYAN_INT32_MAX (2147483647)
175# endif
176# define ZYAN_INT32_MIN (-ZYAN_INT32_MAX - 1)
177# ifdef __INT64_MAX__
178# define ZYAN_INT64_MAX __INT64_MAX__
179# else
180# if defined(__x86_64__) && !defined( __ILP32__)
181# define ZYAN_INT64_MAX (9223372036854775807L)
182# else
183# define ZYAN_INT64_MAX (9223372036854775807LL)
184# endif
185# endif
186# define ZYAN_INT64_MIN (-ZYAN_INT64_MAX - 1)
187# ifdef __UINT8_MAX__
188# define ZYAN_UINT8_MAX __UINT8_MAX__
189# else
190# define ZYAN_UINT8_MAX (255)
191# endif
192# ifdef __UINT16_MAX__
193# define ZYAN_UINT16_MAX __UINT16_MAX__
194# else
195# define ZYAN_UINT16_MAX (65535)
196# endif
197# ifdef __UINT32_MAX__
198# define ZYAN_UINT32_MAX __UINT32_MAX__
199# else
200# define ZYAN_UINT32_MAX (4294967295U)
201# endif
202# ifdef __UINT64_MAX__
203# define ZYAN_UINT64_MAX __UINT64_MAX__
204# else
205# if defined(__x86_64__) && !defined( __ILP32__)
206# define ZYAN_UINT64_MAX (18446744073709551615UL)
207# else
208# define ZYAN_UINT64_MAX (18446744073709551615ULL)
209# endif
210# endif
211# endif
212#else
213 // If is LibC present, we use stdint types.
214# include <stdint.h>
215# include <stddef.h>
216 typedef uint8_t ZyanU8;
217 typedef uint16_t ZyanU16;
218 typedef uint32_t ZyanU32;
219 typedef uint64_t ZyanU64;
220 typedef int8_t ZyanI8;
221 typedef int16_t ZyanI16;
222 typedef int32_t ZyanI32;
223 typedef int64_t ZyanI64;
224 typedef size_t ZyanUSize;
225 typedef ptrdiff_t ZyanISize;
226 typedef uintptr_t ZyanUPointer;
227 typedef intptr_t ZyanIPointer;
228
229# define ZYAN_INT8_MIN INT8_MIN
230# define ZYAN_INT16_MIN INT16_MIN
231# define ZYAN_INT32_MIN INT32_MIN
232# define ZYAN_INT64_MIN INT64_MIN
233# define ZYAN_INT8_MAX INT8_MAX
234# define ZYAN_INT16_MAX INT16_MAX
235# define ZYAN_INT32_MAX INT32_MAX
236# define ZYAN_INT64_MAX INT64_MAX
237# define ZYAN_UINT8_MAX UINT8_MAX
238# define ZYAN_UINT16_MAX UINT16_MAX
239# define ZYAN_UINT32_MAX UINT32_MAX
240# define ZYAN_UINT64_MAX UINT64_MAX
241#endif
242
243// Verify size assumptions.
244ZYAN_STATIC_ASSERT(sizeof(ZyanU8 ) == 1 );
245ZYAN_STATIC_ASSERT(sizeof(ZyanU16 ) == 2 );
246ZYAN_STATIC_ASSERT(sizeof(ZyanU32 ) == 4 );
247ZYAN_STATIC_ASSERT(sizeof(ZyanU64 ) == 8 );
248ZYAN_STATIC_ASSERT(sizeof(ZyanI8 ) == 1 );
249ZYAN_STATIC_ASSERT(sizeof(ZyanI16 ) == 2 );
250ZYAN_STATIC_ASSERT(sizeof(ZyanI32 ) == 4 );
251ZYAN_STATIC_ASSERT(sizeof(ZyanI64 ) == 8 );
252ZYAN_STATIC_ASSERT(sizeof(ZyanUSize ) == sizeof(void*)); // TODO: This one is incorrect!
253ZYAN_STATIC_ASSERT(sizeof(ZyanISize ) == sizeof(void*)); // TODO: This one is incorrect!
254ZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));
255ZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));
256
257// Verify signedness assumptions (relies on size checks above).
258ZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));
259ZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));
260ZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));
261ZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));
262
263/* ============================================================================================== */
264/* Pointer */
265/* ============================================================================================== */
266
270typedef void* ZyanVoidPointer;
271
275typedef const void* ZyanConstVoidPointer;
276
277#define ZYAN_NULL ((void*)0)
278
279/* ============================================================================================== */
280/* Logic types */
281/* ============================================================================================== */
282
283/* ---------------------------------------------------------------------------------------------- */
284/* Boolean */
285/* ---------------------------------------------------------------------------------------------- */
286
287#define ZYAN_FALSE 0u
288#define ZYAN_TRUE 1u
289
296typedef ZyanU8 ZyanBool;
297
298/* ---------------------------------------------------------------------------------------------- */
299/* Ternary */
300/* ---------------------------------------------------------------------------------------------- */
301
308typedef ZyanI8 ZyanTernary;
309
310#define ZYAN_TERNARY_FALSE (-1)
311#define ZYAN_TERNARY_UNKNOWN 0x00
312#define ZYAN_TERNARY_TRUE 0x01
313
314/* ============================================================================================== */
315/* String types */
316/* ============================================================================================== */
317
318/* ---------------------------------------------------------------------------------------------- */
319/* C-style strings */
320/* ---------------------------------------------------------------------------------------------- */
321
327typedef char* ZyanCharPointer;
328
334typedef const char* ZyanConstCharPointer;
335
336/* ---------------------------------------------------------------------------------------------- */
337
338/* ============================================================================================== */
339
340#endif /* ZYCORE_TYPES_H */
#define ZYAN_STATIC_ASSERT(x)
Definition Defines.h:295
ZyanU8 ZyanBool
Definition Types.h:296
const void * ZyanConstVoidPointer
Definition Types.h:275
const char * ZyanConstCharPointer
Definition Types.h:334
char * ZyanCharPointer
Definition Types.h:327
ZyanI8 ZyanTernary
Definition Types.h:308
void * ZyanVoidPointer
Definition Types.h:270