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
10namespace v8 {
11namespace internal {
12
13// Conjunction metafunction.
14template <class... Args>
15struct conjunction;
16
17template <>
18struct conjunction<> : std::true_type {};
19
20template <class T>
21struct conjunction<T> : T {};
22
23template <class T, class... Args>
24struct conjunction<T, Args...>
25 : std::conditional<T::value, conjunction<Args...>, T>::type {};
26
27// Disjunction metafunction.
28template <class... Args>
29struct disjunction;
30
31template <>
32struct disjunction<> : std::true_type {};
33
34template <class T>
35struct disjunction<T> : T {};
36
37template <class T, class... Args>
38struct disjunction<T, Args...>
39 : std::conditional<T::value, T, disjunction<Args...>>::type {};
40
41// Negation metafunction.
42template <class T>
43struct negation : std::integral_constant<bool, !T::value> {};
44
45} // namespace internal
46} // namespace v8
47
48#endif // V8_TYPE_TRAITS_H_
49