diff options
Diffstat (limited to 'gnu/llvm/libcxx/include/cstddef')
-rw-r--r-- | gnu/llvm/libcxx/include/cstddef | 85 |
1 files changed, 35 insertions, 50 deletions
diff --git a/gnu/llvm/libcxx/include/cstddef b/gnu/llvm/libcxx/include/cstddef index 1b54e7b2e0d..e3c06691757 100644 --- a/gnu/llvm/libcxx/include/cstddef +++ b/gnu/llvm/libcxx/include/cstddef @@ -1,5 +1,5 @@ // -*- C++ -*- -//===--------------------------- cstddef ----------------------------------===// +//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -33,19 +33,30 @@ Types: */ +#include <__assert> // all public C++ headers provide the assertion handler #include <__config> +#include <__type_traits/enable_if.h> +#include <__type_traits/integral_constant.h> +#include <__type_traits/is_integral.h> #include <version> -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -#pragma GCC system_header +#include <stddef.h> + +#ifndef _LIBCPP_STDDEF_H +# error <cstddef> tried including <stddef.h> but didn't find libc++'s <stddef.h> header. \ + This usually means that your header search paths are not configured properly. \ + The header search paths should contain the C++ Standard Library headers before \ + any C Standard Library, and you are probably using compiler flags that make that \ + not be the case. #endif -// Don't include our own <stddef.h>; we don't want to declare ::nullptr_t. -#include_next <stddef.h> -#include <__nullptr> +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif _LIBCPP_BEGIN_NAMESPACE_STD +using ::nullptr_t; using ::ptrdiff_t _LIBCPP_USING_IF_EXISTS; using ::size_t _LIBCPP_USING_IF_EXISTS; @@ -53,32 +64,6 @@ using ::size_t _LIBCPP_USING_IF_EXISTS; using ::max_align_t _LIBCPP_USING_IF_EXISTS; #endif -template <class _Tp> struct __libcpp_is_integral { enum { value = 0 }; }; -template <> struct __libcpp_is_integral<bool> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<char> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<signed char> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<unsigned char> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<wchar_t> { enum { value = 1 }; }; -#ifndef _LIBCPP_HAS_NO_CHAR8_T -template <> struct __libcpp_is_integral<char8_t> { enum { value = 1 }; }; -#endif -#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS -template <> struct __libcpp_is_integral<char16_t> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<char32_t> { enum { value = 1 }; }; -#endif // _LIBCPP_HAS_NO_UNICODE_CHARS -template <> struct __libcpp_is_integral<short> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<unsigned short> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<int> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<unsigned int> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<long> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<unsigned long> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<long long> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<unsigned long long> { enum { value = 1 }; }; -#ifndef _LIBCPP_HAS_NO_INT128 -template <> struct __libcpp_is_integral<__int128_t> { enum { value = 1 }; }; -template <> struct __libcpp_is_integral<__uint128_t> { enum { value = 1 }; }; -#endif - _LIBCPP_END_NAMESPACE_STD #if _LIBCPP_STD_VER > 14 @@ -86,12 +71,7 @@ namespace std // purposefully not versioned { enum class byte : unsigned char {}; - -template <bool> struct __enable_if_integral_imp {}; -template <> struct __enable_if_integral_imp<true> { using type = byte; }; -template <class _Tp> using _EnableByteOverload = typename __enable_if_integral_imp<__libcpp_is_integral<_Tp>::value>::type; - -constexpr byte operator| (byte __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte operator| (byte __lhs, byte __rhs) noexcept { return static_cast<byte>( static_cast<unsigned char>( @@ -99,10 +79,10 @@ constexpr byte operator| (byte __lhs, byte __rhs) noexcept )); } -constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept { return __lhs = __lhs | __rhs; } -constexpr byte operator& (byte __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte operator& (byte __lhs, byte __rhs) noexcept { return static_cast<byte>( static_cast<unsigned char>( @@ -110,10 +90,10 @@ constexpr byte operator& (byte __lhs, byte __rhs) noexcept )); } -constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept { return __lhs = __lhs & __rhs; } -constexpr byte operator^ (byte __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte operator^ (byte __lhs, byte __rhs) noexcept { return static_cast<byte>( static_cast<unsigned char>( @@ -121,40 +101,45 @@ constexpr byte operator^ (byte __lhs, byte __rhs) noexcept )); } -constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept { return __lhs = __lhs ^ __rhs; } -constexpr byte operator~ (byte __b) noexcept +_LIBCPP_HIDE_FROM_ABI constexpr byte operator~ (byte __b) noexcept { return static_cast<byte>( static_cast<unsigned char>( ~static_cast<unsigned int>(__b) )); } + +template <class _Tp> +using _EnableByteOverload = __enable_if_t<is_integral<_Tp>::value, byte>; + template <class _Integer> - constexpr _EnableByteOverload<_Integer> & +_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & operator<<=(byte& __lhs, _Integer __shift) noexcept { return __lhs = __lhs << __shift; } template <class _Integer> - constexpr _EnableByteOverload<_Integer> +_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> operator<< (byte __lhs, _Integer __shift) noexcept { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); } template <class _Integer> - constexpr _EnableByteOverload<_Integer> & +_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> & operator>>=(byte& __lhs, _Integer __shift) noexcept { return __lhs = __lhs >> __shift; } template <class _Integer> - constexpr _EnableByteOverload<_Integer> +_LIBCPP_HIDE_FROM_ABI constexpr _EnableByteOverload<_Integer> operator>> (byte __lhs, _Integer __shift) noexcept { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); } template <class _Integer, class = _EnableByteOverload<_Integer> > - _LIBCPP_NODISCARD_EXT constexpr _Integer +_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr _Integer to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); } -} + +} // namespace std #endif |