Zycore  1.5.0.0
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.
244 ZYAN_STATIC_ASSERT(sizeof(ZyanU8 ) == 1 );
245 ZYAN_STATIC_ASSERT(sizeof(ZyanU16 ) == 2 );
246 ZYAN_STATIC_ASSERT(sizeof(ZyanU32 ) == 4 );
247 ZYAN_STATIC_ASSERT(sizeof(ZyanU64 ) == 8 );
248 ZYAN_STATIC_ASSERT(sizeof(ZyanI8 ) == 1 );
249 ZYAN_STATIC_ASSERT(sizeof(ZyanI16 ) == 2 );
250 ZYAN_STATIC_ASSERT(sizeof(ZyanI32 ) == 4 );
251 ZYAN_STATIC_ASSERT(sizeof(ZyanI64 ) == 8 );
252 ZYAN_STATIC_ASSERT(sizeof(ZyanUSize ) == sizeof(void*)); // TODO: This one is incorrect!
253 ZYAN_STATIC_ASSERT(sizeof(ZyanISize ) == sizeof(void*)); // TODO: This one is incorrect!
254 ZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));
255 ZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));
256 
257 // Verify signedness assumptions (relies on size checks above).
258 ZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));
259 ZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));
260 ZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));
261 ZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));
262 
263 /* ============================================================================================== */
264 /* Pointer */
265 /* ============================================================================================== */
266 
270 typedef void* ZyanVoidPointer;
271 
275 typedef 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 
296 typedef ZyanU8 ZyanBool;
297 
298 /* ---------------------------------------------------------------------------------------------- */
299 /* Ternary */
300 /* ---------------------------------------------------------------------------------------------- */
301 
308 typedef 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 
327 typedef char* ZyanCharPointer;
328 
334 typedef const char* ZyanConstCharPointer;
335 
336 /* ---------------------------------------------------------------------------------------------- */
337 
338 /* ============================================================================================== */
339 
340 #endif /* ZYCORE_TYPES_H */
#define ZYAN_STATIC_ASSERT(x)
Definition: Defines.h:292
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