• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED
2 #define BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED
3 
4 // Copyright 2016, 2018, 2019 Peter Dimov.
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 //
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
10 
11 // BOOST_MP11_WORKAROUND
12 
13 #if defined( BOOST_STRICT_CONFIG ) || defined( BOOST_MP11_NO_WORKAROUNDS )
14 
15 # define BOOST_MP11_WORKAROUND( symbol, test ) 0
16 
17 #else
18 
19 # define BOOST_MP11_WORKAROUND( symbol, test ) ((symbol) != 0 && ((symbol) test))
20 
21 #endif
22 
23 //
24 
25 #define BOOST_MP11_CUDA 0
26 #define BOOST_MP11_CLANG 0
27 #define BOOST_MP11_INTEL 0
28 #define BOOST_MP11_GCC 0
29 #define BOOST_MP11_MSVC 0
30 
31 #define BOOST_MP11_CONSTEXPR constexpr
32 
33 #if defined( __CUDACC__ )
34 
35 // nvcc
36 
37 # undef BOOST_MP11_CUDA
38 # define BOOST_MP11_CUDA (__CUDACC_VER_MAJOR__ * 1000000 + __CUDACC_VER_MINOR__ * 10000 + __CUDACC_VER_BUILD__)
39 
40 // CUDA (8.0) has no constexpr support in msvc mode:
41 # if defined(_MSC_VER) && (BOOST_MP11_CUDA < 9000000)
42 
43 #  define BOOST_MP11_NO_CONSTEXPR
44 
45 #  undef BOOST_MP11_CONSTEXPR
46 #  define BOOST_MP11_CONSTEXPR
47 
48 # endif
49 
50 #elif defined(__clang__)
51 
52 // Clang
53 
54 # undef BOOST_MP11_CLANG
55 # define BOOST_MP11_CLANG (__clang_major__ * 100 + __clang_minor__)
56 
57 # if defined(__has_cpp_attribute)
58 #  if __has_cpp_attribute(fallthrough) && __cplusplus >= 201406L // Clang 3.9+ in c++1z mode
59 #   define BOOST_MP11_HAS_FOLD_EXPRESSIONS
60 #  endif
61 # endif
62 
63 #if BOOST_MP11_CLANG < 400 && __cplusplus >= 201402L \
64    && defined( __GLIBCXX__ ) && !__has_include(<shared_mutex>)
65 
66 // Clang pre-4 in C++14 mode, libstdc++ pre-4.9, ::gets is not defined,
67 // but Clang tries to import it into std
68 
69    extern "C" char *gets (char *__s);
70 #endif
71 
72 #elif defined(__INTEL_COMPILER)
73 
74 // Intel C++
75 
76 # undef BOOST_MP11_INTEL
77 # define BOOST_MP11_INTEL __INTEL_COMPILER
78 
79 #elif defined(__GNUC__)
80 
81 // g++
82 
83 # undef BOOST_MP11_GCC
84 # define BOOST_MP11_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
85 
86 #elif defined(_MSC_VER)
87 
88 // MS Visual C++
89 
90 # undef BOOST_MP11_MSVC
91 # define BOOST_MP11_MSVC _MSC_VER
92 
93 # if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 )
94 #  define BOOST_MP11_NO_CONSTEXPR
95 # endif
96 
97 #if _MSC_FULL_VER < 190024210 // 2015u3
98 #  undef BOOST_MP11_CONSTEXPR
99 #  define BOOST_MP11_CONSTEXPR
100 #endif
101 
102 #endif
103 
104 // BOOST_MP11_HAS_CXX14_CONSTEXPR
105 
106 #if !defined(BOOST_MP11_NO_CONSTEXPR) && defined(__cpp_constexpr) && __cpp_constexpr >= 201304
107 #  define BOOST_MP11_HAS_CXX14_CONSTEXPR
108 #endif
109 
110 // BOOST_MP11_HAS_FOLD_EXPRESSIONS
111 
112 #if !defined(BOOST_MP11_HAS_FOLD_EXPRESSIONS) && defined(__cpp_fold_expressions) && __cpp_fold_expressions >= 201603
113 #  define BOOST_MP11_HAS_FOLD_EXPRESSIONS
114 #endif
115 
116 // BOOST_MP11_HAS_TYPE_PACK_ELEMENT
117 
118 #if defined(__has_builtin)
119 # if __has_builtin(__type_pack_element)
120 #  define BOOST_MP11_HAS_TYPE_PACK_ELEMENT
121 # endif
122 #endif
123 
124 // BOOST_MP11_DEPRECATED(msg)
125 
126 #if BOOST_MP11_WORKAROUND( BOOST_MP11_CLANG, < 304 )
127 #  define BOOST_MP11_DEPRECATED(msg)
128 #elif defined(__GNUC__) || defined(__clang__)
129 #  define BOOST_MP11_DEPRECATED(msg) __attribute__((deprecated(msg)))
130 #elif defined(_MSC_VER) && _MSC_VER >= 1900
131 #  define BOOST_MP11_DEPRECATED(msg) [[deprecated(msg)]]
132 #else
133 #  define BOOST_MP11_DEPRECATED(msg)
134 #endif
135 
136 #endif // #ifndef BOOST_MP11_DETAIL_CONFIG_HPP_INCLUDED
137