Zycore
1.5.2
Zyan Core Library for C
Toggle main menu visibility
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
31
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
/* Type conversion utils */
338
/* ============================================================================================== */
339
347
#if defined(ZYAN_MSVC)
348
# if defined(ZYAN_NO_LIBC)
349
# if defined(__cplusplus)
350
extern
"C"
{
351
# endif
352
unsigned
short
__cdecl _byteswap_ushort(
unsigned
short
);
353
unsigned
long
__cdecl _byteswap_ulong(
unsigned
long
);
354
unsigned
__int64 __cdecl _byteswap_uint64(
unsigned
__int64);
355
# if defined(__cplusplus)
356
}
357
# endif
358
# elif defined(ZYAN_KERNEL)
359
# include <wdm.h>
360
# else
361
# include <stdlib.h>
362
# endif
363
364
# define ZYAN_BYTESWAP16(x) _byteswap_ushort((x))
365
# define ZYAN_BYTESWAP32(x) _byteswap_ulong((x))
366
# define ZYAN_BYTESWAP64(x) _byteswap_uint64((x))
367
#elif ZYAN_HAS_BUILTIN(__builtin_bswap16) && \
368
ZYAN_HAS_BUILTIN(__builtin_bswap32) && \
369
ZYAN_HAS_BUILTIN(__builtin_bswap64)
370
# define ZYAN_BYTESWAP16(x) __builtin_bswap16((x))
371
# define ZYAN_BYTESWAP32(x) __builtin_bswap32((x))
372
# define ZYAN_BYTESWAP64(x) __builtin_bswap64((x))
373
#else
374
ZYAN_INLINE
ZyanU16
ZYAN_BYTESWAP16
(
ZyanU16
x)
375
{
376
return
(((x >> 8) & 0xFFU) | ((x & 0xFFU) << 8));
377
}
378
379
ZYAN_INLINE
ZyanU32
ZYAN_BYTESWAP32
(
ZyanU32
x)
380
{
381
return
(((x & 0xFF000000U) >> 24) |
382
((x & 0x00FF0000U) >> 8 ) |
383
((x & 0x0000FF00U) << 8 ) |
384
((x & 0x000000FFU) << 24));
385
}
386
387
ZYAN_INLINE
ZyanU64
ZYAN_BYTESWAP64
(
ZyanU64
x)
388
{
389
return
(((x & 0xFF00000000000000ULL) >> 56) |
390
((x & 0x00FF000000000000ULL) >> 40) |
391
((x & 0x0000FF0000000000ULL) >> 24) |
392
((x & 0x000000FF00000000ULL) >> 8 ) |
393
((x & 0x00000000FF000000ULL) << 8 ) |
394
((x & 0x0000000000FF0000ULL) << 24) |
395
((x & 0x000000000000FF00ULL) << 40) |
396
((x & 0x00000000000000FFULL) << 56));
397
}
398
#endif
399
406
#if ZYAN_ENDIAN == ZYAN_LITTLE_ENDIAN
407
# define ZYAN_LE16_TO_NATIVE(x)
408
# define ZYAN_LE32_TO_NATIVE(x)
409
# define ZYAN_LE64_TO_NATIVE(x)
410
#else
411
# define ZYAN_LE16_TO_NATIVE(x) (x) = ZYAN_BYTESWAP16((x))
412
# define ZYAN_LE32_TO_NATIVE(x) (x) = ZYAN_BYTESWAP32((x))
413
# define ZYAN_LE64_TO_NATIVE(x) (x) = ZYAN_BYTESWAP64((x))
414
#endif
415
416
/* ---------------------------------------------------------------------------------------------- */
417
418
/* ============================================================================================== */
419
420
#endif
/* ZYCORE_TYPES_H */
Defines.h
General helper and platform detection macros.
ZYAN_INLINE
#define ZYAN_INLINE
Definition
Defines.h:356
ZyanISize
ptrdiff_t ZyanISize
Definition
Types.h:225
ZyanBool
ZyanU8 ZyanBool
Defines the ZyanBool data-type.
Definition
Types.h:296
ZyanI64
int64_t ZyanI64
Definition
Types.h:223
ZYAN_BYTESWAP64
ZYAN_INLINE ZyanU64 ZYAN_BYTESWAP64(ZyanU64 x)
Definition
Types.h:387
ZyanUSize
size_t ZyanUSize
Definition
Types.h:224
ZyanUPointer
uintptr_t ZyanUPointer
Definition
Types.h:226
ZyanI8
int8_t ZyanI8
Definition
Types.h:220
ZYAN_STATIC_ASSERT
ZYAN_STATIC_ASSERT((ZyanI8) -1 > > 1<(ZyanI8)((ZyanU8) -1 > > 1))
ZyanIPointer
intptr_t ZyanIPointer
Definition
Types.h:227
ZyanConstVoidPointer
const void * ZyanConstVoidPointer
Defines the ZyanConstVoidPointer data-type.
Definition
Types.h:275
ZyanI32
int32_t ZyanI32
Definition
Types.h:222
ZyanU16
uint16_t ZyanU16
Definition
Types.h:217
ZYAN_BYTESWAP16
ZYAN_INLINE ZyanU16 ZYAN_BYTESWAP16(ZyanU16 x)
Collection of functions for swapping byte order in 16/32/64-bit values respectively.
Definition
Types.h:374
ZyanI16
int16_t ZyanI16
Definition
Types.h:221
ZyanU64
uint64_t ZyanU64
Definition
Types.h:219
ZyanU8
uint8_t ZyanU8
Definition
Types.h:216
ZyanConstCharPointer
const char * ZyanConstCharPointer
Defines the ZyanConstCharPointer data-type.
Definition
Types.h:334
ZYAN_BYTESWAP32
ZYAN_INLINE ZyanU32 ZYAN_BYTESWAP32(ZyanU32 x)
Definition
Types.h:379
ZyanCharPointer
char * ZyanCharPointer
Defines the ZyanCharPointer data-type.
Definition
Types.h:327
ZyanTernary
ZyanI8 ZyanTernary
Defines the ZyanTernary data-type.
Definition
Types.h:308
ZyanU32
uint32_t ZyanU32
Definition
Types.h:218
ZyanVoidPointer
void * ZyanVoidPointer
Defines the ZyanVoidPointer data-type.
Definition
Types.h:270
include
Zycore
Types.h
Generated by
1.17.0