-
Notifications
You must be signed in to change notification settings - Fork 4
/
xxSystem.h
267 lines (249 loc) · 9.71 KB
/
xxSystem.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
//==============================================================================
// xxGraphic : System Header
//
// Copyright (c) 2019-2024 TAiGA
// https://github.com/metarutaiga/xxGraphic
//==============================================================================
#pragma once
#if defined(__APPLE__)
# include <TargetConditionals.h>
# define objc_retain(self) (__bridge_retained void*)self
# define objc_release(self) (__bridge_transfer id)(__bridge void*)self
# define objc_msgSend objc_msgSend_unused
# include <objc/message.h>
# undef objc_msgSend
OBJC_EXPORT id objc_msgSend(id self, SEL op, ...);
# if TARGET_OS_IPHONE
# define xxIOS 1
# if TARGET_CPU_X86_64
# define xxIOS_LEGACY 1
# endif
# endif
# if TARGET_OS_OSX
# define xxMACOS 1
# if TARGET_CPU_X86_64
# define xxMACOS_LEGACY 1
# endif
# endif
# if TARGET_OS_MACCATALYST
# define xxMACCATALYST 1
# endif
#endif
#if defined(__linux__)
# define xxLINUX 1
# if defined(__ANDROID__)
# if defined(__cplusplus)
extern "C"
{
# endif
extern __attribute__((visibility("default"))) struct _JavaVM* xxAndroidJavaVM;
extern __attribute__((visibility("default"))) struct _JNIEnv* xxAndroidJNIEnv;
extern __attribute__((visibility("default"))) class _jobject* xxAndroidContext;
extern __attribute__((visibility("default"))) int xxAndroidJNIVersion;
# if defined(__cplusplus)
};
# endif
# define xxANDROID 1
# endif
#endif
#if defined(_MSC_VER)
# ifndef _HAS_EXCEPTIONS
# define _HAS_EXCEPTIONS 0
# endif
# ifndef _CRT_NONSTDC_NO_WARNINGS
# define _CRT_NONSTDC_NO_WARNINGS
# endif
# ifndef _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS
# endif
# include <intrin.h>
# define NOMINMAX
# define WIN32_LEAN_AND_MEAN
# define _USE_MATH_DEFINES
# define xxWINDOWS 1
#endif
#include <float.h>
#include <math.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifndef xxAPI
# if defined(__cplusplus)
# if defined(_MSC_VER) && defined(XX_BUILD_LIBRARY)
# define xxAPI extern "C" __declspec(dllexport)
# elif defined(_MSC_VER)
# define xxAPI extern "C" __declspec(dllimport)
# else
# define xxAPI extern "C" __attribute__((visibility("default")))
# endif
# else
# if defined(_MSC_VER) && defined(XX_BUILD_LIBRARY)
# define xxAPI extern __declspec(dllexport)
# elif defined(_MSC_VER)
# define xxAPI extern __declspec(dllimport)
# else
# define xxAPI extern __attribute__((visibility("default")))
# endif
# endif
#endif
#ifndef xxPlusAPI
# if defined(_MSC_VER) && defined(XXPLUS_BUILD_LIBRARY)
# define xxPlusAPI __declspec(dllexport)
# elif defined(_MSC_VER)
# define xxPlusAPI __declspec(dllimport)
# else
# define xxPlusAPI __attribute__((visibility("default")))
# endif
#endif
#undef MSEC_PER_SEC
#undef USEC_PER_SEC
#undef NSEC_PER_SEC
#undef USEC_PER_MSEC
#undef NSEC_PER_MSEC
#undef NSEC_PER_USEC
#define MSEC_PER_SEC 1000ull
#define USEC_PER_SEC 1000000ull
#define NSEC_PER_SEC 1000000000ull
#define USEC_PER_MSEC 1000ull
#define NSEC_PER_MSEC 1000000ull
#define NSEC_PER_USEC 1000ull
#define xxSizeOf(var) (sizeof(var))
#define xxCountOf(var) (sizeof(var) / sizeof(*var))
#define xxOffsetOf(s, m) ((char*)&((s*)nullptr)->m - (char*)nullptr)
#define xxRotateLeft(v, s) ((v << s) | (v >> (sizeof(v) * 8 - s)))
#define xxRotateRight(v, s) ((v >> s) | (v << (sizeof(v) * 8 - s)))
#define xxLocalBreak() switch (0) case 0:
#define xxStringify_(v) #v
#define xxStringify(v) xxStringify_(v)
#define xxConcate_(x, y) x ## y
#define xxConcate(m, n) xxConcate_(m, n)
#define xxLikely(x) (x)
#define xxUnlikely(x) (x)
#define xxConstexpr const
#define xxDefaultArgument(value)
#define xxInline __inline__
#if defined(__GNUC__) || defined(__llvm__)
# undef xxLikely
# undef xxUnlikely
# define xxLikely(x) __builtin_expect((x), 1)
# define xxUnlikely(x) __builtin_expect((x), 0)
#endif
#if defined(__cplusplus) && ((__cplusplus >= 201103L) || (_MSC_VER >= 1600))
# undef xxConstexpr
# define xxConstexpr constexpr
#endif
#if defined(__cplusplus)
# undef xxDefaultArgument
# undef xxInline
# define xxDefaultArgument(value) = value
# define xxInline inline
#elif defined(_MSC_VER)
# undef xxInline
# define xxInline __inline
#endif
//==============================================================================
// Allocator
//==============================================================================
#if INTPTR_MAX == INT64_MAX
# define xxAlloc(T, ...) (T*)malloc(sizeof(T) * (__VA_ARGS__ + 1 != 1 ? __VA_ARGS__ + 0 : 1))
# define xxRealloc(ptr, T, count) (T*)realloc(ptr, sizeof(T) * count)
# define xxFree(ptr) free(ptr)
xxAPI size_t xxAllocSize(const void* ptr);
#else
# define xxAlloc(T, ...) (T*)xxAlignedAlloc(sizeof(T) * (__VA_ARGS__ + 1 != 1 ? __VA_ARGS__ + 0 : 1), 16)
# define xxRealloc(ptr, T, count) (T*)xxAlignedRealloc(ptr, sizeof(T) * count, 16)
# define xxFree(ptr) xxAlignedFree(ptr)
# define xxAllocSize(ptr) xxAlignedAllocSize(ptr, 16)
#endif
xxAPI void* xxAlignedAlloc(size_t size, size_t alignment);
xxAPI void* xxAlignedRealloc(void* ptr, size_t size, size_t alignment);
xxAPI void xxAlignedFree(void* ptr);
xxAPI size_t xxAlignedAllocSize(const void* ptr, size_t alignment);
//==============================================================================
// Library
//==============================================================================
xxAPI void* xxLoadLibrary(char const* name);
xxAPI void* xxGetProcAddress(void* library, char const* name);
xxAPI void xxFreeLibrary(void* library);
//==============================================================================
// TSC
//==============================================================================
xxAPI uint64_t xxTSC();
xxAPI uint64_t xxTSCFrequency();
xxAPI float xxGetCurrentTime(double* fp64 = nullptr);
xxAPI void xxSleep(unsigned int sleepMs);
//==============================================================================
// Process / Thread ID
//==============================================================================
xxAPI uint64_t xxGetCurrentProcessId();
xxAPI uint64_t xxGetCurrentThreadId();
xxAPI int xxGetIncrementThreadId();
//==============================================================================
// Path
//==============================================================================
xxAPI char const* xxGetDocumentPath();
xxAPI char const* xxGetExecutablePath();
xxAPI char* xxOpenDirectory(uint64_t* handle, char const* path, ...);
xxAPI void xxCloseDirectory(uint64_t* handle);
//==============================================================================
// Logger
//==============================================================================
xxAPI void (*xxLog)(char const* tag, char const* format, ...);
//==============================================================================
// MD5
//==============================================================================
xxAPI const uint8_t* xxMD5(void const* data, int len, uint8_t* digest);
xxAPI const uint8_t* xxDXBCChecksum(void const* data, int len, uint8_t* digest);
//==============================================================================
// Hash
//==============================================================================
xxAPI xxInline xxConstexpr unsigned int xxHash(char const* key, size_t count xxDefaultArgument(~size_t(0)), unsigned int hash xxDefaultArgument(0))
{
for (char c; (c = (*key)) && count; key++, count--)
hash = (hash * 16777619) ^ c;
return hash;
}
//==============================================================================
// Bitwise
//==============================================================================
#if defined(__GNUC__) || defined(__llvm__)
#define xxFindFirstSet __builtin_ffs
#define xxCountLeadingZeros __builtin_clz
#define xxCountTrailingZeros __builtin_ctz
#define xxPopulationCount __builtin_popcount
#elif defined(_M_IX86) || defined(_M_AMD64)
#define xxFindFirstSet 1 + _lzcnt_u32
#define xxCountLeadingZeros _lzcnt_u32
#define xxCountTrailingZeros _tzcnt_u32
#define xxPopulationCount __popcnt
#elif defined(_M_ARM) || defined(_M_ARM64)
#define xxFindFirstSet 1 + _CountLeadingZeros
#define xxCountLeadingZeros _CountLeadingZeros
#define xxCountTrailingZeros _CountTrailingZeros
#define xxPopulationCount _CountOneBits
#endif
//==============================================================================
// String
//==============================================================================
#if defined(_WIN32)
xxAPI xxInline char* strcasestr(char const* haystack, char const* needle)
{
for (size_t length = strlen(needle); (*haystack); haystack++)
if (_strnicmp(haystack, needle, length) == 0)
return (char*)haystack;
return NULL;
}
xxAPI xxInline char* strsep(char** stringp, char const* delim)
{
if (**stringp == '\0') return NULL;
char* s = *stringp;
char* p = s + strcspn(s, delim);
if (*p != '\0') *p++ = '\0';
*stringp = p;
return s;
}
#endif