#if defined _WIN32 || defined __CYGWIN__
#	define PUBLIC __attribute__((dllexport))
#	define PRIVATE
#else
#	define PUBLIC __attribute__ ((visibility("default")))
#	define PRIVATE  __attribute__ ((visibility("hidden")))
#endif
#ifdef NO_LEGACY
#	define LEGACY PRIVATE
#else
#	define LEGACY PUBLIC
#endif

#if defined(DEBUG) || (!defined(__clang__))
#	include <assert.h>
#	define UNREACHABLE(x) assert(0 && x)
#	define ASSERT(x) assert(x)
#else
#	define UNREACHABLE(x) __builtin_unreachable()
#	define ASSERT(x) do { if (x) __builtin_unreachable(); } while(0)
#endif

#define LIKELY(x) __builtin_expect(x, 1)
#define UNLIKELY(x) __builtin_expect(x, 0)