xref: /llvm-project/libcxx/include/__cstddef/byte.h (revision f8350f13020a27e7aa74fd4ab7919503c24771ca)
1d6832a61SLouis Dionne //===---------------------------------------------------------------------===//
2d6832a61SLouis Dionne //
3d6832a61SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d6832a61SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5d6832a61SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d6832a61SLouis Dionne //
7d6832a61SLouis Dionne //===---------------------------------------------------------------------===//
8d6832a61SLouis Dionne 
9d6832a61SLouis Dionne #ifndef _LIBCPP___CSTDDEF_BYTE_H
10d6832a61SLouis Dionne #define _LIBCPP___CSTDDEF_BYTE_H
11d6832a61SLouis Dionne 
12d6832a61SLouis Dionne #include <__config>
13*f8350f13SLouis Dionne #include <__fwd/byte.h>
14d6832a61SLouis Dionne #include <__type_traits/enable_if.h>
15d6832a61SLouis Dionne #include <__type_traits/is_integral.h>
16d6832a61SLouis Dionne 
17d6832a61SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18d6832a61SLouis Dionne #  pragma GCC system_header
19d6832a61SLouis Dionne #endif
20d6832a61SLouis Dionne 
21d6832a61SLouis Dionne #if _LIBCPP_STD_VER >= 17
22d6832a61SLouis Dionne namespace std { // purposefully not versioned
23d6832a61SLouis Dionne 
24d6832a61SLouis Dionne enum class byte : unsigned char {};
25d6832a61SLouis Dionne 
26d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte operator|(byte __lhs, byte __rhs) noexcept {
27d6832a61SLouis Dionne   return static_cast<byte>(
28d6832a61SLouis Dionne       static_cast<unsigned char>(static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs)));
29d6832a61SLouis Dionne }
30d6832a61SLouis Dionne 
31d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept {
32d6832a61SLouis Dionne   return __lhs = __lhs | __rhs;
33d6832a61SLouis Dionne }
34d6832a61SLouis Dionne 
35d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte operator&(byte __lhs, byte __rhs) noexcept {
36d6832a61SLouis Dionne   return static_cast<byte>(
37d6832a61SLouis Dionne       static_cast<unsigned char>(static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs)));
38d6832a61SLouis Dionne }
39d6832a61SLouis Dionne 
40d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept {
41d6832a61SLouis Dionne   return __lhs = __lhs & __rhs;
42d6832a61SLouis Dionne }
43d6832a61SLouis Dionne 
44d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte operator^(byte __lhs, byte __rhs) noexcept {
45d6832a61SLouis Dionne   return static_cast<byte>(
46d6832a61SLouis Dionne       static_cast<unsigned char>(static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs)));
47d6832a61SLouis Dionne }
48d6832a61SLouis Dionne 
49d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept {
50d6832a61SLouis Dionne   return __lhs = __lhs ^ __rhs;
51d6832a61SLouis Dionne }
52d6832a61SLouis Dionne 
53d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline constexpr byte operator~(byte __b) noexcept {
54d6832a61SLouis Dionne   return static_cast<byte>(static_cast<unsigned char>(~static_cast<unsigned int>(__b)));
55d6832a61SLouis Dionne }
56d6832a61SLouis Dionne 
57d6832a61SLouis Dionne template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
58d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr byte& operator<<=(byte& __lhs, _Integer __shift) noexcept {
59d6832a61SLouis Dionne   return __lhs = __lhs << __shift;
60d6832a61SLouis Dionne }
61d6832a61SLouis Dionne 
62d6832a61SLouis Dionne template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
63d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr byte operator<<(byte __lhs, _Integer __shift) noexcept {
64d6832a61SLouis Dionne   return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift));
65d6832a61SLouis Dionne }
66d6832a61SLouis Dionne 
67d6832a61SLouis Dionne template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
68d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr byte& operator>>=(byte& __lhs, _Integer __shift) noexcept {
69d6832a61SLouis Dionne   return __lhs = __lhs >> __shift;
70d6832a61SLouis Dionne }
71d6832a61SLouis Dionne 
72d6832a61SLouis Dionne template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
73d6832a61SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr byte operator>>(byte __lhs, _Integer __shift) noexcept {
74d6832a61SLouis Dionne   return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift));
75d6832a61SLouis Dionne }
76d6832a61SLouis Dionne 
77d6832a61SLouis Dionne template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
78d6832a61SLouis Dionne [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Integer to_integer(byte __b) noexcept {
79d6832a61SLouis Dionne   return static_cast<_Integer>(__b);
80d6832a61SLouis Dionne }
81d6832a61SLouis Dionne 
82d6832a61SLouis Dionne } // namespace std
83d6832a61SLouis Dionne #endif // _LIBCPP_STD_VER >= 17
84d6832a61SLouis Dionne 
85d6832a61SLouis Dionne #endif // _LIBCPP___CSTDDEF_BYTE_H
86