Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 1 | // -*- C++ -*- |
Louis Dionne | eb8650a | 2021-11-17 21:25:01 | [diff] [blame] | 2 | //===----------------------------------------------------------------------===// |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 3 | // |
Chandler Carruth | 57b08b0 | 2019-01-19 10:56:40 | [diff] [blame] | 4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 5 | // See https://llvm.org/LICENSE.txt for license information. |
| 6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #ifndef _LIBCPP_CSTDDEF |
| 11 | #define _LIBCPP_CSTDDEF |
| 12 | |
| 13 | /* |
| 14 | cstddef synopsis |
| 15 | |
| 16 | Macros: |
| 17 | |
| 18 | offsetof(type,member-designator) |
| 19 | NULL |
Howard Hinnant | b3371f6 | 2010-08-22 00:02:43 | [diff] [blame] | 20 | |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 21 | namespace std |
| 22 | { |
| 23 | |
| 24 | Types: |
| 25 | |
| 26 | ptrdiff_t |
| 27 | size_t |
Joerg Sonnenberger | 98f7782 | 2020-04-03 22:48:02 | [diff] [blame] | 28 | max_align_t // C++11 |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 29 | nullptr_t |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 30 | byte // C++17 |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 31 | |
| 32 | } // std |
| 33 | |
| 34 | */ |
| 35 | |
Louis Dionne | 385cc25 | 2022-03-25 16:55:36 | [diff] [blame] | 36 | #include <__assert> // all public C++ headers provide the assertion handler |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 37 | #include <__config> |
Nikolas Klauser | 7e69bd9 | 2022-05-28 13:22:25 | [diff] [blame] | 38 | #include <__type_traits/enable_if.h> |
| 39 | #include <__type_traits/integral_constant.h> |
Nikolas Klauser | eebc1fb | 2022-05-20 21:31:13 | [diff] [blame] | 40 | #include <__type_traits/is_integral.h> |
Marshall Clow | f56972e | 2018-09-12 19:41:40 | [diff] [blame] | 41 | #include <version> |
Howard Hinnant | 8ae5097 | 2010-06-02 18:53:22 | [diff] [blame] | 42 | |
Louis Dionne | 8cedff1 | 2022-08-08 21:03:56 | [diff] [blame^] | 43 | #include <stddef.h> |
| 44 | |
| 45 | #ifndef _LIBCPP_STDDEF_H |
| 46 | # error <cstddef> tried including <stddef.h> but didn't find libc++'s <stddef.h> header. \ |
| 47 | This usually means that your header search paths are not configured properly. \ |
| 48 | The header search paths should contain the C++ Standard Library headers before \ |
| 49 | any C Standard Library, and you are probably using compiler flags that make that \ |
| 50 | not be the case. |
| 51 | #endif |
| 52 | |
Howard Hinnant | 073458b | 2011-10-17 20:05:10 | [diff] [blame] | 53 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
Arthur O'Dwyer | fa6b9e4 | 2022-02-02 01:16:40 | [diff] [blame] | 54 | # pragma GCC system_header |
Howard Hinnant | 073458b | 2011-10-17 20:05:10 | [diff] [blame] | 55 | #endif |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 56 | |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 57 | _LIBCPP_BEGIN_NAMESPACE_STD |
| 58 | |
Louis Dionne | 157bbe6 | 2021-09-08 16:57:58 | [diff] [blame] | 59 | using ::nullptr_t; |
Louis Dionne | a9c9183 | 2021-06-02 14:41:37 | [diff] [blame] | 60 | using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS; |
| 61 | using ::size_t _LIBCPP_USING_IF_EXISTS; |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 62 | |
Joerg Sonnenberger | 98f7782 | 2020-04-03 22:48:02 | [diff] [blame] | 63 | #if !defined(_LIBCPP_CXX03_LANG) |
Louis Dionne | a9c9183 | 2021-06-02 14:41:37 | [diff] [blame] | 64 | using ::max_align_t _LIBCPP_USING_IF_EXISTS; |
Chandler Carruth | 265b83a | 2014-02-21 08:37:30 | [diff] [blame] | 65 | #endif |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 66 | |
Howard Hinnant | 3e51952 | 2010-05-11 19:42:16 | [diff] [blame] | 67 | _LIBCPP_END_NAMESPACE_STD |
| 68 | |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 69 | #if _LIBCPP_STD_VER > 14 |
| 70 | namespace std // purposefully not versioned |
| 71 | { |
| 72 | enum class byte : unsigned char {}; |
| 73 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 74 | _LIBCPP_HIDE_FROM_ABI constexpr byte operator| (byte __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 75 | { |
Louis Dionne | 7c3492b00 | 2018-08-03 22:36:53 | [diff] [blame] | 76 | return static_cast<byte>( |
| 77 | static_cast<unsigned char>( |
| 78 | static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs) |
| 79 | )); |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 80 | } |
| 81 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 82 | _LIBCPP_HIDE_FROM_ABI constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 83 | { return __lhs = __lhs | __rhs; } |
| 84 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 85 | _LIBCPP_HIDE_FROM_ABI constexpr byte operator& (byte __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 86 | { |
Louis Dionne | 7c3492b00 | 2018-08-03 22:36:53 | [diff] [blame] | 87 | return static_cast<byte>( |
| 88 | static_cast<unsigned char>( |
| 89 | static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs) |
| 90 | )); |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 91 | } |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 92 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 93 | _LIBCPP_HIDE_FROM_ABI constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 94 | { return __lhs = __lhs & __rhs; } |
| 95 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 96 | _LIBCPP_HIDE_FROM_ABI constexpr byte operator^ (byte __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 97 | { |
Louis Dionne | 7c3492b00 | 2018-08-03 22:36:53 | [diff] [blame] | 98 | return static_cast<byte>( |
| 99 | static_cast<unsigned char>( |
| 100 | static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs) |
| 101 | )); |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 102 | } |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 103 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 104 | _LIBCPP_HIDE_FROM_ABI constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 105 | { return __lhs = __lhs ^ __rhs; } |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 106 | |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 107 | _LIBCPP_HIDE_FROM_ABI constexpr byte operator~ (byte __b) noexcept |
Marshall Clow | 12de6e9 | 2017-11-14 01:14:53 | [diff] [blame] | 108 | { |
| 109 | return static_cast<byte>( |
| 110 | static_cast<unsigned char>( |
| 111 | ~static_cast<unsigned int>(__b) |
| 112 | )); |
| 113 | } |
Nikolas Klauser | 7e69bd9 | 2022-05-28 13:22:25 | [diff] [blame] | 114 | |
| 115 | template <class _Tp> |
| 116 | using _EnableByteOverload = __enable_if_t<is_integral<_Tp>::value, byte>; |
| 117 | |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 118 | template <class _Integer> |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 119 | _LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 120 | operator<<=(byte& __lhs, _Integer __shift) noexcept |
| 121 | { return __lhs = __lhs << __shift; } |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 122 | |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 123 | template <class _Integer> |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 124 | _LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 125 | operator<< (byte __lhs, _Integer __shift) noexcept |
| 126 | { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); } |
| 127 | |
| 128 | template <class _Integer> |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 129 | _LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 130 | operator>>=(byte& __lhs, _Integer __shift) noexcept |
| 131 | { return __lhs = __lhs >> __shift; } |
| 132 | |
| 133 | template <class _Integer> |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 134 | _LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 135 | operator>> (byte __lhs, _Integer __shift) noexcept |
| 136 | { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); } |
| 137 | |
| 138 | template <class _Integer, class = _EnableByteOverload<_Integer> > |
Nikolas Klauser | 80c7e93 | 2022-08-13 11:23:16 | [diff] [blame] | 139 | _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr _Integer |
Eric Fiselier | cccf1ef | 2020-02-14 16:34:46 | [diff] [blame] | 140 | to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); } |
Nikolas Klauser | 9c52a19 | 2022-02-01 17:11:49 | [diff] [blame] | 141 | |
| 142 | } // namespace std |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 143 | |
Marshall Clow | c97d8aa | 2017-03-24 05:45:39 | [diff] [blame] | 144 | #endif |
| 145 | |
Louis Dionne | 4cd6ca1 | 2021-04-20 16:03:32 | [diff] [blame] | 146 | #endif // _LIBCPP_CSTDDEF |