Phi
is_nothrow_convertible.hpp
1 #ifndef INCG_PHI_CORE_TYPE_TRAITS_IS_NOTHROW_CONVERTIBLE_HPP
2 #define INCG_PHI_CORE_TYPE_TRAITS_IS_NOTHROW_CONVERTIBLE_HPP
3 
4 #include "phi/phi_config.hpp"
5 
6 #if PHI_HAS_EXTENSION_PRAGMA_ONCE()
7 # pragma once
8 #endif
9 
10 #include "phi/compiler_support/constexpr.hpp"
11 #include "phi/compiler_support/inline_variables.hpp"
12 
13 #if PHI_HAS_FEATURE_NOEXCEPT()
14 
15 # include "phi/compiler_support/warning.hpp"
16 # include "phi/core/declval.hpp"
17 # include "phi/type_traits/integral_constant.hpp"
18 # include "phi/type_traits/is_convertible.hpp"
19 # include "phi/type_traits/is_void.hpp"
20 
21 PHI_CLANG_SUPPRESS_WARNING_PUSH()
22 PHI_CLANG_SUPPRESS_WARNING("-Wunused-template")
23 
24 DETAIL_PHI_BEGIN_NAMESPACE()
25 
26 namespace detail
27 {
28  template <typename TypeT>
29  static void is_nothrow_convertible_test_noexcept(TypeT) noexcept;
30 
31  template <typename FromT, typename ToT>
32  static integral_constant<bool,
33  noexcept(is_nothrow_convertible_test_noexcept<ToT>(declval<FromT>()))>
34  is_nothrow_convertible_test();
35 
36  template <typename FromT, typename ToT>
37  struct is_nothrow_convertible_impl_3
38  : public decltype(is_nothrow_convertible_test<FromT, ToT>())
39  {};
40 
41  template <typename FromT, typename ToT, bool = is_convertible<FromT, ToT>::value>
42  struct is_nothrow_convertible_impl_2 : public is_nothrow_convertible_impl_3<FromT, ToT>
43  {};
44 
45  template <typename FromT, typename ToT>
46  struct is_nothrow_convertible_impl_2<FromT, ToT, false> : public false_type
47  {};
48 
49  template <typename FromT, typename ToT, bool = is_void<FromT>::value && is_void<ToT>::value>
50  struct is_nothrow_convertible_impl : public is_nothrow_convertible_impl_2<FromT, ToT>
51  {};
52 
53  template <typename FromT, typename ToT>
54  struct is_nothrow_convertible_impl<FromT, ToT, true> : public true_type
55  {};
56 
57 } // namespace detail
58 
59 PHI_CLANG_SUPPRESS_WARNING_POP()
60 
61 template <typename FromT, typename ToT>
62 struct is_nothrow_convertible : public detail::is_nothrow_convertible_impl<FromT, ToT>
63 {};
64 
65 template <typename FromT, typename ToT>
67  : public integral_constant<bool, !is_nothrow_convertible<FromT, ToT>::value>
68 {};
69 
70 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE()
71 
72 template <typename FromT, typename ToT>
73 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_nothrow_convertible_v =
75 
76 template <typename FromT, typename ToT>
77 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_not_nothrow_convertible_v =
79 
80 # endif
81 
82 #else
83 
84 # include "phi/type_traits/integral_constant.hpp"
85 
86 // No noexcept so always return true
87 
88 DETAIL_PHI_BEGIN_NAMESPACE()
89 
90 template <typename FromT, typename ToT>
92 {};
93 
94 template <typename FromT, typename ToT>
96 {};
97 
98 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE()
99 
100 template <typename FromT, typename ToT>
101 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_nothrow_convertible_v = true;
102 
103 template <typename FromT, typename ToT>
104 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_not_nothrow_convertible_v = false;
105 
106 # endif
107 
108 #endif
109 
110 DETAIL_PHI_END_NAMESPACE()
111 
112 #endif // INCG_PHI_CORE_TYPE_TRAITS_IS_NOTHROW_CONVERTIBLE_HPP
Definition: integral_constant.hpp:19
Definition: swap.hpp:23
Definition: is_nothrow_convertible.hpp:91
Definition: is_nothrow_convertible.hpp:95
Definition: is_void.hpp:17