]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/hana/include/boost/hana/detail/dispatch_if.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / hana / include / boost / hana / detail / dispatch_if.hpp
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