Blame view

3rdparty/boost_1_81_0/boost/hana/detail/concepts.hpp 2.96 KB
63e88f80   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  /*!
  @file
  Defines concepts from the Standard library.
  
  Copyright Louis Dionne 2013-2022
  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_CONCEPTS_HPP
  #define BOOST_HANA_DETAIL_CONCEPTS_HPP
  
  #include <boost/hana/config.hpp>
  #include <boost/hana/detail/std_common_type.hpp>
  #include <boost/hana/detail/void_t.hpp>
  
  #include <type_traits>
  
  
  namespace boost { namespace hana { namespace detail {
      //! @cond
      //////////////////////////////////////////////////////////////////////////
      // EqualityComparable
      //////////////////////////////////////////////////////////////////////////
      template <typename T, typename U = T, typename = void>
      struct EqualityComparable : std::false_type { };
  
      template <typename T>
      struct EqualityComparable<T, T, detail::void_t<
          decltype(static_cast<T&&>(*(T*)0) == static_cast<T&&>(*(T*)0) ? 0:0),
          decltype(static_cast<T&&>(*(T*)0) != static_cast<T&&>(*(T*)0) ? 0:0)
      >> : std::true_type { };
  
      template <typename T, typename U>
      struct EqualityComparable<T, U, typename std::enable_if<
          !std::is_same<T, U>::value, detail::void_t<
              decltype(static_cast<T&&>(*(T*)0) == static_cast<U&&>(*(U*)0) ? 0:0),
              decltype(static_cast<U&&>(*(U*)0) == static_cast<T&&>(*(T*)0) ? 0:0),
              decltype(static_cast<T&&>(*(T*)0) != static_cast<U&&>(*(U*)0) ? 0:0),
              decltype(static_cast<U&&>(*(U*)0) != static_cast<T&&>(*(T*)0) ? 0:0),
              typename detail::std_common_type<T, U>::type
      >>::type> : std::integral_constant<bool,
          EqualityComparable<T>::value &&
          EqualityComparable<U>::value &&
          EqualityComparable<typename detail::std_common_type<T, U>::type>::value
      > { };
  
  
      //////////////////////////////////////////////////////////////////////////
      // LessThanComparable
      //////////////////////////////////////////////////////////////////////////
      template <typename T, typename U = T, typename = void>
      struct LessThanComparable : std::false_type { };
  
      template <typename T>
      struct LessThanComparable<T, T, detail::void_t<
          decltype(static_cast<T&&>(*(T*)0) < static_cast<T&&>(*(T*)0) ? 0:0)
      >> : std::true_type { };
  
      template <typename T, typename U>
      struct LessThanComparable<T, U, std::enable_if_t<
          !std::is_same<T, U>::value,
          detail::void_t<
              decltype(static_cast<T&&>(*(T*)0) < static_cast<U&&>(*(U*)0) ? 0:0),
              decltype(static_cast<U&&>(*(U*)0) < static_cast<T&&>(*(T*)0) ? 0:0),
              typename detail::std_common_type<T, U>::type
          >
      >>
          : std::integral_constant<bool,
              LessThanComparable<T>::value &&
              LessThanComparable<U>::value &&
              LessThanComparable<typename detail::std_common_type<T, U>::type>::value
          >
      { };
      //! @endcond
  } }} // end namespace boost::hana
  
  #endif // !BOOST_HANA_DETAIL_CONCEPTS_HPP