1 // Range v3 library
2 //
3 //  Copyright Eric Niebler 2013-present
4 //
5 //  Use, modification and distribution is subject to the
6 //  Boost Software License, Version 1.0. (See accompanying
7 //  file LICENSE_1_0.txt or copy at
8 //  http://www.boost.org/LICENSE_1_0.txt)
9 //
10 // Project home: https://github.com/ericniebler/range-v3
11 //
12 
13 #ifndef RANGES_V3_DETAIL_PROLOGUE_HPP
14 #define RANGES_V3_DETAIL_PROLOGUE_HPP
15 #include <range/v3/detail/config.hpp>
16 #endif
17 
18 #ifdef RANGES_PROLOGUE_INCLUDED
19 #error "Prologue already included!"
20 #endif
21 #define RANGES_PROLOGUE_INCLUDED
22 
23 RANGES_DIAGNOSTIC_PUSH
24 
25 #ifdef RANGES_FEWER_WARNINGS
26 RANGES_DIAGNOSTIC_IGNORE_UNDEFINED_INTERNAL
27 RANGES_DIAGNOSTIC_IGNORE_INDENTATION
28 RANGES_DIAGNOSTIC_IGNORE_CXX17_COMPAT
29 #endif
30 
31 RANGES_DIAGNOSTIC_KEYWORD_MACRO
32 
33 #define template(...)                                                           \
34     CPP_PP_IGNORE_CXX2A_COMPAT_BEGIN                                            \
35     template<__VA_ARGS__ CPP_TEMPLATE_AUX_                                      \
36 
37 #define AND CPP_and
38 
39 /// \cond
40 #if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
41 // noexcept is part of the type system
42 #define declval(...) static_cast<__VA_ARGS__(*)() noexcept>(nullptr)()
43 #else
44 // noexcept is not part of the type system
45 #define declval(...) static_cast<__VA_ARGS__(*)()>(nullptr)()
46 #endif
47 /// \cond
48