123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /*=============================================================================
- Copyright (c) 2016 Paul Fultz II
- config.hpp
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ==============================================================================*/
- #ifndef BOOST_HOF_GUARD_CONFIG_HPP
- #define BOOST_HOF_GUARD_CONFIG_HPP
- // Unpack has extra checks to ensure that the function will be invoked with
- // the sequence. This extra check can help improve error reporting but it can
- // slow down compilation. This is enabled by default.
- #ifndef BOOST_HOF_CHECK_UNPACK_SEQUENCE
- #define BOOST_HOF_CHECK_UNPACK_SEQUENCE 1
- #endif
- // Check for std version
- #if __cplusplus >= 201606
- #define BOOST_HOF_HAS_STD_17 1
- #else
- #define BOOST_HOF_HAS_STD_17 0
- #endif
- #if __cplusplus >= 201402
- #define BOOST_HOF_HAS_STD_14 1
- #else
- #define BOOST_HOF_HAS_STD_14 0
- #endif
- #if __cplusplus >= 201103
- #define BOOST_HOF_HAS_STD_11 1
- #else
- #define BOOST_HOF_HAS_STD_11 0
- #endif
- // This determines if it safe to use inheritance for EBO. On every platform
- // except clang, compilers have problems with ambigous base conversion. So
- // this configures the library to use a different technique to achieve empty
- // optimization.
- #ifndef BOOST_HOF_HAS_EBO
- #ifdef __clang__
- #define BOOST_HOF_HAS_EBO 1
- #else
- #define BOOST_HOF_HAS_EBO 0
- #endif
- #endif
- // This configures the library whether expression sfinae can be used to detect
- // callability of a function.
- #ifndef BOOST_HOF_NO_EXPRESSION_SFINAE
- #ifdef _MSC_VER
- #define BOOST_HOF_NO_EXPRESSION_SFINAE 1
- #else
- #define BOOST_HOF_NO_EXPRESSION_SFINAE 0
- #endif
- #endif
- // This configures the library to use manual type deduction in a few places
- // where it problematic on a few platforms.
- #ifndef BOOST_HOF_HAS_MANUAL_DEDUCTION
- #if (defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 8)
- #define BOOST_HOF_HAS_MANUAL_DEDUCTION 1
- #else
- #define BOOST_HOF_HAS_MANUAL_DEDUCTION 0
- #endif
- #endif
- // Whether the compiler has relaxed constexpr.
- #ifndef BOOST_HOF_HAS_RELAXED_CONSTEXPR
- #ifdef __cpp_constexpr
- #if __cpp_constexpr >= 201304
- #define BOOST_HOF_HAS_RELAXED_CONSTEXPR 1
- #else
- #define BOOST_HOF_HAS_RELAXED_CONSTEXPR 0
- #endif
- #else
- #define BOOST_HOF_HAS_RELAXED_CONSTEXPR BOOST_HOF_HAS_STD_14
- #endif
- #endif
- // Whether the compiler supports generic lambdas
- #ifndef BOOST_HOF_HAS_GENERIC_LAMBDA
- #if defined(__cpp_generic_lambdas) || defined(_MSC_VER)
- #define BOOST_HOF_HAS_GENERIC_LAMBDA 1
- #else
- #define BOOST_HOF_HAS_GENERIC_LAMBDA BOOST_HOF_HAS_STD_14
- #endif
- #endif
- // Whether the compiler supports constexpr lambdas
- #ifndef BOOST_HOF_HAS_CONSTEXPR_LAMBDA
- #if defined(__cpp_constexpr) && __cpp_constexpr >= 201603
- #define BOOST_HOF_HAS_CONSTEXPR_LAMBDA 1
- #else
- #define BOOST_HOF_HAS_CONSTEXPR_LAMBDA BOOST_HOF_HAS_STD_17
- #endif
- #endif
- // Whether the compiler supports inline variables
- #ifndef BOOST_HOF_HAS_INLINE_VARIABLES
- #if defined(__cpp_inline_variables)
- #define BOOST_HOF_HAS_INLINE_VARIABLES 1
- #else
- #define BOOST_HOF_HAS_INLINE_VARIABLES BOOST_HOF_HAS_STD_17
- #endif
- #endif
- // Whether inline variables defined with lambdas have external linkage.
- // Currently, no compiler supports this yet.
- #ifndef BOOST_HOF_HAS_INLINE_LAMBDAS
- #define BOOST_HOF_HAS_INLINE_LAMBDAS 0
- #endif
- // Whether the compiler supports variable templates
- #ifndef BOOST_HOF_HAS_VARIABLE_TEMPLATES
- #if defined(__clang__) && __clang_major__ == 3 && __clang_minor__ < 5
- #define BOOST_HOF_HAS_VARIABLE_TEMPLATES 0
- #elif defined(__cpp_variable_templates)
- #define BOOST_HOF_HAS_VARIABLE_TEMPLATES 1
- #else
- #define BOOST_HOF_HAS_VARIABLE_TEMPLATES BOOST_HOF_HAS_STD_14
- #endif
- #endif
- // Whether a constexpr function can use a void return type
- #ifndef BOOST_HOF_NO_CONSTEXPR_VOID
- #if BOOST_HOF_HAS_RELAXED_CONSTEXPR
- #define BOOST_HOF_NO_CONSTEXPR_VOID 0
- #else
- #define BOOST_HOF_NO_CONSTEXPR_VOID 1
- #endif
- #endif
- // Whether to use template aliases
- #ifndef BOOST_HOF_HAS_TEMPLATE_ALIAS
- #if defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 8
- #define BOOST_HOF_HAS_TEMPLATE_ALIAS 0
- #else
- #define BOOST_HOF_HAS_TEMPLATE_ALIAS 1
- #endif
- #endif
- // Whether evaluations of function in brace initialization is ordered from
- // left-to-right.
- #ifndef BOOST_HOF_NO_ORDERED_BRACE_INIT
- #if (defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 9) || defined(_MSC_VER)
- #define BOOST_HOF_NO_ORDERED_BRACE_INIT 1
- #else
- #define BOOST_HOF_NO_ORDERED_BRACE_INIT 0
- #endif
- #endif
- // Whether the compiler has trouble mangling some expressions used in
- // decltype.
- #ifndef BOOST_HOF_HAS_MANGLE_OVERLOAD
- #if defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 7
- #define BOOST_HOF_HAS_MANGLE_OVERLOAD 0
- #else
- #define BOOST_HOF_HAS_MANGLE_OVERLOAD 1
- #endif
- #endif
- // Whether an incomplete 'this' pointer can be used in a trailing decltype.
- #ifndef BOOST_HOF_HAS_COMPLETE_DECLTYPE
- #if !BOOST_HOF_HAS_MANGLE_OVERLOAD || (defined(__GNUC__) && !defined (__clang__))
- #define BOOST_HOF_HAS_COMPLETE_DECLTYPE 0
- #else
- #define BOOST_HOF_HAS_COMPLETE_DECLTYPE 1
- #endif
- #endif
- // Whether function will deduce noexcept from an expression
- #ifndef BOOST_HOF_HAS_NOEXCEPT_DEDUCTION
- #if defined(__GNUC__) && !defined (__clang__) && ((__GNUC__ == 4 && __GNUC_MINOR__ < 8) || (__GNUC__ == 7 && __GNUC_MINOR__ == 1))
- #define BOOST_HOF_HAS_NOEXCEPT_DEDUCTION 0
- #else
- #define BOOST_HOF_HAS_NOEXCEPT_DEDUCTION 1
- #endif
- #endif
- // Some type expansion failures on gcc 4.6
- #ifndef BOOST_HOF_NO_TYPE_PACK_EXPANSION_IN_TEMPLATE
- #if defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 7
- #define BOOST_HOF_NO_TYPE_PACK_EXPANSION_IN_TEMPLATE 1
- #else
- #define BOOST_HOF_NO_TYPE_PACK_EXPANSION_IN_TEMPLATE 0
- #endif
- #endif
- // Whether to use std::default_constructible, it is a little buggy on gcc 4.6.
- #ifndef BOOST_HOF_NO_STD_DEFAULT_CONSTRUCTIBLE
- #if defined(__GNUC__) && !defined (__clang__) && __GNUC__ == 4 && __GNUC_MINOR__ < 7
- #define BOOST_HOF_NO_STD_DEFAULT_CONSTRUCTIBLE 1
- #else
- #define BOOST_HOF_NO_STD_DEFAULT_CONSTRUCTIBLE 0
- #endif
- #endif
- #endif
|