• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_BASE_TYPE_TRAITS_H_
6 #define V8_BASE_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_BASE_TYPE_TRAITS_H_
49