/* * Name: ZVector_Checks * Purpose: Header used by ZVector Library to identify for which * platform ZVector is being compiled. * Author: Paolo Fabio Zaino * Domain: General * License: Copyright 2021 by Paolo Fabio Zaino, all rights reserved * Distributed under MIT license * */ #ifndef SRC_ZVECTOR_CHECKS_H_ #define SRC_ZVECTOR_CHECKS_H_ #if defined(_MSC_VER) && (_MSC_VER >= 1020) #pragma once #endif // Try to determine the Operating System being used: #if defined(__APPLE__) && defined(__MACH__) # define macOS #endif #if ( defined(__GNU__) || defined(__gnu_linux__) || \ defined(__linux__) || defined(macOS) ) # define OS_TYPE 1 #elif ( defined(__WIN32__) || defined(WIN32) || defined(_WIN32) ) # define OS_TYPE 2 #else # define OS_TYPE 0 #endif // Try to determine compiler being used: #if defined(__GNUC__) # define compiler gcc # define ZVECT_COMPTYPE 1 # define COMP_MAJRELEASE (__GNUC__) # define COMP_MINRELEASE (__GNUC_MINOR__) # define COMP_PATRELEASE (__GNUC_PATCHLEVEL__) #elif defined(_MSC_VER) # define compiler msc # define ZVECT_COMPTYPE 2 # define COMP_MAJRELEASE (_MSC_VER) # define COMP_MINRELEASE 0 # define COMP_PATRELEASE 0 #elif defined(__clang__) # define compiler clang # define ZVECT_COMPTYPE 3 # define COMP_MAJRELEASE (__clang_major__) # define COMP_MINRELEASE (__clang_minor__) # define COMP_PATRELEASE (__clang_patchlevel__) #elif defined(__INTEL_COMPILER) || defined(__ICC) || \ defined(__ECC) || defined(__ICL) // For intel c compiler please remember to specify: // /Qstd=c99 (on Windows) // -std=c99 on Linux and/or macOS # define compiler intelc # define ZVECT_COMPTYPE 4 # define COMP_MAJRELEASE (__INTEL_COMPILER) # define COMP_MINRELEASE 0 # define COMP_PATRELEASE 0 #elif defined (__LCC__) # define compiler lcc # define ZVECT_COMPTYPE 5 # define COMP_MAJRELEASE (__LCC) # define COMP_MINRELEASE 0 # define COMP_PATRELEASE 0 #elif defined(__NORCROFT_C__) || defined(__CC_NORCROFT) || \ defined(__ARMCC_VERSION) // For Norcroft C please remember to specify: // -c99 # define compiler norcroftc # define ZVECT_COMPTYPE 6 # define COMP_MAJRELEASE (__ARMCC_VERSION) #elif defined(_CRAYC) // For Cray C please remember to specify: // -hc99 # define compiler crayc # define ZVECT_COMPTYPE 10 # define COMP_MAJRELEASE (_RELEASE) # define COMP_MINRELEASE (_RELEASE_MINOR) # define COMP_PATRELEASE 0 #elif defined(__HP_cc) // For HP CC please remember to specify: // -ansi -std=c99 # define compiler hpc # define ZVECT_COMPTYPE 11 # define COMP_MAJRELEASE 1 # define COMP_MINRELEASE 21 # define COMP_PATRELEASE 0 #elif defined(__IBMC__) // For IBM C please remember to specify: // C99 flags # define compiler ibmc # define ZVECT_COMPTYPE 12 #elif defined(__TINYC__) # define compiler tinyc # define ZVECT_COMPTYPE 6 # define COMP_MAJRELEASE 0 # define COMP_MINRELEASE 0 # define COMP_PATRELEASE 0 #else # define compiler unknown # define ZVECT_COMPTYPE 0 #endif // Try to determine CPU Architecture: #if defined(__aarch64__) # define CPU_TYPE ARM64 # define Arch64 #elif defined(__aarch32__) # define CPU_TYPE ARM32 # define Arch32 #elif defined(__amd64__) || defined(__x86_64__) || \ defined(__ia64__) || defined(_M_IA64) || \ defined(_M_AMD64) || defined(_M_X64) # define CPU_TYPE x86_64 # define Arch64 #else # define CPU_TYPE unknown # define Arch32 #endif // Start setting up macros based on the platform we detected // above. #if ( OS_TYPE == 1 ) // We are on a Unix-like OS so we can use pthreads! # define MUTEX_TYPE 1 # elif ( OS_TYPE == 2 ) && ( defined(__CYGWIN__) || \ defined(__MINGW32__) || defined(__MINGW64__) ) // We are on MS Windows using CIGWIN so we can use pthreads! # define MUTEX_TYPE 1 # elif ( OS_TYPE == 2 ) && ( !defined(__CYGWIN__) && \ !defined(__MINGW32__) && !defined(__MINGW64__) ) // We are on MS Windows, so we need to use // Windows stuff: # define MUTEX_TYPE 2 #else // I have no idea on which platform are we, // hence I have to use fake mutexes and go with the flow! # define MUTEX_TYPE 0 #endif #endif // SRC_ZVECTOR_CHECKS_H_