Warning: This file is not a C or C++ file. It does not have highlighting.
1 | //===-- A self contained equivalent of cstddef ------------------*- 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 | |
9 | #ifndef LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H |
10 | #define LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H |
11 | |
12 | #include "src/__support/macros/attributes.h" |
13 | #include "src/__support/macros/config.h" |
14 | #include "type_traits.h" // For enable_if_t, is_integral_v. |
15 | |
16 | namespace LIBC_NAMESPACE_DECL { |
17 | namespace cpp { |
18 | |
19 | enum class byte : unsigned char {}; |
20 | |
21 | template <class IntegerType> |
22 | LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte> |
23 | operator>>(byte b, IntegerType shift) noexcept { |
24 | return static_cast<byte>(static_cast<unsigned char>(b) >> shift); |
25 | } |
26 | template <class IntegerType> |
27 | LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &> |
28 | operator>>=(byte &b, IntegerType shift) noexcept { |
29 | return b = b >> shift; |
30 | } |
31 | template <class IntegerType> |
32 | LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte> |
33 | operator<<(byte b, IntegerType shift) noexcept { |
34 | return static_cast<byte>(static_cast<unsigned char>(b) << shift); |
35 | } |
36 | template <class IntegerType> |
37 | LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, byte &> |
38 | operator<<=(byte &b, IntegerType shift) noexcept { |
39 | return b = b << shift; |
40 | } |
41 | LIBC_INLINE constexpr byte operator|(byte l, byte r) noexcept { |
42 | return static_cast<byte>(static_cast<unsigned char>(l) | |
43 | static_cast<unsigned char>(r)); |
44 | } |
45 | LIBC_INLINE constexpr byte &operator|=(byte &l, byte r) noexcept { |
46 | return l = l | r; |
47 | } |
48 | LIBC_INLINE constexpr byte operator&(byte l, byte r) noexcept { |
49 | return static_cast<byte>(static_cast<unsigned char>(l) & |
50 | static_cast<unsigned char>(r)); |
51 | } |
52 | LIBC_INLINE constexpr byte &operator&=(byte &l, byte r) noexcept { |
53 | return l = l & r; |
54 | } |
55 | LIBC_INLINE constexpr byte operator^(byte l, byte r) noexcept { |
56 | return static_cast<byte>(static_cast<unsigned char>(l) ^ |
57 | static_cast<unsigned char>(r)); |
58 | } |
59 | LIBC_INLINE constexpr byte &operator^=(byte &l, byte r) noexcept { |
60 | return l = l ^ r; |
61 | } |
62 | LIBC_INLINE constexpr byte operator~(byte b) noexcept { |
63 | return static_cast<byte>(~static_cast<unsigned char>(b)); |
64 | } |
65 | template <typename IntegerType> |
66 | LIBC_INLINE constexpr enable_if_t<is_integral_v<IntegerType>, IntegerType> |
67 | to_integer(byte b) noexcept { |
68 | return static_cast<IntegerType>(b); |
69 | } |
70 | |
71 | } // namespace cpp |
72 | } // namespace LIBC_NAMESPACE_DECL |
73 | |
74 | #endif // LLVM_LIBC_SRC___SUPPORT_CPP_CSTDDEF_H |
75 |
Warning: This file is not a C or C++ file. It does not have highlighting.