31#if __cplusplus >= 201103L
35#if defined(sun) && defined(unix)
39#ifndef _UCOMMON_PLATFORM_H_
40#define _UCOMMON_PLATFORM_H_
43#ifndef UCOMMON_SYSRUNTIME
47#define _UCOMMON_EXTENDED_
49#define __THROW_SIZE(x) throw std::length_error(x)
50#define __THROW_RANGE(x) throw std::out_of_range(x)
51#define __THROW_RUNTIME(x) throw std::runtime_error(x)
52#define __THROW_ALLOC() throw std::bad_alloc()
53#define __THROW_DEREF(v) if(v == nullptr) \
54 throw std::runtime_error("Dereference NULL")
55#define __THROW_UNDEF(v,x) if(v == nullptr) throw std::runtime_error(x)
57#define __THROW_RANGE(x) abort()
58#define __THROW_SIZE(x) abort()
59#define __THROW_RUNTIME(x) abort()
60#define __THROW_ALLOC() abort()
61#define __THROW_DEREF(v) if(v == nullptr) abort()
62#define __THROW_UNDEF(v,x) if(v == nullptr) abort()
75#define UCOMMON_NAMESPACE ucommon
76#define NAMESPACE_UCOMMON namespace ucommon {
77#define END_NAMESPACE }
88#ifndef _POSIX_PTHREAD_SEMANTICS
89#define _POSIX_PTHREAD_SEMANTICS
93#if !defined(__GNUC__) && !defined(__has_feature) && !defined(_MSC_VER)
97#if __GNUC__ > 3 && defined(__GXX_RTTI)
101#if defined(_MSC_VER) && defined(_CPPRTTI)
102#define UCOMMON_RTTI 1
105#if defined(__has_feature)
106#if __has_feature(cxx_rtti)
107#define UCOMMON_RTTI 1
112#define __PROTOCOL virtual
113template<
typename T,
typename S>
114T protocol_cast(S *s) {
115 return dynamic_cast<T
>(s);
119template<
typename T,
typename S>
120T protocol_cast(S *s) {
121 return static_cast<T
>(s);
125#if defined(__GNUC__) && (__GNUC < 3) && !defined(_GNU_SOURCE)
129#if !defined(__GNUC_PREREQ__)
130#if defined(__GNUC__) && defined(__GNUC_MINOR__)
131#define __GNUC_PREREQ__(maj, min) ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
133#define __GNUC_PREREQ__(maj, min) 0
137#if __GNUC_PREREQ__(3,3)
138#define __PRINTF(x,y) __attribute__ ((format (printf, x, y)))
139#define __SCANF(x, y) __attribute__ ((format (scanf, x, y)))
140#define __MALLOC __attribute__ ((malloc))
141#define __NORETURN __attribute__ ((__noreturn__))
144#define __UNUSED(x) (void)x
146#if __cplusplus >= 201103L
147#define __ALIGNED(x) alignas(x)
150#define __ALIGNED(x) __declspec(align(x))
152#define __ALIGNED(x) __attribute__(align(x))
156#if __cplusplus < 201103L
160#define __DELETE_COPY(x) inline x(const x&);\
161 inline x& operator=(const x&)
162#define __DELETE_DEFAULTS(x) inline x();\
166#define __OVERRIDE override
167#define __DELETED =delete
168#define __DELETE_COPY(x) inline x(const x&) =delete;\
169 inline x& operator=(const x&) =delete
170#define __DELETE_DEFAULTS(x) inline x() =delete;\
174#if __cplusplus <= 199711L && !defined(_MSC_VER)
175#if defined(__GNUC_MINOR__) && !defined(__clang__)
176#define nullptr __null
177#elif !defined(__clang__) || (defined(__clang__) && defined(__linux__))
182 inline operator T*()
const {
186 template<
class C,
class T>
187 inline operator T C::*()
const {
192 void operator&()
const;
199#define __PRINTF(x, y)
218#if defined(_MSC_VER) || defined(WIN32) || defined(_WIN32)
224#warning "Probably won't build, need VS >= 2010 or later"
230#if _WIN32_WINNT < 0x0600
237#define _WIN32_WINNT 0x0600
241#pragma warning(disable: 4251)
242#pragma warning(disable: 4996)
243#pragma warning(disable: 4355)
244#pragma warning(disable: 4290)
245#pragma warning(disable: 4291)
248#if defined(__BORLANDC__) && !defined(__MT__)
249#error Please enable multithreading
252#if defined(_MSC_VER) && !defined(_MT)
253#error Please enable multithreading (Project -> Settings -> C/C++ -> Code Generation -> Use Runtime Library)
258#define WINVER _WIN32_WINNT
261#ifndef WIN32_LEAN_AND_MEAN
262#define WIN32_LEAN_AND_MEAN
269typedef int socksize_t;
270typedef int socklen_t;
271typedef signed long ssize_t;
274typedef size_t sockword_t;
275typedef size_t socksize_t;
283#define __EXPORT __declspec(dllimport)
289#if defined(UCOMMON_RUNTIME) || defined(UCOMMON_STATIC)
292#define __SHARED __EXPORT
296typedef size_t socksize_t;
297#define __EXPORT __attribute__ ((visibility("default")))
298#define __LOCAL __attribute__ ((visibility("hidden")))
299#define __SHARED __attribute__ ((visibility("default")))
310#if defined(UCOMMON_WINPTHREAD) && __GNUC_PREREQ__(4, 8) && !defined(UCOMMON_SYSRUNTIME)
311#define __MINGW_WINPTHREAD__
313typedef size_t stacksize_t;
316typedef DWORD pthread_t;
317typedef DWORD pthread_key_t;
318typedef unsigned stacksize_t;
319typedef CRITICAL_SECTION pthread_mutex_t;
321typedef char *caddr_t;
323typedef SOCKET socket_t;
326typedef struct timespec {
332inline void sleep(
int seconds)
333 {::Sleep((seconds * 1000l));}
337 #define __SERVICE(id, argc, argv) void WINAPI service_##id(DWORD argc, LPSTR *argv)
338 #define SERVICE_MAIN(id, argc, argv) void WINAPI service_##id(DWORD argc, LPSTR *argv)
340 typedef LPSERVICE_MAIN_FUNCTION cpr_service_t;
343 inline void pthread_exit(
void *p)
344 {_endthreadex((DWORD)0);}
346 inline pthread_t pthread_self(
void)
347 {
return (pthread_t)GetCurrentThreadId();}
349 inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
350 {InitializeCriticalSection(mutex);
return 0;}
352 inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
353 {DeleteCriticalSection(mutex);}
355 inline void pthread_mutex_lock(pthread_mutex_t *mutex)
356 {EnterCriticalSection(mutex);}
358 inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
359 {LeaveCriticalSection(mutex);}
363#elif defined(__PTH__)
368typedef size_t stacksize_t;
371#define INVALID_SOCKET -1
372#define INVALID_HANDLE_VALUE -1
375#define pthread_mutex_t pth_mutex_t
376#define pthread_cond_t pth_cond_t
377#define pthread_t pth_t
379inline int pthread_sigmask(
int how,
const sigset_t *set, sigset_t *oset)
380 {
return pth_sigmask(how, set, oset);};
382inline void pthread_exit(
void *p)
385inline void pthread_kill(pthread_t tid,
int sig)
386 {pth_raise(tid, sig);};
388inline int pthread_mutex_init(pthread_mutex_t *mutex,
void *x)
389 {
return pth_mutex_init(mutex) != 0;};
391inline void pthread_mutex_destroy(pthread_mutex_t *mutex)
394inline void pthread_mutex_lock(pthread_mutex_t *mutex)
395 {pth_mutex_acquire(mutex, 0,
nullptr);};
397inline void pthread_mutex_unlock(pthread_mutex_t *mutex)
398 {pth_mutex_release(mutex);};
400inline void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
401 {pth_cond_await(cond, mutex,
nullptr);};
403inline void pthread_cond_signal(pthread_cond_t *cond)
404 {pth_cond_notify(cond, FALSE);};
406inline void pthread_cond_broadcast(pthread_cond_t *cond)
407 {pth_cond_notify(cond, TRUE);};
413typedef size_t stacksize_t;
416#define INVALID_SOCKET -1
417#define INVALID_HANDLE_VALUE -1
423typedef signed __int8 int8_t;
424typedef unsigned __int8 uint8_t;
425typedef signed __int16 int16_t;
426typedef unsigned __int16 uint16_t;
427typedef signed __int32 int32_t;
428typedef unsigned __int32 uint32_t;
429typedef signed __int64 int64_t;
430typedef unsigned __int64 uint64_t;
431typedef char *caddr_t;
434#define snprintf(p, s, f, ...) _snprintf_s(p, s, _TRUNCATE, f, __VA_ARGS__)
435#define vsnprintf(p, s, f, a) _vsnprintf_s(p, s, _TRUNCATE, f, a)
440#include <sys/types.h>
453typedef unsigned long timeout_t;
458#ifndef UCOMMON_RUNTIME
464#define ENETDOWN ((int)(WSAENETDOWN))
467#define EINPROGRESS ((int)(WSAEINPROGRESS))
470#define ENOPROTOOPT ((int)(WSAENOPROTOOPT))
473#define EADDRINUSE ((int)(WSAEADDRINUSE))
476#define EADDRNOTAVAIL ((int)(WSAEADDRNOTAVAIL))
479#define ENETUNREACH ((int)(WSAENETUNREACH))
482#define EHOSTUNREACH ((int)(WSAEHOSTUNREACH))
485#define EHOSTDOWN ((int)(WSAEHOSTDOWN))
488#define ENETRESET ((int)(WSAENETRESET))
491#define ECONNABORTED ((int)(WSAECONNABORTED))
494#define ECONNRESET ((int)(WSAECONNRESET))
497#define EISCONN ((int)(WSAEISCONN))
500#define ENOTCONN ((int)(WSAENOTCONN))
503#define ESHUTDOWN ((int)(WSAESHUTDOWN))
506#define ETIMEDOUT ((int)(WSAETIMEDOUT))
509#define ECONNREFUSED ((int)(WSAECONNREFUSED))
526#define __PROGRAM(c,v) extern "C" int main(int c, char **v)
527#define PROGRAM_MAIN(argc, argv) extern "C" int main(int argc, char **argv)
528#define PROGRAM_EXIT(code) return code
532#define __SERVICE(id, c, v) void service_##id(int c, char **v)
533#define SERVICE_MAIN(id, argc, argv) void service_##id(int argc, char **argv)
534typedef void (*cpr_service_t)(
int argc,
char **argv);
539#define crit(x, text) assert(x)
541#define crit(x, text) if(!(x)) cpr_runtime_error(text)
552 {
return ((memory) ?
new(((
void *)memory)) T :
nullptr);}
555typedef unsigned long Unsigned;
557typedef uint8_t ubyte_t;
566template<
class T,
class S>
567inline T polypointer_cast(S *s)
569#if defined(DEBUG) && defined(UCOMMON_RTTI)
572 T ptr =
dynamic_cast<T
>(s);
576 return static_cast<T
>(s);
580template<
class T,
class S>
581inline T polyconst_cast(S *s)
583 return const_cast<T
>(polypointer_cast<T>(s));
586template<
class T,
class S>
587inline T polystatic_cast(S *s)
589 return static_cast<T
>(s);
592template<
class T,
class S>
593inline T polydynamic_cast(S *s)
595#if defined(UCOMMON_RTTI)
596 return dynamic_cast<T
>(s);
598 return static_cast<T
>(s);
602template<
class T,
class S>
603inline T& polyreference_cast(S *s)
606 return *(
static_cast<T*
>(s));
610inline T& reference_cast(T *pointer) {
611 __THROW_DEREF(pointer);
616inline const T immutable_cast(T p)
618 return static_cast<const T
>(p);
void(* sighandler_t)(int)
Convenient typedef for signal handlers.
T * init(T *memory)
Template function to initialize memory by invoking default constructor.
void strfree(char *str)
Matching function for strdup().