]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*! |
2 | @file | |
3 | Defines `BOOST_HANA_DISPATCH_IF`. | |
4 | ||
5 | @copyright Louis Dionne 2013-2016 | |
6 | Distributed under the Boost Software License, Version 1.0. | |
7 | (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) | |
8 | */ | |
9 | ||
10 | #ifndef BOOST_HANA_DETAIL_DISPATCH_IF_HPP | |
11 | #define BOOST_HANA_DETAIL_DISPATCH_IF_HPP | |
12 | ||
13 | #include <boost/hana/config.hpp> | |
14 | ||
15 | #include <type_traits> | |
16 | ||
17 | ||
18 | BOOST_HANA_NAMESPACE_BEGIN | |
19 | struct deleted_implementation { | |
20 | template <typename ...T> | |
21 | static constexpr auto apply(T&& ...) = delete; | |
22 | }; | |
23 | ||
24 | //! @ingroup group-details | |
25 | //! Dispatch to the given implementation method only when a condition is | |
26 | //! satisfied. | |
27 | //! | |
28 | //! If the condition is satisfied, this macro is equivalent to the type | |
29 | //! `IMPL`. Otherwise, it is equivalent to a type with a deleted static | |
30 | //! function named `apply`. When a tag-dispatching error happens, the | |
31 | //! condition should be false and the deleted static function `apply` | |
32 | //! will prevent the compiler from generating too much garbage. | |
33 | //! | |
34 | //! @note | |
35 | //! When `BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS` is defined, the | |
36 | //! condition is always ignored and this macro expands to the | |
37 | //! implementation only. | |
38 | //! | |
39 | //! @remark | |
40 | //! This must be implemented as a macro, because we don't want the | |
41 | //! condition to be evaluated at all when | |
42 | //! `BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS` is defined. | |
43 | #ifndef BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS | |
44 | #define BOOST_HANA_DISPATCH_IF(IMPL, ...) \ | |
45 | ::std::conditional_t< \ | |
46 | (__VA_ARGS__), \ | |
47 | IMPL, \ | |
48 | ::boost::hana::deleted_implementation \ | |
49 | > \ | |
50 | /**/ | |
51 | #else | |
52 | #define BOOST_HANA_DISPATCH_IF(IMPL, ...) IMPL | |
53 | #endif | |
54 | BOOST_HANA_NAMESPACE_END | |
55 | ||
56 | #endif // !BOOST_HANA_DETAIL_DISPATCH_IF_HPP |