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