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