1// -*- C++ -*-
2//===----------------------------------------------------------------------===//
3//
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
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_CSTDDEF
11#define _LIBCPP_CSTDDEF
12
13/*
14 cstddef synopsis
15
16Macros:
17
18 offsetof(type,member-designator)
19 NULL
20
21namespace std
22{
23
24Types:
25
26 ptrdiff_t
27 size_t
28 max_align_t // C++11
29 nullptr_t
30 byte // C++17
31
32} // std
33
34*/
35
36#include <__config>
37#include <__type_traits/enable_if.h>
38#include <__type_traits/integral_constant.h>
39#include <__type_traits/is_integral.h>
40#include <version>
41
42#include <stddef.h>
43
44#ifndef _LIBCPP_STDDEF_H
45# error <cstddef> tried including <stddef.h> but didn't find libc++'s <stddef.h> header. \
46 This usually means that your header search paths are not configured properly. \
47 The header search paths should contain the C++ Standard Library headers before \
48 any C Standard Library, and you are probably using compiler flags that make that \
49 not be the case.
50#endif
51
52#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
53# pragma GCC system_header
54#endif
55
56_LIBCPP_BEGIN_NAMESPACE_STD
57
58using ::nullptr_t;
59using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
60using ::size_t _LIBCPP_USING_IF_EXISTS;
61
62#if !defined(_LIBCPP_CXX03_LANG)
63using ::max_align_t _LIBCPP_USING_IF_EXISTS;
64#endif
65
66_LIBCPP_END_NAMESPACE_STD
67
68#if _LIBCPP_STD_VER >= 17
69namespace std // purposefully not versioned
70{
71enum class byte : unsigned char {};
72
73_LIBCPP_HIDE_FROM_ABI inline constexpr byte operator|(byte __lhs, byte __rhs) noexcept {
74 return static_cast<byte>(
75 static_cast<unsigned char>(static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs)));
76}
77
78_LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept {
79 return __lhs = __lhs | __rhs;
80}
81
82_LIBCPP_HIDE_FROM_ABI inline constexpr byte operator&(byte __lhs, byte __rhs) noexcept {
83 return static_cast<byte>(
84 static_cast<unsigned char>(static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs)));
85}
86
87_LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept {
88 return __lhs = __lhs & __rhs;
89}
90
91_LIBCPP_HIDE_FROM_ABI inline constexpr byte operator^(byte __lhs, byte __rhs) noexcept {
92 return static_cast<byte>(
93 static_cast<unsigned char>(static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs)));
94}
95
96_LIBCPP_HIDE_FROM_ABI inline constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept {
97 return __lhs = __lhs ^ __rhs;
98}
99
100_LIBCPP_HIDE_FROM_ABI inline constexpr byte operator~(byte __b) noexcept {
101 return static_cast<byte>(static_cast<unsigned char>(~static_cast<unsigned int>(__b)));
102}
103
104template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
105_LIBCPP_HIDE_FROM_ABI constexpr byte& operator<<=(byte& __lhs, _Integer __shift) noexcept {
106 return __lhs = __lhs << __shift;
107}
108
109template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
110_LIBCPP_HIDE_FROM_ABI constexpr byte operator<<(byte __lhs, _Integer __shift) noexcept {
111 return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift));
112}
113
114template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
115_LIBCPP_HIDE_FROM_ABI constexpr byte& operator>>=(byte& __lhs, _Integer __shift) noexcept {
116 return __lhs = __lhs >> __shift;
117}
118
119template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
120_LIBCPP_HIDE_FROM_ABI constexpr byte operator>>(byte __lhs, _Integer __shift) noexcept {
121 return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift));
122}
123
124template <class _Integer, __enable_if_t<is_integral<_Integer>::value, int> = 0>
125[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Integer to_integer(byte __b) noexcept {
126 return static_cast<_Integer>(__b);
127}
128
129} // namespace std
130
131#endif
132
133#endif // _LIBCPP_CSTDDEF
134