Phi
is_complete.hpp
1 #ifndef INCG_PHI_CORE_TYPE_TRAITS_IS_COMPLETE_HPP
2 #define INCG_PHI_CORE_TYPE_TRAITS_IS_COMPLETE_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 #include "phi/compiler_support/intrinsics/is_complete.hpp"
13 #include "phi/type_traits/integral_constant.hpp"
14 
15 #if PHI_SUPPORTS_IS_COMPLETE() && 0
16 
17 DETAIL_PHI_BEGIN_NAMESPACE()
18 
19 template <typename TypeT>
20 struct is_complete : public integral_constant<bool, PHI_IS_COMPLETE(TypeT)>
21 {};
22 
23 template <typename TypeT>
24 struct is_not_complete : public integral_constant<bool, !PHI_IS_COMPLETE(TypeT)>
25 {};
26 
27 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE()
28 
29 template <typename TypeT>
30 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_complete_v = PHI_IS_COMPLETE(TypeT);
31 
32 template <typename TypeT>
33 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_not_complete_v = !PHI_IS_COMPLETE(TypeT);
34 
35 # endif
36 
37 #else
38 
39 # include "phi/compiler_support/warning.hpp"
40 # include "phi/core/declval.hpp"
41 # include "phi/type_traits/detail/yes_no_type.hpp"
42 # include "phi/type_traits/is_function.hpp"
43 # include "phi/type_traits/is_rvalue_reference.hpp"
44 # include "phi/type_traits/remove_reference.hpp"
45 
46 DETAIL_PHI_BEGIN_NAMESPACE()
47 
48 PHI_CLANG_SUPPRESS_WARNING_PUSH()
49 PHI_CLANG_SUPPRESS_WARNING("-Wzero-as-null-pointer-constant")
50 
51 namespace detail
52 {
53  template <typename TypeT>
55  {
56  template <typename OtherT, typename = decltype(sizeof(declval<OtherT>()))>
57  static yes_type check(OtherT*);
58 
59  template <typename OtherT>
60  static no_type check(...);
61 
62  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
63  static PHI_CONSTEXPR_AND_CONST bool value =
64  sizeof(check<TypeT>(nullptr)) == sizeof_yes_type;
65  };
66 } // namespace detail
67 
68 PHI_CLANG_SUPPRESS_WARNING_POP()
69 
70 template <typename TypeT>
72  : public integral_constant<bool, is_function<typename remove_reference<TypeT>::type>::value ||
73  is_rvalue_reference<TypeT>::value ||
74  detail::is_complete_imp<TypeT>::value>
75 {};
76 
77 template <typename TypeT>
78 struct is_complete<TypeT&> : public is_complete<TypeT>
79 {};
80 
81 template <typename TypeT>
82 struct is_not_complete : public integral_constant<bool, !is_complete<TypeT>::value>
83 {};
84 
85 # if PHI_HAS_FEATURE_VARIABLE_TEMPLATE()
86 
87 template <typename TypeT>
88 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_complete_v = is_complete<TypeT>::value;
89 
90 template <typename TypeT>
91 PHI_INLINE_VARIABLE PHI_CONSTEXPR bool is_not_complete_v = is_not_complete<TypeT>::value;
92 
93 # endif
94 
95 #endif
96 
97 DETAIL_PHI_END_NAMESPACE()
98 
99 #endif // INCG_PHI_CORE_TYPE_TRAITS_IS_COMPLETE_HPP
Definition: integral_constant.hpp:19
Definition: yes_no_type.hpp:32
Definition: is_complete.hpp:71
Definition: swap.hpp:23
Definition: is_complete.hpp:54
Definition: yes_no_type.hpp:23
Definition: is_complete.hpp:82