summaryrefslogtreecommitdiff
path: root/boost/hana/detail/dispatch_if.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/hana/detail/dispatch_if.hpp')
-rw-r--r--boost/hana/detail/dispatch_if.hpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/boost/hana/detail/dispatch_if.hpp b/boost/hana/detail/dispatch_if.hpp
new file mode 100644
index 0000000000..88073fa7a2
--- /dev/null
+++ b/boost/hana/detail/dispatch_if.hpp
@@ -0,0 +1,56 @@
+/*!
+@file
+Defines `BOOST_HANA_DISPATCH_IF`.
+
+@copyright Louis Dionne 2013-2016
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_HANA_DETAIL_DISPATCH_IF_HPP
+#define BOOST_HANA_DETAIL_DISPATCH_IF_HPP
+
+#include <boost/hana/config.hpp>
+
+#include <type_traits>
+
+
+BOOST_HANA_NAMESPACE_BEGIN
+ struct deleted_implementation {
+ template <typename ...T>
+ static constexpr auto apply(T&& ...) = delete;
+ };
+
+ //! @ingroup group-details
+ //! Dispatch to the given implementation method only when a condition is
+ //! satisfied.
+ //!
+ //! If the condition is satisfied, this macro is equivalent to the type
+ //! `IMPL`. Otherwise, it is equivalent to a type with a deleted static
+ //! function named `apply`. When a tag-dispatching error happens, the
+ //! condition should be false and the deleted static function `apply`
+ //! will prevent the compiler from generating too much garbage.
+ //!
+ //! @note
+ //! When `BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS` is defined, the
+ //! condition is always ignored and this macro expands to the
+ //! implementation only.
+ //!
+ //! @remark
+ //! This must be implemented as a macro, because we don't want the
+ //! condition to be evaluated at all when
+ //! `BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS` is defined.
+#ifndef BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS
+ #define BOOST_HANA_DISPATCH_IF(IMPL, ...) \
+ ::std::conditional_t< \
+ (__VA_ARGS__), \
+ IMPL, \
+ ::boost::hana::deleted_implementation \
+ > \
+ /**/
+#else
+ #define BOOST_HANA_DISPATCH_IF(IMPL, ...) IMPL
+#endif
+BOOST_HANA_NAMESPACE_END
+
+#endif // !BOOST_HANA_DETAIL_DISPATCH_IF_HPP