#pragma once
#include "platform_incl.h"
#if defined(__unix__) || defined(__unix) || \
(defined(__APPLE__) && defined(__MACH__))
#define ISOSPEC_TEST_WE_ARE_ON_UNIX_YAY true
#define ISOSPEC_TEST_WE_ARE_ON_WINDOWS false
#define ISOSPEC_TEST_GOT_SYSTEM_MMAN true
#define ISOSPEC_TEST_GOT_MMAN true
#elif defined(__MINGW32__) || defined(_WIN32)
#define ISOSPEC_TEST_WE_ARE_ON_UNIX_YAY false
#define ISOSPEC_TEST_WE_ARE_ON_WINDOWS true
#define ISOSPEC_TEST_GOT_SYSTEM_MMAN false
#define ISOSPEC_TEST_GOT_MMAN true
#else
#define ISOSPEC_TEST_WE_ARE_ON_UNIX_YAY false
#define ISOSPEC_TEST_WE_ARE_ON_WINDOWS false
#define ISOSPEC_TEST_GOT_SYSTEM_MMAN false
#define ISOSPEC_TEST_GOT_MMAN false
#endif
#if !defined(ISOSPEC_WE_ARE_ON_UNIX_YAY)
#define ISOSPEC_WE_ARE_ON_UNIX_YAY ISOSPEC_TEST_WE_ARE_ON_UNIX_YAY
#endif
#if !defined(ISOSPEC_WE_ARE_ON_WINDOWS)
#define ISOSPEC_WE_ARE_ON_WINDOWS ISOSPEC_TEST_WE_ARE_ON_WINDOWS
#endif
#if !defined(ISOSPEC_GOT_SYSTEM_MMAN)
#define ISOSPEC_GOT_SYSTEM_MMAN ISOSPEC_TEST_GOT_SYSTEM_MMAN
#endif
#if !defined(ISOSPEC_GOT_MMAN)
#define ISOSPEC_GOT_MMAN ISOSPEC_TEST_GOT_MMAN
#endif
#ifdef __GNUC__
#define ISOSPEC_IMPOSSIBLE(condition) if(condition) __builtin_unreachable();
#define ISOSPEC_LIKELY(condition) __builtin_expect(static_cast<bool>(condition), 1)
#define ISOSPEC_UNLIKELY(condition) __builtin_expect(static_cast<bool>(condition), 0)
#define ISOSPEC_FORCE_INLINE __attribute__ ((always_inline)) inline
#elif defined _MSC_VER
#define ISOSPEC_IMPOSSIBLE(condition) __assume(!(condition));
#define ISOSPEC_LIKELY(condition) condition
#define ISOSPEC_UNLIKELY(condition) condition
#define ISOSPEC_FORCE_INLINE __forceinline
#else
#define ISOSPEC_IMPOSSIBLE(condition)
#define ISOSPEC_LIKELY(condition) condition
#define ISOSPEC_UNLIKELY(condition) condition
#define ISOSPEC_FORCE_INLINE inline
#endif
#if defined(__has_builtin)
#if __has_builtin(__builtin_unpredictable)
#define ISOSPEC_UNPREDICTABLE(condition) __builtin_unpredictable(static_cast<bool>(condition))
#endif
#endif
#ifndef ISOSPEC_UNPREDICTABLE
#define ISOSPEC_UNPREDICTABLE(condition) (condition)
#endif
#ifdef ISOSPEC_DEBUG
#undef ISOSPEC_IMPOSSIBLE
#include <cassert>
#define ISOSPEC_IMPOSSIBLE(condition) assert(!(condition));
#endif
#if ISOSPEC_GOT_MMAN
#if ISOSPEC_GOT_SYSTEM_MMAN
#include <sys/mman.h>
#else
#include "mman.h"
#endif
#else
#include <stdlib.h>
#endif
#if defined(OPENMS_DLLAPI)
#define ISOSPEC_EXPORT_SYMBOL OPENMS_DLLAPI
#else
#define ISOSPEC_EXPORT_SYMBOL
#endif
#if (defined(_WIN32) || defined(_WIN64)) && !defined(MXE)
#define ISOSPEC_C_API __declspec(dllexport)
#else
#define ISOSPEC_C_API
#endif
#if !defined(__cpp_if_constexpr)
#define constexpr_if if
#define ISOSPEC_MAYBE_UNUSED
#else
#define constexpr_if if constexpr
#define ISOSPEC_MAYBE_UNUSED [[maybe_unused]]
#endif
#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
#define ISOSPEC_ISA_BUILD_X86 1
#else
#define ISOSPEC_ISA_BUILD_X86 0
#endif
#if !defined(ISOSPEC_ISA_DISPATCH)
#define ISOSPEC_ISA_DISPATCH 0
#endif
#ifdef __cplusplus
#include <cstddef>
#ifdef __has_include
#if __has_include(<experimental/simd>) && !defined(_LIBCPP_VERSION)
#define ISOSPEC_HAS_SIMD 1
#include <experimental/simd>
namespace simd_ns = std::experimental;
using simd_double = simd_ns::native_simd<double>;
#endif
#endif
#if !defined(ISOSPEC_HAS_SIMD)
#define ISOSPEC_HAS_SIMD 0
#endif
constexpr std::size_t DOUBLE_SIMD_ALIGNMENT = 64;
#endif