31 #if defined(sun) && defined(unix)
35 #ifndef _UCOMMON_PLATFORM_H_
36 #define _UCOMMON_PLATFORM_H_
39 #ifndef UCOMMON_SYSRUNTIME
43 #define _UCOMMON_EXTENDED_
56 #define UCOMMON_NAMESPACE ucommon
57 #define NAMESPACE_UCOMMON namespace ucommon {
58 #define END_NAMESPACE }
69 #ifndef _POSIX_PTHREAD_SEMANTICS
70 #define _POSIX_PTHREAD_SEMANTICS
74 #if !defined(__GNUC__) && !defined(__has_feature) && !defined(_MSC_VER)
75 #define UCOMMON_RTTI 1
78 #if __GNUC__ > 3 && defined(__GXX_RTTI)
79 #define UCOMMON_RTTI 1
82 #if defined(_MSC_VER) && defined(_CPPRTTI)
83 #define UCOMMON_RTTI 1
86 #if defined(__has_feature)
87 #if __has_feature(cxx_rtti)
88 #define UCOMMON_RTTI 1
92 #if defined(__GNUC__) && (__GNUC < 3) && !defined(_GNU_SOURCE)
96 #if !defined(__GNUC_PREREQ__)
97 #if defined(__GNUC__) && defined(__GNUC_MINOR__)
98 #define __GNUC_PREREQ__(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
100 #define __GNUC_PREREQ__(maj, min) 0
104 #if __GNUC_PREREQ__(3,3)
105 #define __PRINTF(x,y) __attribute__ ((format (printf, x, y)))
106 #define __SCANF(x, y) __attribute__ ((format (scanf, x, y)))
107 #define __MALLOC __attribute__ ((malloc))
110 #if __cplusplus < 201103L
114 #define __DELETE_COPY(x) inline x(const x&);\
115 inline x& operator=(const x&)
116 #define __DELETE_DEFAULTS(x) inline x();\
119 #define __FINAL final
120 #define __OVERRIDE override
121 #define __DELETED =delete
122 #define __DELETE_COPY(x) inline x(const x&) =delete;\
123 inline x& operator=(const x&) =delete
124 #define __DELETE_DEFAULTS(x) inline x() =delete;\
128 #if __cplusplus <= 199711L && !defined(_MSC_VER)
129 #if defined(__GNUC_MINOR__) && !defined(__clang__)
130 #define nullptr __null
132 const class nullptr_t
136 inline operator T*()
const {
140 template<
class C,
class T>
141 inline operator T C::*()
const {
146 void operator&()
const;
153 #define __PRINTF(x, y)
154 #define __SCANF(x, y)
172 #if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
175 #if defined(_MSC_VER)
178 #warning "Probably won't build, need VS >= 2010 or later"
184 #if _WIN32_WINNT < 0x0600
191 #define _WIN32_WINNT 0x0600
195 #pragma warning(disable: 4251)
196 #pragma warning(disable: 4996)
197 #pragma warning(disable: 4355)
198 #pragma warning(disable: 4290)
199 #pragma warning(disable: 4291)
202 #if defined(__BORLANDC__) && !defined(__MT__)
203 #error Please enable multithreading
206 #if defined(_MSC_VER) && !defined(_MT)
207 #error Please enable multithreading (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library)
212 #define WINVER _WIN32_WINNT
215 #ifndef WIN32_LEAN_AND_MEAN
216 #define WIN32_LEAN_AND_MEAN
219 #include <winsock2.h>
220 #include <ws2tcpip.h>
222 #if defined(_MSC_VER)
223 typedef int socksize_t;
224 typedef int socklen_t;
225 typedef signed long ssize_t;
228 typedef size_t sockword_t;
229 typedef size_t socksize_t;
234 #ifdef UCOMMON_STATIC
237 #define __EXPORT __declspec(dllimport)
243 #if defined(UCOMMON_RUNTIME) || defined(UCOMMON_STATIC)
246 #define __SHARED __EXPORT
250 typedef size_t socksize_t;
251 #define __EXPORT __attribute__ ((visibility("default")))
252 #define __LOCAL __attribute__ ((visibility("hidden")))
253 #define __SHARED __attribute__ ((visibility("default")))
260 #include <sys/stat.h>
264 #if defined(UCOMMON_WINPTHREAD) && __GNUC_PREREQ__(4, 8) && !defined(UCOMMON_SYSRUNTIME)
265 #define __MINGW_WINPTHREAD__
267 typedef size_t stacksize_t;
270 typedef DWORD pthread_t;
271 typedef unsigned stacksize_t;
272 typedef CRITICAL_SECTION pthread_mutex_t;
274 typedef char *caddr_t;
276 typedef SOCKET socket_t;
279 typedef struct timespec {
285 inline void sleep(
int seconds)
286 {::Sleep((seconds * 1000l));}
290 #define SERVICE_MAIN(id, argc, argv) void WINAPI service_##id(DWORD argc, LPSTR *argv)
292 typedef LPSERVICE_MAIN_FUNCTION cpr_service_t;
295 inline void pthread_exit(
void *p)
296 {_endthreadex((DWORD)0);}
298 inline pthread_t pthread_self(
void)
299 {
return (pthread_t)GetCurrentThreadId();}
301 inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
302 {InitializeCriticalSection(mutex);
return 0;}
304 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
305 {DeleteCriticalSection(mutex);}
307 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
308 {EnterCriticalSection(mutex);}
310 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
311 {LeaveCriticalSection(mutex);}
314 inline char *strdup(
const char *s)
317 inline int stricmp(
const char *s1,
const char *s2)
318 {
return _stricmp(s1, s2);}
320 inline int strnicmp(
const char *s1,
const char *s2,
size_t l)
321 {
return _strnicmp(s1, s2, l);}
324 #elif defined(__PTH__)
327 #include <sys/wait.h>
329 typedef size_t stacksize_t;
330 typedef int socket_t;
332 #define INVALID_SOCKET -1
333 #define INVALID_HANDLE_VALUE -1
336 #define pthread_mutex_t pth_mutex_t
337 #define pthread_cond_t pth_cond_t
338 #define pthread_t pth_t
340 inline int pthread_sigmask(
int how,
const sigset_t *set, sigset_t *oset)
341 {
return pth_sigmask(how, set, oset);};
343 inline void pthread_exit(
void *p)
346 inline void pthread_kill(pthread_t tid,
int sig)
347 {pth_raise(tid, sig);};
349 inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
350 {
return pth_mutex_init(mutex) != 0;};
352 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
355 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
356 {pth_mutex_acquire(mutex, 0, NULL);};
358 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
359 {pth_mutex_release(mutex);};
361 inline void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
362 {pth_cond_await(cond, mutex, NULL);};
364 inline void pthread_cond_signal(pthread_cond_t *cond)
365 {pth_cond_notify(cond, FALSE);};
367 inline void pthread_cond_broadcast(pthread_cond_t *cond)
368 {pth_cond_notify(cond, TRUE);};
374 typedef size_t stacksize_t;
375 typedef int socket_t;
377 #define INVALID_SOCKET -1
378 #define INVALID_HANDLE_VALUE -1
384 typedef signed __int8 int8_t;
385 typedef unsigned __int8 uint8_t;
386 typedef signed __int16 int16_t;
387 typedef unsigned __int16 uint16_t;
388 typedef signed __int32 int32_t;
389 typedef unsigned __int32 uint32_t;
390 typedef signed __int64 int64_t;
391 typedef unsigned __int64 uint64_t;
392 typedef char *caddr_t;
395 #define snprintf(p, s, f, ...) _snprintf_s(p, s, _TRUNCATE, f, __VA_ARGS__)
396 #define vsnprintf(p, s, f, a) _vsnprintf_s(p, s, _TRUNCATE, f, a)
400 #include <sys/stat.h>
401 #include <sys/types.h>
414 typedef unsigned long timeout_t;
419 #ifndef UCOMMON_RUNTIME
425 #define ENETDOWN ((int)(WSAENETDOWN))
428 #define EINPROGRESS ((int)(WSAEINPROGRESS))
431 #define ENOPROTOOPT ((int)(WSAENOPROTOOPT))
434 #define EADDRINUSE ((int)(WSAEADDRINUSE))
436 #ifndef EADDRNOTAVAIL
437 #define EADDRNOTAVAIL ((int)(WSAEADDRNOTAVAIL))
440 #define ENETUNREACH ((int)(WSAENETUNREACH))
443 #define EHOSTUNREACH ((int)(WSAEHOSTUNREACH))
446 #define EHOSTDOWN ((int)(WSAEHOSTDOWN))
449 #define ENETRESET ((int)(WSAENETRESET))
452 #define ECONNABORTED ((int)(WSAECONNABORTED))
455 #define ECONNRESET ((int)(WSAECONNRESET))
458 #define EISCONN ((int)(WSAEISCONN))
461 #define ENOTCONN ((int)(WSAENOTCONN))
464 #define ESHUTDOWN ((int)(WSAESHUTDOWN))
467 #define ETIMEDOUT ((int)(WSAETIMEDOUT))
470 #define ECONNREFUSED ((int)(WSAECONNREFUSED))
487 #define PROGRAM_MAIN(argc, argv) extern "C" int main(int argc, char **argv)
488 #define PROGRAM_EXIT(code) return code
492 #define SERVICE_MAIN(id, argc, argv) void service_##id(int argc, char **argv)
493 typedef void (*cpr_service_t)(
int argc,
char **argv);
498 #define crit(x, text) assert(x)
500 #define crit(x, text) if(!(x)) cpr_runtime_error(text)
511 {
return ((memory) ?
new(((
void *)memory)) T : NULL);}
513 typedef long Integer;
514 typedef unsigned long Unsigned;
516 typedef uint8_t ubyte_t;
525 template<
class T,
class S>
526 inline T polypointer_cast(S *s)
528 #if defined(DEBUG) && defined(UCOMMON_RTTI)
529 assert(dynamic_cast<T>(s) != NULL);
531 return static_cast<T
>(s);
534 template<
class T,
class S>
535 inline T polyconst_cast(S *s)
537 return const_cast<T
>(polypointer_cast<T>(s));
540 template<
class T,
class S>
541 inline T polystatic_cast(S *s)
543 return static_cast<T
>(s);
546 template<
class T,
class S>
547 inline T polydynamic_cast(S *s)
549 #if defined(UCOMMON_RTTI)
550 return dynamic_cast<T
>(s);
552 return static_cast<T
>(s);
556 template<
class T,
class S>
557 inline T& polyreference_cast(S *s)
559 #if defined(DEBUG) && defined(UCOMMON_RTTI)
560 assert(dynamic_cast<T*>(s) != NULL);
562 return *(
static_cast<T*
>(s));
566 inline T& reference_cast(T *pointer) {
568 assert(pointer != NULL);
574 inline const T immutable_cast(T p)
576 return static_cast<const T
>(p);
void(* sighandler_t)(int)
Convenient typedef for signal handlers.
void strfree(char *str)
Matching function for strdup().
T * init(T *memory)
Template function to initialize memory by invoking default constructor.