1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===--------------------------- cstddef ----------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_CSTDDEF 11*4d6fc14bSjoerg#define _LIBCPP_CSTDDEF 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg cstddef synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergMacros: 17*4d6fc14bSjoerg 18*4d6fc14bSjoerg offsetof(type,member-designator) 19*4d6fc14bSjoerg NULL 20*4d6fc14bSjoerg 21*4d6fc14bSjoergnamespace std 22*4d6fc14bSjoerg{ 23*4d6fc14bSjoerg 24*4d6fc14bSjoergTypes: 25*4d6fc14bSjoerg 26*4d6fc14bSjoerg ptrdiff_t 27*4d6fc14bSjoerg size_t 28*4d6fc14bSjoerg max_align_t // C++11 29*4d6fc14bSjoerg nullptr_t 30*4d6fc14bSjoerg byte // C++17 31*4d6fc14bSjoerg 32*4d6fc14bSjoerg} // std 33*4d6fc14bSjoerg 34*4d6fc14bSjoerg*/ 35*4d6fc14bSjoerg 36*4d6fc14bSjoerg#include <__config> 37*4d6fc14bSjoerg#include <version> 38*4d6fc14bSjoerg 39*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 40*4d6fc14bSjoerg#pragma GCC system_header 41*4d6fc14bSjoerg#endif 42*4d6fc14bSjoerg 43*4d6fc14bSjoerg// Don't include our own <stddef.h>; we don't want to declare ::nullptr_t. 44*4d6fc14bSjoerg#include_next <stddef.h> 45*4d6fc14bSjoerg#include <__nullptr> 46*4d6fc14bSjoerg 47*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 48*4d6fc14bSjoerg 49*4d6fc14bSjoergusing ::ptrdiff_t; 50*4d6fc14bSjoergusing ::size_t; 51*4d6fc14bSjoerg 52*4d6fc14bSjoerg#if !defined(_LIBCPP_CXX03_LANG) 53*4d6fc14bSjoergusing ::max_align_t; 54*4d6fc14bSjoerg#endif 55*4d6fc14bSjoerg 56*4d6fc14bSjoergtemplate <class _Tp> struct __libcpp_is_integral { enum { value = 0 }; }; 57*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<bool> { enum { value = 1 }; }; 58*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<char> { enum { value = 1 }; }; 59*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<signed char> { enum { value = 1 }; }; 60*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<unsigned char> { enum { value = 1 }; }; 61*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<wchar_t> { enum { value = 1 }; }; 62*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_CHAR8_T 63*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<char8_t> { enum { value = 1 }; }; 64*4d6fc14bSjoerg#endif 65*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS 66*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<char16_t> { enum { value = 1 }; }; 67*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<char32_t> { enum { value = 1 }; }; 68*4d6fc14bSjoerg#endif // _LIBCPP_HAS_NO_UNICODE_CHARS 69*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<short> { enum { value = 1 }; }; 70*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<unsigned short> { enum { value = 1 }; }; 71*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<int> { enum { value = 1 }; }; 72*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<unsigned int> { enum { value = 1 }; }; 73*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<long> { enum { value = 1 }; }; 74*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<unsigned long> { enum { value = 1 }; }; 75*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<long long> { enum { value = 1 }; }; 76*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<unsigned long long> { enum { value = 1 }; }; 77*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_INT128 78*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<__int128_t> { enum { value = 1 }; }; 79*4d6fc14bSjoergtemplate <> struct __libcpp_is_integral<__uint128_t> { enum { value = 1 }; }; 80*4d6fc14bSjoerg#endif 81*4d6fc14bSjoerg 82*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 83*4d6fc14bSjoerg 84*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 14 85*4d6fc14bSjoergnamespace std // purposefully not versioned 86*4d6fc14bSjoerg{ 87*4d6fc14bSjoergenum class byte : unsigned char {}; 88*4d6fc14bSjoerg 89*4d6fc14bSjoerg 90*4d6fc14bSjoergtemplate <bool> struct __enable_if_integral_imp {}; 91*4d6fc14bSjoergtemplate <> struct __enable_if_integral_imp<true> { using type = byte; }; 92*4d6fc14bSjoergtemplate <class _Tp> using _EnableByteOverload = typename __enable_if_integral_imp<__libcpp_is_integral<_Tp>::value>::type; 93*4d6fc14bSjoerg 94*4d6fc14bSjoergconstexpr byte operator| (byte __lhs, byte __rhs) noexcept 95*4d6fc14bSjoerg{ 96*4d6fc14bSjoerg return static_cast<byte>( 97*4d6fc14bSjoerg static_cast<unsigned char>( 98*4d6fc14bSjoerg static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs) 99*4d6fc14bSjoerg )); 100*4d6fc14bSjoerg} 101*4d6fc14bSjoerg 102*4d6fc14bSjoergconstexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept 103*4d6fc14bSjoerg{ return __lhs = __lhs | __rhs; } 104*4d6fc14bSjoerg 105*4d6fc14bSjoergconstexpr byte operator& (byte __lhs, byte __rhs) noexcept 106*4d6fc14bSjoerg{ 107*4d6fc14bSjoerg return static_cast<byte>( 108*4d6fc14bSjoerg static_cast<unsigned char>( 109*4d6fc14bSjoerg static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs) 110*4d6fc14bSjoerg )); 111*4d6fc14bSjoerg} 112*4d6fc14bSjoerg 113*4d6fc14bSjoergconstexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept 114*4d6fc14bSjoerg{ return __lhs = __lhs & __rhs; } 115*4d6fc14bSjoerg 116*4d6fc14bSjoergconstexpr byte operator^ (byte __lhs, byte __rhs) noexcept 117*4d6fc14bSjoerg{ 118*4d6fc14bSjoerg return static_cast<byte>( 119*4d6fc14bSjoerg static_cast<unsigned char>( 120*4d6fc14bSjoerg static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs) 121*4d6fc14bSjoerg )); 122*4d6fc14bSjoerg} 123*4d6fc14bSjoerg 124*4d6fc14bSjoergconstexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept 125*4d6fc14bSjoerg{ return __lhs = __lhs ^ __rhs; } 126*4d6fc14bSjoerg 127*4d6fc14bSjoergconstexpr byte operator~ (byte __b) noexcept 128*4d6fc14bSjoerg{ 129*4d6fc14bSjoerg return static_cast<byte>( 130*4d6fc14bSjoerg static_cast<unsigned char>( 131*4d6fc14bSjoerg ~static_cast<unsigned int>(__b) 132*4d6fc14bSjoerg )); 133*4d6fc14bSjoerg} 134*4d6fc14bSjoergtemplate <class _Integer> 135*4d6fc14bSjoerg constexpr _EnableByteOverload<_Integer> & 136*4d6fc14bSjoerg operator<<=(byte& __lhs, _Integer __shift) noexcept 137*4d6fc14bSjoerg { return __lhs = __lhs << __shift; } 138*4d6fc14bSjoerg 139*4d6fc14bSjoergtemplate <class _Integer> 140*4d6fc14bSjoerg constexpr _EnableByteOverload<_Integer> 141*4d6fc14bSjoerg operator<< (byte __lhs, _Integer __shift) noexcept 142*4d6fc14bSjoerg { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); } 143*4d6fc14bSjoerg 144*4d6fc14bSjoergtemplate <class _Integer> 145*4d6fc14bSjoerg constexpr _EnableByteOverload<_Integer> & 146*4d6fc14bSjoerg operator>>=(byte& __lhs, _Integer __shift) noexcept 147*4d6fc14bSjoerg { return __lhs = __lhs >> __shift; } 148*4d6fc14bSjoerg 149*4d6fc14bSjoergtemplate <class _Integer> 150*4d6fc14bSjoerg constexpr _EnableByteOverload<_Integer> 151*4d6fc14bSjoerg operator>> (byte __lhs, _Integer __shift) noexcept 152*4d6fc14bSjoerg { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); } 153*4d6fc14bSjoerg 154*4d6fc14bSjoergtemplate <class _Integer, class = _EnableByteOverload<_Integer> > 155*4d6fc14bSjoerg _LIBCPP_NODISCARD_EXT constexpr _Integer 156*4d6fc14bSjoerg to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); } 157*4d6fc14bSjoerg} 158*4d6fc14bSjoerg 159*4d6fc14bSjoerg#endif 160*4d6fc14bSjoerg 161*4d6fc14bSjoerg#endif // _LIBCPP_CSTDDEF 162