xref: /freebsd/contrib/llvm-project/libcxx/include/cstddef (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_CSTDDEF
110b57cec5SDimitry Andric#define _LIBCPP_CSTDDEF
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    cstddef synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry AndricMacros:
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric    offsetof(type,member-designator)
190b57cec5SDimitry Andric    NULL
200b57cec5SDimitry Andric
210b57cec5SDimitry Andricnamespace std
220b57cec5SDimitry Andric{
230b57cec5SDimitry Andric
240b57cec5SDimitry AndricTypes:
250b57cec5SDimitry Andric
260b57cec5SDimitry Andric    ptrdiff_t
270b57cec5SDimitry Andric    size_t
285ffd83dbSDimitry Andric    max_align_t // C++11
290b57cec5SDimitry Andric    nullptr_t
300b57cec5SDimitry Andric    byte // C++17
310b57cec5SDimitry Andric
320b57cec5SDimitry Andric}  // std
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric*/
350b57cec5SDimitry Andric
36*81ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
370b57cec5SDimitry Andric#include <__config>
38*81ad6265SDimitry Andric#include <__type_traits/enable_if.h>
39*81ad6265SDimitry Andric#include <__type_traits/integral_constant.h>
40*81ad6265SDimitry Andric#include <__type_traits/is_integral.h>
41*81ad6265SDimitry Andric#include <stddef.h>
420b57cec5SDimitry Andric#include <version>
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
450b57cec5SDimitry Andric#  pragma GCC system_header
460b57cec5SDimitry Andric#endif
470b57cec5SDimitry Andric
480b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
490b57cec5SDimitry Andric
50*81ad6265SDimitry Andricusing ::nullptr_t;
51fe6060f1SDimitry Andricusing ::ptrdiff_t _LIBCPP_USING_IF_EXISTS;
52fe6060f1SDimitry Andricusing ::size_t _LIBCPP_USING_IF_EXISTS;
530b57cec5SDimitry Andric
545ffd83dbSDimitry Andric#if !defined(_LIBCPP_CXX03_LANG)
55fe6060f1SDimitry Andricusing ::max_align_t _LIBCPP_USING_IF_EXISTS;
565ffd83dbSDimitry Andric#endif
575ffd83dbSDimitry Andric
580b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
590b57cec5SDimitry Andric
600b57cec5SDimitry Andric#if _LIBCPP_STD_VER > 14
610b57cec5SDimitry Andricnamespace std  // purposefully not versioned
620b57cec5SDimitry Andric{
630b57cec5SDimitry Andricenum class byte : unsigned char {};
640b57cec5SDimitry Andric
650b57cec5SDimitry Andricconstexpr byte  operator| (byte  __lhs, byte __rhs) noexcept
660b57cec5SDimitry Andric{
670b57cec5SDimitry Andric    return static_cast<byte>(
680b57cec5SDimitry Andric      static_cast<unsigned char>(
690b57cec5SDimitry Andric         static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs)
700b57cec5SDimitry Andric    ));
710b57cec5SDimitry Andric}
720b57cec5SDimitry Andric
730b57cec5SDimitry Andricconstexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept
740b57cec5SDimitry Andric{ return __lhs = __lhs | __rhs; }
750b57cec5SDimitry Andric
760b57cec5SDimitry Andricconstexpr byte  operator& (byte  __lhs, byte __rhs) noexcept
770b57cec5SDimitry Andric{
780b57cec5SDimitry Andric    return static_cast<byte>(
790b57cec5SDimitry Andric      static_cast<unsigned char>(
800b57cec5SDimitry Andric         static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs)
810b57cec5SDimitry Andric    ));
820b57cec5SDimitry Andric}
830b57cec5SDimitry Andric
840b57cec5SDimitry Andricconstexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept
850b57cec5SDimitry Andric{ return __lhs = __lhs & __rhs; }
860b57cec5SDimitry Andric
870b57cec5SDimitry Andricconstexpr byte  operator^ (byte  __lhs, byte __rhs) noexcept
880b57cec5SDimitry Andric{
890b57cec5SDimitry Andric    return static_cast<byte>(
900b57cec5SDimitry Andric      static_cast<unsigned char>(
910b57cec5SDimitry Andric         static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs)
920b57cec5SDimitry Andric    ));
930b57cec5SDimitry Andric}
940b57cec5SDimitry Andric
950b57cec5SDimitry Andricconstexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept
960b57cec5SDimitry Andric{ return __lhs = __lhs ^ __rhs; }
970b57cec5SDimitry Andric
980b57cec5SDimitry Andricconstexpr byte  operator~ (byte __b) noexcept
990b57cec5SDimitry Andric{
1000b57cec5SDimitry Andric    return static_cast<byte>(
1010b57cec5SDimitry Andric      static_cast<unsigned char>(
1020b57cec5SDimitry Andric        ~static_cast<unsigned int>(__b)
1030b57cec5SDimitry Andric    ));
1040b57cec5SDimitry Andric}
105*81ad6265SDimitry Andric
106*81ad6265SDimitry Andrictemplate <class _Tp>
107*81ad6265SDimitry Andricusing _EnableByteOverload = __enable_if_t<is_integral<_Tp>::value, byte>;
108*81ad6265SDimitry Andric
1095ffd83dbSDimitry Andrictemplate <class _Integer>
1105ffd83dbSDimitry Andric  constexpr _EnableByteOverload<_Integer> &
1115ffd83dbSDimitry Andric  operator<<=(byte& __lhs, _Integer __shift) noexcept
1125ffd83dbSDimitry Andric  { return __lhs = __lhs << __shift; }
1130b57cec5SDimitry Andric
1145ffd83dbSDimitry Andrictemplate <class _Integer>
1155ffd83dbSDimitry Andric  constexpr _EnableByteOverload<_Integer>
1165ffd83dbSDimitry Andric  operator<< (byte  __lhs, _Integer __shift) noexcept
1175ffd83dbSDimitry Andric  { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); }
1185ffd83dbSDimitry Andric
1195ffd83dbSDimitry Andrictemplate <class _Integer>
1205ffd83dbSDimitry Andric  constexpr _EnableByteOverload<_Integer> &
1215ffd83dbSDimitry Andric  operator>>=(byte& __lhs, _Integer __shift) noexcept
1225ffd83dbSDimitry Andric  { return __lhs = __lhs >> __shift; }
1235ffd83dbSDimitry Andric
1245ffd83dbSDimitry Andrictemplate <class _Integer>
1255ffd83dbSDimitry Andric  constexpr _EnableByteOverload<_Integer>
1265ffd83dbSDimitry Andric  operator>> (byte  __lhs, _Integer __shift) noexcept
1275ffd83dbSDimitry Andric  { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); }
1285ffd83dbSDimitry Andric
1295ffd83dbSDimitry Andrictemplate <class _Integer, class = _EnableByteOverload<_Integer> >
130fe6060f1SDimitry Andric  _LIBCPP_NODISCARD_EXT constexpr _Integer
1315ffd83dbSDimitry Andric  to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); }
1321fd87a68SDimitry Andric
1331fd87a68SDimitry Andric} // namespace std
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andric#endif
1360b57cec5SDimitry Andric
1370b57cec5SDimitry Andric#endif // _LIBCPP_CSTDDEF
138