1 /* 2 @Copyright Barrett Adair 2016-2017 3 4 Distributed under the Boost Software License, Version 1.0. 5 (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) 6 7 */ 8 9 #ifndef BOOST_CLBL_TRTS_DETAIL_CONFIG_HPP 10 #define BOOST_CLBL_TRTS_DETAIL_CONFIG_HPP 11 12 #include <type_traits> 13 #include <tuple> 14 #include <utility> 15 #include <cstdint> 16 17 #define BOOST_CLBL_TRTS_EMPTY_ 18 #define BOOST_CLBL_TRTS_EMPTY BOOST_CLBL_TRTS_EMPTY_ 19 20 #ifdef __cpp_transactional_memory 21 # define BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE 22 #endif 23 24 #ifdef __cpp_inline_variables 25 # define BOOST_CLBL_TRAITS_INLINE_VAR inline 26 #else 27 # define BOOST_CLBL_TRAITS_INLINE_VAR 28 #endif 29 30 #ifdef __cpp_noexcept_function_type 31 # define BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES 32 #endif 33 34 #ifdef BOOST_CLBL_TRTS_ENABLE_TRANSACTION_SAFE 35 # define BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER transaction_safe 36 #else 37 # define BOOST_CLBL_TRTS_TRANSACTION_SAFE_SPECIFIER 38 #endif 39 40 #ifndef __clang__ 41 # if defined(__GNUC__) 42 # define BOOST_CLBL_TRTS_GCC 43 # if __GNUC__ >= 6 44 # define BOOST_CLBL_TRTS_GCC_AT_LEAST_6_0_0 45 # endif 46 # if __GNUC__ < 5 47 # define BOOST_CLBL_TRTS_GCC_OLDER_THAN_5_0_0 48 # endif 49 # if __GNUC__ >= 5 50 # define BOOST_CLBL_TRTS_GCC_AT_LEAST_4_9_2 51 # elif __GNUC__ == 4 && __GNUC_MINOR__ == 9 && __GNUC_PATCHLEVEL__ >= 2 52 # define BOOST_CLBL_TRTS_GCC_AT_LEAST_4_9_2 53 # else 54 # define BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2 55 # endif //#if __GNUC__ >= 5 56 # endif //#if defined __GNUC__ 57 #endif // #ifndef __clang__ 58 59 #ifdef _MSC_VER 60 # ifdef __clang__ 61 # define BOOST_CLBL_TRTS_CLANG_C2 62 # else 63 # define BOOST_CLBL_TRTS_MSVC 64 # endif // #ifdef __clang__ 65 #endif // #ifdef _MSC_VER 66 67 #define BOOST_CLBL_TRTS_IX_SEQ(...) ::std::index_sequence< __VA_ARGS__ > 68 #define BOOST_CLBL_TRTS_MAKE_IX_SEQ(...) ::std::make_index_sequence< __VA_ARGS__ > 69 #define BOOST_CLBL_TRTS_DISJUNCTION(...) ::std::disjunction< __VA_ARGS__ > 70 71 #ifndef __cpp_variable_templates 72 # define BOOST_CLBL_TRTS_DISABLE_VARIABLE_TEMPLATES 73 #endif 74 75 #ifndef __cpp_lib_logical_traits 76 # include <boost/callable_traits/detail/polyfills/disjunction.hpp> 77 #endif //__cpp_lib_logical_traits 78 79 #ifndef __cpp_lib_integer_sequence 80 # include <boost/callable_traits/detail/polyfills/make_index_sequence.hpp> 81 #endif // __cpp_lib_integer_sequence 82 83 #if defined(BOOST_CLBL_TRTS_MSVC) && !defined(BOOST_DISABLE_WIN32) 84 # define BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC __cdecl 85 # define BOOST_CLBL_TRTS_PMF_VARGARGS_CDECL_DEFAULT 86 #else 87 # define BOOST_CLBL_TRTS_DEFAULT_VARARGS_CC 88 #endif // #if defined(BOOST_CLBL_TRTS_MSVC) && !defined(BOOST_DISABLE_WIN32)) 89 90 #if (defined(BOOST_CLBL_TRTS_GCC) && !defined(BOOST_CLBL_TRTS_GCC_AT_LEAST_4_9_2)) || defined(__INTEL_COMPILER) 91 # define BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS 92 # define BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS 93 #endif // #if defined BOOST_CLBL_TRTS_GCC && !defined(BOOST_CLBL_TRTS_GCC_AT_LEAST_4_9_2) 94 95 #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS 96 # define BOOST_CLBL_TRTS_ABOMINABLE_CONST BOOST_CLBL_TRTS_EMPTY 97 # define BOOST_CLBL_TRTS_ABOMINABLE_VOLATILE BOOST_CLBL_TRTS_EMPTY 98 #else 99 # define BOOST_CLBL_TRTS_ABOMINABLE_CONST const 100 # define BOOST_CLBL_TRTS_ABOMINABLE_VOLATILE volatile 101 #endif // #ifdef BOOST_CLBL_TRTS_DISABLE_ABOMINABLE_FUNCTIONS 102 103 #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES 104 # define BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER noexcept 105 #else 106 # define BOOST_CLBL_TRTS_NOEXCEPT_SPECIFIER BOOST_CLBL_TRTS_EMPTY 107 #endif // #ifdef BOOST_CLBL_TRTS_ENABLE_NOEXCEPT_TYPES 108 109 #endif // #ifndef BOOST_CLBL_TRTS_DETAIL_CONFIG_HPP 110