1 | // Copyright 2019 the V8 project authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. |
4 | |
5 | #ifndef V8_TYPE_TRAITS_H_ |
6 | #define V8_TYPE_TRAITS_H_ |
7 | |
8 | #include <type_traits> |
9 | |
10 | namespace v8 { |
11 | namespace internal { |
12 | |
13 | // Conjunction metafunction. |
14 | template <class... Args> |
15 | struct conjunction; |
16 | |
17 | template <> |
18 | struct conjunction<> : std::true_type {}; |
19 | |
20 | template <class T> |
21 | struct conjunction<T> : T {}; |
22 | |
23 | template <class T, class... Args> |
24 | struct conjunction<T, Args...> |
25 | : std::conditional<T::value, conjunction<Args...>, T>::type {}; |
26 | |
27 | // Disjunction metafunction. |
28 | template <class... Args> |
29 | struct disjunction; |
30 | |
31 | template <> |
32 | struct disjunction<> : std::true_type {}; |
33 | |
34 | template <class T> |
35 | struct disjunction<T> : T {}; |
36 | |
37 | template <class T, class... Args> |
38 | struct disjunction<T, Args...> |
39 | : std::conditional<T::value, T, disjunction<Args...>>::type {}; |
40 | |
41 | // Negation metafunction. |
42 | template <class T> |
43 | struct negation : std::integral_constant<bool, !T::value> {}; |
44 | |
45 | } // namespace internal |
46 | } // namespace v8 |
47 | |
48 | #endif // V8_TYPE_TRAITS_H_ |
49 | |