xref: /openbsd-src/gnu/llvm/libcxx/include/cstddef (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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