+#ifdef __cplusplus
+ #define _PDCLIB_BEGIN_EXTERN_C extern "C" {
+ #define _PDCLIB_END_EXTERN_C }
+ typedef bool _PDCLIB_bool;
+#else
+ #define _PDCLIB_BEGIN_EXTERN_C
+ #define _PDCLIB_END_EXTERN_C
+ typedef _Bool _PDCLIB_bool;
+#endif
+
+/* Clang style feature detection macros
+ * Note: It is common to #define __has_feature(0) if undefined so the presence
+ * of this macro does not guarantee it to be working
+ */
+
+#ifdef __has_feature
+ #define _PDCLIB_HAS_FEATURE(x) __has_feature(x)
+#else
+ #define _PDCLIB_HAS_FEATURE(x) (0)
+#endif
+
+#ifdef __has_extension
+ #define _PDCLIB_HAS_EXTENSION(x) __has_extension(x)
+#else
+ // Older versions of Clang use __has_feature instead
+ #define _PDCLIB_HAS_EXTENSION(x) _PDCLIB_HAS_FEATURE(x)
+#endif
+
+#ifdef __has_builtin
+ #define _PDCLIB_HAS_BUILTIN(x) __has_builtin(x)
+#else
+ #define _PDCLIB_HAS_BUILTIN(x) (0)
+#endif
+
+#ifdef __has_attribute
+ #define _PDCLIB_HAS_ATTRIBUTE(x) __has_builtin(x)
+#else
+ #define _PDCLIB_HAS_ATTRIBUTE(x) (0)
+#endif
+
+/* GCC feature detection macros */
+
+#if defined(__GNUC__)
+ #define _PDCLIB_GCC_MIN(maj, min) \
+ ((__GNUC__ > maj) || (__GNUC__ == maj && __GNUC_MINOR__ >= min))
+#else
+ #define _PDCLIB_GCC_MIN(maj, min) (0)
+#endif
+
+/* Hybrid GCC/Clang feature detection macros */
+#define _PDCLIB_GCC_FEATURE(x, gccmaj, gccmin) \
+ (_PDCLIB_HAS_FEATURE(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj))
+
+#define _PDCLIB_GCC_EXTENSION(x, gccmaj, gccmin) \
+ (_PDCLIB_HAS_EXTENSION(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj))
+
+#define _PDCLIB_GCC_BUILTIN(x, gccmaj, gccmin) \
+ (_PDCLIB_HAS_BUILTIN(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj))
+
+#define _PDCLIB_GCC_ATTRIBUTE(x, gccmaj, gccmin) \
+ (_PDCLIB_HAS_ATTRIBUTE(x) || _PDCLIB_GCC_MIN(gccmin, gccmaj))
+
+/* Extension & Language feature detection */
+
+#if _PDCLIB_C_VERSION >= 1999 || defined(__cplusplus)
+ #ifndef __cplusplus
+ #define _PDCLIB_restrict restrict
+ #endif
+ #define _PDCLIB_inline inline
+#endif
+
+#if _PDCLIB_CXX_VERSION >= 2011
+ #define _PDCLIB_nothrow noexcept
+ #define _PDCLIB_noexcept(x) noexcept(x)
+#elif _PDCLIB_CXX_VERSION
+ #define _PDCLIB_nothrow throw()
+ #define _PDCLIB_noexcept
+#endif
+
+#if _PDCLIB_CXX_VERSION >= 2011 && _PDCLIB_GCC_FEATURE(cxx_attributes, 4, 8)
+ #define _PDCLIB_noreturn [[noreturn]]
+#elif _PDCLIB_C_VERSION >= 2011 && _PDCLIB_GCC_FEATURE(c_noreturn, 4, 7)
+ #define _PDCLIB_noreturn _Noreturn
+#endif
+
+#ifdef _WIN32
+ #define _PDCLIB_EXPORT __declspec(dllexport)
+ #define _PDCLIB_IMPORT __declspec(dllimport)
+#endif
+
+#if !defined(_PDCLIB_EXPORT) && _PDCLIB_GCC_ATTRIBUTE(__visibility__, 4, 0)
+ #define _PDCLIB_EXPORT __attribute__((__visibility__("protected")))
+#endif
+
+#if !defined(_PDCLIB_HIDDEN) && _PDCLIB_GCC_ATTRIBUTE(__visibility__, 4, 0)
+ #define _PDCLIB_HIDDEN __attribute__((__visibility__("hidden")))