xref: /aosp_15_r20/external/llvm-libc/src/__support/CPP/type_traits/is_integral.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- is_integral type_traits ---------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H
9 #define LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H
10 
11 #include "src/__support/CPP/type_traits/is_same.h"
12 #include "src/__support/CPP/type_traits/remove_cv.h"
13 #include "src/__support/macros/attributes.h"
14 #include "src/__support/macros/config.h"
15 #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128
16 
17 namespace LIBC_NAMESPACE_DECL {
18 namespace cpp {
19 
20 // is_integral
21 template <typename T> struct is_integral {
22 private:
23   template <typename Head, typename... Args>
__is_unqualified_any_ofis_integral24   LIBC_INLINE_VAR static constexpr bool __is_unqualified_any_of() {
25     return (... || is_same_v<remove_cv_t<Head>, Args>);
26   }
27 
28 public:
29   LIBC_INLINE_VAR static constexpr bool value = __is_unqualified_any_of<
30       T,
31 #ifdef LIBC_TYPES_HAS_INT128
32       __int128_t, __uint128_t,
33 #endif
34       char, signed char, unsigned char, short, unsigned short, int,
35       unsigned int, long, unsigned long, long long, unsigned long long, bool>();
36 };
37 template <typename T>
38 LIBC_INLINE_VAR constexpr bool is_integral_v = is_integral<T>::value;
39 
40 } // namespace cpp
41 } // namespace LIBC_NAMESPACE_DECL
42 
43 #endif // LLVM_LIBC_SRC___SUPPORT_CPP_TYPE_TRAITS_IS_INTEGRAL_H
44