]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/math/tools/is_detected.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / math / tools / is_detected.hpp
CommitLineData
1e59de90
TL
1// Copyright Matt Borland 2021.
2// Use, modification and distribution are subject to the
3// Boost Software License, Version 1.0. (See accompanying file
4// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5//
6// https://en.cppreference.com/w/cpp/experimental/is_detected
7
8#ifndef BOOST_MATH_TOOLS_IS_DETECTED_HPP
9#define BOOST_MATH_TOOLS_IS_DETECTED_HPP
10
11#include <type_traits>
12
13namespace boost { namespace math { namespace tools {
14
15template <typename...>
16using void_t = void;
17
18namespace detail {
19
20template <typename Default, typename AlwaysVoid, template<typename...> class Op, typename... Args>
21struct detector
22{
23 using value_t = std::false_type;
24 using type = Default;
25};
26
27template <typename Default, template<typename...> class Op, typename... Args>
28struct detector<Default, void_t<Op<Args...>>, Op, Args...>
29{
30 using value_t = std::true_type;
31 using type = Op<Args...>;
32};
33
34} // Namespace detail
35
36// Special type to indicate detection failure
37struct nonesuch
38{
39 nonesuch() = delete;
40 ~nonesuch() = delete;
41 nonesuch(const nonesuch&) = delete;
42 void operator=(const nonesuch&) = delete;
43};
44
45template <template<typename...> class Op, typename... Args>
46using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
47
48template <template<typename...> class Op, typename... Args>
49using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;
50
51template <typename Default, template<typename...> class Op, typename... Args>
52using detected_or = detail::detector<Default, void, Op, Args...>;
53
54}}} // Namespaces boost math tools
55
56#endif // BOOST_MATH_TOOLS_IS_DETECTED_HPP