summaryrefslogtreecommitdiff
path: root/boost/hof/config.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hof/config.hpp')
-rw-r--r--boost/hof/config.hpp201
1 files changed, 201 insertions, 0 deletions
diff --git a/boost/hof/config.hpp b/boost/hof/config.hpp
new file mode 100644
index 0000000000..77e80e399a
--- /dev/null
+++ b/boost/hof/config.hpp
@@ -0,0 +1,201 @@
+/*=============================================================================
+ 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