146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_CSTDDEF 1146035553Spatrick#define _LIBCPP_CSTDDEF 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick cstddef synopsis 1546035553Spatrick 1646035553SpatrickMacros: 1746035553Spatrick 1846035553Spatrick offsetof(type,member-designator) 1946035553Spatrick NULL 2046035553Spatrick 2146035553Spatricknamespace std 2246035553Spatrick{ 2346035553Spatrick 2446035553SpatrickTypes: 2546035553Spatrick 2646035553Spatrick ptrdiff_t 2746035553Spatrick size_t 28037e7968Spatrick max_align_t // C++11 2946035553Spatrick nullptr_t 3046035553Spatrick byte // C++17 3146035553Spatrick 3246035553Spatrick} // std 3346035553Spatrick 3446035553Spatrick*/ 3546035553Spatrick 36*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 3746035553Spatrick#include <__config> 38*4bdff4beSrobert#include <__type_traits/enable_if.h> 39*4bdff4beSrobert#include <__type_traits/integral_constant.h> 40*4bdff4beSrobert#include <__type_traits/is_integral.h> 4146035553Spatrick#include <version> 4246035553Spatrick 43*4bdff4beSrobert#include <stddef.h> 44*4bdff4beSrobert 45*4bdff4beSrobert#ifndef _LIBCPP_STDDEF_H 46*4bdff4beSrobert# error <cstddef> tried including <stddef.h> but didn't find libc++'s <stddef.h> header. \ 47*4bdff4beSrobert This usually means that your header search paths are not configured properly. \ 48*4bdff4beSrobert The header search paths should contain the C++ Standard Library headers before \ 49*4bdff4beSrobert any C Standard Library, and you are probably using compiler flags that make that \ 50*4bdff4beSrobert not be the case. 51*4bdff4beSrobert#endif 52*4bdff4beSrobert 5346035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 5446035553Spatrick# pragma GCC system_header 5546035553Spatrick#endif 5646035553Spatrick 5746035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 5846035553Spatrick 59*4bdff4beSrobertusing ::nullptr_t; 6076d0caaeSpatrickusing ::ptrdiff_t _LIBCPP_USING_IF_EXISTS; 6176d0caaeSpatrickusing ::size_t _LIBCPP_USING_IF_EXISTS; 6246035553Spatrick 63037e7968Spatrick#if !defined(_LIBCPP_CXX03_LANG) 6476d0caaeSpatrickusing ::max_align_t _LIBCPP_USING_IF_EXISTS; 65037e7968Spatrick#endif 66037e7968Spatrick 6746035553Spatrick_LIBCPP_END_NAMESPACE_STD 6846035553Spatrick 6946035553Spatrick#if _LIBCPP_STD_VER > 14 7046035553Spatricknamespace std // purposefully not versioned 7146035553Spatrick{ 7246035553Spatrickenum class byte : unsigned char {}; 7346035553Spatrick 74*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte operator| (byte __lhs, byte __rhs) noexcept 7546035553Spatrick{ 7646035553Spatrick return static_cast<byte>( 7746035553Spatrick static_cast<unsigned char>( 7846035553Spatrick static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs) 7946035553Spatrick )); 8046035553Spatrick} 8146035553Spatrick 82*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept 8346035553Spatrick{ return __lhs = __lhs | __rhs; } 8446035553Spatrick 85*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte operator& (byte __lhs, byte __rhs) noexcept 8646035553Spatrick{ 8746035553Spatrick return static_cast<byte>( 8846035553Spatrick static_cast<unsigned char>( 8946035553Spatrick static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs) 9046035553Spatrick )); 9146035553Spatrick} 9246035553Spatrick 93*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept 9446035553Spatrick{ return __lhs = __lhs & __rhs; } 9546035553Spatrick 96*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte operator^ (byte __lhs, byte __rhs) noexcept 9746035553Spatrick{ 9846035553Spatrick return static_cast<byte>( 9946035553Spatrick static_cast<unsigned char>( 10046035553Spatrick static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs) 10146035553Spatrick )); 10246035553Spatrick} 10346035553Spatrick 104*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept 10546035553Spatrick{ return __lhs = __lhs ^ __rhs; } 10646035553Spatrick 107*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr byte operator~ (byte __b) noexcept 10846035553Spatrick{ 10946035553Spatrick return static_cast<byte>( 11046035553Spatrick static_cast<unsigned char>( 11146035553Spatrick ~static_cast<unsigned int>(__b) 11246035553Spatrick )); 11346035553Spatrick} 114*4bdff4beSrobert 115*4bdff4beSroberttemplate <class _Tp> 116*4bdff4beSrobertusing _EnableByteOverload = __enable_if_t<is_integral<_Tp>::value, byte>; 117*4bdff4beSrobert 118037e7968Spatricktemplate <class _Integer> 119*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & 120037e7968Spatrick operator<<=(byte& __lhs, _Integer __shift) noexcept 121037e7968Spatrick { return __lhs = __lhs << __shift; } 12246035553Spatrick 123037e7968Spatricktemplate <class _Integer> 124*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> 125037e7968Spatrick operator<< (byte __lhs, _Integer __shift) noexcept 126037e7968Spatrick { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); } 127037e7968Spatrick 128037e7968Spatricktemplate <class _Integer> 129*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & 130037e7968Spatrick operator>>=(byte& __lhs, _Integer __shift) noexcept 131037e7968Spatrick { return __lhs = __lhs >> __shift; } 132037e7968Spatrick 133037e7968Spatricktemplate <class _Integer> 134*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> 135037e7968Spatrick operator>> (byte __lhs, _Integer __shift) noexcept 136037e7968Spatrick { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); } 137037e7968Spatrick 138037e7968Spatricktemplate <class _Integer, class = _EnableByteOverload<_Integer> > 139*4bdff4beSrobert_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr _Integer 140037e7968Spatrick to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); } 141*4bdff4beSrobert 142*4bdff4beSrobert} // namespace std 14346035553Spatrick 14446035553Spatrick#endif 14546035553Spatrick 14646035553Spatrick#endif // _LIBCPP_CSTDDEF 147