Zycore  1.2.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  typedef __UINT8_TYPE__ ZyanU8;
66  typedef __UINT16_TYPE__ ZyanU16;
67  typedef __UINT32_TYPE__ ZyanU32;
68  typedef __UINT64_TYPE__ ZyanU64;
69  typedef __INT8_TYPE__ ZyanI8;
70  typedef __INT16_TYPE__ ZyanI16;
71  typedef __INT32_TYPE__ ZyanI32;
72  typedef __INT64_TYPE__ ZyanI64;
73  typedef __SIZE_TYPE__ ZyanUSize;
74  typedef __PTRDIFF_TYPE__ ZyanISize;
75  typedef __UINTPTR_TYPE__ ZyanUPointer;
76  typedef __INTPTR_TYPE__ ZyanIPointer;
77 # else
78 # error "Unsupported compiler for no-libc mode."
79 # endif
80 
81 # if defined(ZYAN_MSVC)
82 # define ZYAN_INT8_MIN (-127i8 - 1)
83 # define ZYAN_INT16_MIN (-32767i16 - 1)
84 # define ZYAN_INT32_MIN (-2147483647i32 - 1)
85 # define ZYAN_INT64_MIN (-9223372036854775807i64 - 1)
86 # define ZYAN_INT8_MAX 127i8
87 # define ZYAN_INT16_MAX 32767i16
88 # define ZYAN_INT32_MAX 2147483647i32
89 # define ZYAN_INT64_MAX 9223372036854775807i64
90 # define ZYAN_UINT8_MAX 0xffui8
91 # define ZYAN_UINT16_MAX 0xffffui16
92 # define ZYAN_UINT32_MAX 0xffffffffui32
93 # define ZYAN_UINT64_MAX 0xffffffffffffffffui64
94 # else
95 # define ZYAN_INT8_MAX __INT8_MAX__
96 # define ZYAN_INT8_MIN (-ZYAN_INT8_MAX - 1)
97 # define ZYAN_INT16_MAX __INT16_MAX__
98 # define ZYAN_INT16_MIN (-ZYAN_INT16_MAX - 1)
99 # define ZYAN_INT32_MAX __INT32_MAX__
100 # define ZYAN_INT32_MIN (-ZYAN_INT32_MAX - 1)
101 # define ZYAN_INT64_MAX __INT64_MAX__
102 # define ZYAN_INT64_MIN (-ZYAN_INT64_MAX - 1)
103 # define ZYAN_UINT8_MAX __UINT8_MAX__
104 # define ZYAN_UINT16_MAX __UINT16_MAX__
105 # define ZYAN_UINT32_MAX __UINT32_MAX__
106 # define ZYAN_UINT64_MAX __UINT64_MAX__
107 # endif
108 #else
109  // If is LibC present, we use stdint types.
110 # include <stdint.h>
111 # include <stddef.h>
112  typedef uint8_t ZyanU8;
113  typedef uint16_t ZyanU16;
114  typedef uint32_t ZyanU32;
115  typedef uint64_t ZyanU64;
116  typedef int8_t ZyanI8;
117  typedef int16_t ZyanI16;
118  typedef int32_t ZyanI32;
119  typedef int64_t ZyanI64;
120  typedef size_t ZyanUSize;
121  typedef ptrdiff_t ZyanISize;
122  typedef uintptr_t ZyanUPointer;
123  typedef intptr_t ZyanIPointer;
124 
125 # define ZYAN_INT8_MIN INT8_MIN
126 # define ZYAN_INT16_MIN INT16_MIN
127 # define ZYAN_INT32_MIN INT32_MIN
128 # define ZYAN_INT64_MIN INT64_MIN
129 # define ZYAN_INT8_MAX INT8_MAX
130 # define ZYAN_INT16_MAX INT16_MAX
131 # define ZYAN_INT32_MAX INT32_MAX
132 # define ZYAN_INT64_MAX INT64_MAX
133 # define ZYAN_UINT8_MAX UINT8_MAX
134 # define ZYAN_UINT16_MAX UINT16_MAX
135 # define ZYAN_UINT32_MAX UINT32_MAX
136 # define ZYAN_UINT64_MAX UINT64_MAX
137 #endif
138 
139 // Verify size assumptions.
140 ZYAN_STATIC_ASSERT(sizeof(ZyanU8 ) == 1 );
141 ZYAN_STATIC_ASSERT(sizeof(ZyanU16 ) == 2 );
142 ZYAN_STATIC_ASSERT(sizeof(ZyanU32 ) == 4 );
143 ZYAN_STATIC_ASSERT(sizeof(ZyanU64 ) == 8 );
144 ZYAN_STATIC_ASSERT(sizeof(ZyanI8 ) == 1 );
145 ZYAN_STATIC_ASSERT(sizeof(ZyanI16 ) == 2 );
146 ZYAN_STATIC_ASSERT(sizeof(ZyanI32 ) == 4 );
147 ZYAN_STATIC_ASSERT(sizeof(ZyanI64 ) == 8 );
148 ZYAN_STATIC_ASSERT(sizeof(ZyanUSize ) == sizeof(void*)); // TODO: This one is incorrect!
149 ZYAN_STATIC_ASSERT(sizeof(ZyanISize ) == sizeof(void*)); // TODO: This one is incorrect!
150 ZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));
151 ZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));
152 
153 // Verify signedness assumptions (relies on size checks above).
154 ZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));
155 ZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));
156 ZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));
157 ZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));
158 
159 /* ============================================================================================== */
160 /* Pointer */
161 /* ============================================================================================== */
162 
166 typedef void* ZyanVoidPointer;
167 
171 typedef const void* ZyanConstVoidPointer;
172 
173 #define ZYAN_NULL ((void*)0)
174 
175 /* ============================================================================================== */
176 /* Logic types */
177 /* ============================================================================================== */
178 
179 /* ---------------------------------------------------------------------------------------------- */
180 /* Boolean */
181 /* ---------------------------------------------------------------------------------------------- */
182 
183 #define ZYAN_FALSE 0
184 #define ZYAN_TRUE 1
185 
192 typedef ZyanU8 ZyanBool;
193 
194 /* ---------------------------------------------------------------------------------------------- */
195 /* Ternary */
196 /* ---------------------------------------------------------------------------------------------- */
197 
204 typedef ZyanI8 ZyanTernary;
205 
206 #define ZYAN_TERNARY_FALSE (-1)
207 #define ZYAN_TERNARY_UNKNOWN 0x00
208 #define ZYAN_TERNARY_TRUE 0x01
209 
210 /* ============================================================================================== */
211 /* String types */
212 /* ============================================================================================== */
213 
214 /* ---------------------------------------------------------------------------------------------- */
215 /* C-style strings */
216 /* ---------------------------------------------------------------------------------------------- */
217 
223 typedef char* ZyanCharPointer;
224 
230 typedef const char* ZyanConstCharPointer;
231 
232 /* ---------------------------------------------------------------------------------------------- */
233 
234 /* ============================================================================================== */
235 
236 #endif /* ZYCORE_TYPES_H */
#define ZYAN_STATIC_ASSERT(x)
Definition: Defines.h:281
ZyanU8 ZyanBool
Definition: Types.h:192
const void * ZyanConstVoidPointer
Definition: Types.h:171
const char * ZyanConstCharPointer
Definition: Types.h:230
char * ZyanCharPointer
Definition: Types.h:223
ZyanI8 ZyanTernary
Definition: Types.h:204
void * ZyanVoidPointer
Definition: Types.h:166