diff options
Diffstat (limited to 'Firestore/Port/absl/absl_config.h')
-rw-r--r-- | Firestore/Port/absl/absl_config.h | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/Firestore/Port/absl/absl_config.h b/Firestore/Port/absl/absl_config.h new file mode 100644 index 0000000..70f4d86 --- /dev/null +++ b/Firestore/Port/absl/absl_config.h @@ -0,0 +1,306 @@ +/* + * Copyright 2017 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Defines preprocessor macros describing the presence of "features" available. +// This facilitates writing portable code by parameterizing the compilation +// based on the presence or lack of a feature. +// +// We define a feature as some interface we wish to program to: for example, +// some library function or system call. +// +// For example, suppose a programmer wants to write a program that uses the +// 'mmap' system call. Then one might write: +// +// #include "absl/base/config.h" +// +// #ifdef ABSL_HAVE_MMAP +// #include "sys/mman.h" +// #endif //ABSL_HAVE_MMAP +// +// ... +// #ifdef ABSL_HAVE_MMAP +// void *ptr = mmap(...); +// ... +// #endif // ABSL_HAVE_MMAP +// +// As a special note, using feature macros from config.h to determine whether +// to include a particular header requires violating the style guide's required +// ordering for headers: this is permitted. + +#ifndef THIRD_PARTY_ABSL_BASE_CONFIG_H_ +#define THIRD_PARTY_ABSL_BASE_CONFIG_H_ + +// Included for the __GLIBC__ macro (or similar macros on other systems). +#include <limits.h> + +#ifdef __cplusplus +// Included for __GLIBCXX__, _LIBCPP_VERSION +#include <cstddef> +#endif // __cplusplus + +// If we're using glibc, make sure we meet a minimum version requirement +// before we proceed much further. +// +// We have chosen glibc 2.12 as the minimum as it was tagged for release +// in May, 2010 and includes some functionality used in Google software +// (for instance pthread_setname_np): +// https://sourceware.org/ml/libc-alpha/2010-05/msg00000.html +#ifdef __GLIBC_PREREQ +#if !__GLIBC_PREREQ(2, 12) +#error "Minimum required version of glibc is 2.12." +#endif +#endif + +// ABSL_HAVE_BUILTIN is a function-like feature checking macro. +// It's a wrapper around __has_builtin, which is defined by only clang now. +// It evaluates to 1 if the builtin is supported or 0 if not. +// Define it to avoid an extra level of #ifdef __has_builtin check. +// http://releases.llvm.org/3.3/tools/clang/docs/LanguageExtensions.html +#ifdef __has_builtin +#define ABSL_HAVE_BUILTIN(x) __has_builtin(x) +#else +#define ABSL_HAVE_BUILTIN(x) 0 +#endif + +// ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE is defined when +// std::is_trivially_destructible<T> is supported. +// +// All supported compilers using libc++ have it, as does gcc >= 4.8 +// using libstdc++, as does Visual Studio. +// https://gcc.gnu.org/onlinedocs/gcc-4.8.1/libstdc++/manual/manual/status.html#status.iso.2011 +// is the first version where std::is_trivially_destructible no longer +// appeared as missing in the Type properties row. +#ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE +#error ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE cannot be directly set +#elif defined(_LIBCPP_VERSION) || \ + (!defined(__clang__) && defined(__GNUC__) && defined(__GLIBCXX__) && \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \ + defined(_MSC_VER) +#define ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1 +#endif + +// ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE is defined when +// std::is_trivially_default_constructible<T> and +// std::is_trivially_copy_constructible<T> are supported. +// +// ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE is defined when +// std::is_trivially_copy_assignable<T> is supported. +// +// Clang with libc++ supports it, as does gcc >= 5.1 with either +// libc++ or libstdc++, as does Visual Studio. +// https://gcc.gnu.org/gcc-5/changes.html lists as new +// "std::is_trivially_constructible, std::is_trivially_assignable +// etc." +#if defined(ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE) +#error ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE cannot be directly set +#elif defined(ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE) +#error ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE cannot directly set +#elif (defined(__clang__) && defined(_LIBCPP_VERSION)) || \ + (!defined(__clang__) && defined(__GNUC__) && \ + (__GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)) && \ + (defined(_LIBCPP_VERSION) || defined(__GLIBCXX__))) || \ + defined(_MSC_VER) +#define ABSL_HAVE_STD_IS_TRIVIALLY_CONSTRUCTIBLE 1 +#define ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE 1 +#endif + +// ABSL_HAVE_THREAD_LOCAL is defined when C++11's thread_local is available. +// Clang implements thread_local keyword but Xcode did not support the +// implementation until Xcode 8. +#ifdef ABSL_HAVE_THREAD_LOCAL +#error ABSL_HAVE_THREAD_LOCAL cannot be directly set +#elif !defined(__apple_build_version__) || __apple_build_version__ >= 8000042 +#define ABSL_HAVE_THREAD_LOCAL 1 +#endif + +// ABSL_HAVE_INTRINSIC_INT128 is defined when the implementation provides the +// 128 bit integral type: __int128. +// +// __SIZEOF_INT128__ is defined by Clang and GCC when __int128 is supported. +// Clang on ppc64 and aarch64 are exceptions where __int128 exists but has a +// sporadic compiler crashing bug. Nvidia's nvcc also defines __GNUC__ and +// __SIZEOF_INT128__ but not all versions that do this support __int128. Support +// has been tested for versions >= 7. +#ifdef ABSL_HAVE_INTRINSIC_INT128 +#error ABSL_HAVE_INTRINSIC_INT128 cannot be directly set +#elif (defined(__clang__) && defined(__SIZEOF_INT128__) && !defined(__ppc64__) && \ + !defined(__aarch64__)) || \ + (defined(__CUDACC__) && defined(__SIZEOF_INT128__) && __CUDACC_VER__ >= 70000) || \ + (!defined(__clang__) && !defined(__CUDACC__) && defined(__GNUC__) && \ + defined(__SIZEOF_INT128__)) +#define ABSL_HAVE_INTRINSIC_INT128 1 +#endif + +// Operating system-specific features. +// +// Currently supported operating systems and associated preprocessor +// symbols: +// +// Linux and Linux-derived __linux__ +// Android __ANDROID__ (implies __linux__) +// Linux (non-Android) __linux__ && !__ANDROID__ +// Darwin (Mac OS X and iOS) __APPLE__ && __MACH__ +// Akaros (http://akaros.org) __ros__ +// Windows _WIN32 +// NaCL __native_client__ +// AsmJS __asmjs__ +// Fuschia __Fuchsia__ +// +// Note that since Android defines both __ANDROID__ and __linux__, one +// may probe for either Linux or Android by simply testing for __linux__. +// + +// ABSL_HAVE_MMAP is defined when the system has an mmap(2) implementation +// as defined in POSIX.1-2001. +#ifdef ABSL_HAVE_MMAP +#error ABSL_HAVE_MMAP cannot be directly set +#elif defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__ros__) || \ + defined(__native_client__) || defined(__asmjs__) || defined(__Fuchsia__) +#define ABSL_HAVE_MMAP 1 +#endif + +// ABSL_HAS_PTHREAD_GETSCHEDPARAM is defined when the system implements the +// pthread_(get|set)schedparam(3) functions as defined in POSIX.1-2001. +#ifdef ABSL_HAVE_PTHREAD_GETSCHEDPARAM +#error ABSL_HAVE_PTHREAD_GETSCHEDPARAM cannot be directly set +#elif defined(__linux__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__ros__) +#define ABSL_HAVE_PTHREAD_GETSCHEDPARAM 1 +#endif + +// ABSL_HAVE_SCHED_YIELD is defined when the system implements +// sched_yield(2) as defined in POSIX.1-2001. +#ifdef ABSL_HAVE_SCHED_YIELD +#error ABSL_HAVE_SCHED_YIELD cannot be directly set +#elif defined(__linux__) || defined(__ros__) || defined(__native_client__) +#define ABSL_HAVE_SCHED_YIELD 1 +#endif + +// ABSL_HAVE_SEMAPHORE_H is defined when the system supports the <semaphore.h> +// header and sem_open(3) family of functions as standardized in POSIX.1-2001. +// +// Note: While Apple does have <semaphore.h> for both iOS and macOS, it is +// explicity deprecated and will cause build failures if enabled for those +// systems. We side-step the issue by not defining it here for Apple platforms. +#ifdef ABSL_HAVE_SEMAPHORE_H +#error ABSL_HAVE_SEMAPHORE_H cannot be directly set +#elif defined(__linux__) || defined(__ros__) +#define ABSL_HAVE_SEMAPHORE_H 1 +#endif + +// Library-specific features. +#ifdef ABSL_HAVE_ALARM +#error ABSL_HAVE_ALARM cannot be directly set +#elif defined(__GOOGLE_GRTE_VERSION__) +// feature tests for Google's GRTE +#define ABSL_HAVE_ALARM 1 +#elif defined(__GLIBC__) +// feature test for glibc +#define ABSL_HAVE_ALARM 1 +#elif defined(_MSC_VER) +// feature tests for Microsoft's library +#elif defined(__native_client__) +#else +// other standard libraries +#define ABSL_HAVE_ALARM 1 +#endif + +#if defined(_STLPORT_VERSION) +#error "STLPort is not supported." +#endif + +// ----------------------------------------------------------------------------- +// Endianness +// ----------------------------------------------------------------------------- +// Define ABSL_IS_LITTLE_ENDIAN, ABSL_IS_BIG_ENDIAN. +// Some compilers or system headers provide macros to specify endianness. +// Unfortunately, there is no standard for the names of the macros or even of +// the header files. +// Reference: https://sourceforge.net/p/predef/wiki/Endianness/ +#if defined(ABSL_IS_BIG_ENDIAN) || defined(ABSL_IS_LITTLE_ENDIAN) +#error "ABSL_IS_(BIG|LITTLE)_ENDIAN cannot be directly set." + +#elif defined(__GLIBC__) || defined(__linux__) +// Operating systems that use the GNU C library generally provide <endian.h> +// containing __BYTE_ORDER, __LITTLE_ENDIAN, __BIG_ENDIAN. +#include <endian.h> + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define ABSL_IS_LITTLE_ENDIAN 1 +#elif __BYTE_ORDER == __BIG_ENDIAN +#define ABSL_IS_BIG_ENDIAN 1 +#else // __BYTE_ORDER != __LITTLE_ENDIAN && __BYTE_ORDER != __BIG_ENDIAN +#error "Unknown endianness" +#endif // __BYTE_ORDER + +#elif defined(__APPLE__) && defined(__MACH__) +// Apple has <machine/endian.h> containing BYTE_ORDER, BIG_ENDIAN, +// LITTLE_ENDIAN. +#include <machine/endian.h> // NOLINT(build/include) + +#if BYTE_ORDER == LITTLE_ENDIAN +#define ABSL_IS_LITTLE_ENDIAN 1 +#elif BYTE_ORDER == BIG_ENDIAN +#define ABSL_IS_BIG_ENDIAN 1 +#else // BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN +#error "Unknown endianness" +#endif // BYTE_ORDER + +#elif defined(_WIN32) +// Assume Windows is little-endian. +#define ABSL_IS_LITTLE_ENDIAN 1 + +#elif defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__THUMBEL__) || \ + defined(__AARCH64EL__) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) +#define ABSL_IS_LITTLE_ENDIAN 1 + +#elif defined(__BIG_ENDIAN__) || defined(__ARMEB__) || defined(__THUMBEB__) || \ + defined(__AARCH64EB__) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) +#define ABSL_IS_BIG_ENDIAN 1 + +#else +#error "absl endian detection needs to be set up on your platform." +#endif + +// ABSL_HAVE_EXCEPTIONS is defined when exceptions are enabled. Many +// compilers support a "no exceptions" mode that disables exceptions. +// +// Generally, when ABSL_HAVE_EXCEPTIONS is not defined: +// +// - Code using `throw` and `try` may not compile. +// - The `noexcept` specifier will still compile and behave as normal. +// - The `noexcept` operator may still return `false`. +// +// For further details, consult the compiler's documentation. +#ifdef ABSL_HAVE_EXCEPTIONS +#error ABSL_HAVE_EXCEPTIONS cannot be directly set. + +#elif defined(__clang__) +// TODO +// Switch to using __cpp_exceptions when we no longer support versions < 3.6. +// For details on this check, see: +// https://goo.gl/PilDrJ +#if defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) +#define ABSL_HAVE_EXCEPTIONS 1 +#endif // defined(__EXCEPTIONS) && __has_feature(cxx_exceptions) + +// Handle remaining special cases and default to exceptions being supported. +#elif !(defined(__GNUC__) && (__GNUC__ < 5) && !defined(__EXCEPTIONS)) && \ + !(defined(__GNUC__) && (__GNUC__ >= 5) && !defined(__cpp_exceptions)) && \ + !(defined(_MSC_VER) && !defined(_CPPUNWIND)) +#define ABSL_HAVE_EXCEPTIONS 1 +#endif + +#endif // THIRD_PARTY_ABSL_BASE_CONFIG_H_ |