mirror of
https://github.com/ziglang/zig.git
synced 2026-01-21 06:45:24 +00:00
libcxx: backport llvm/llvm-project#155786
https://github.com/llvm/llvm-project/pull/155786
This commit is contained in:
parent
10ea69912f
commit
bc58b5dc53
@ -21,6 +21,7 @@
|
||||
#include <__type_traits/is_enum.h>
|
||||
#include <__type_traits/is_floating_point.h>
|
||||
#include <__type_traits/is_integral.h>
|
||||
#include <__type_traits/is_unqualified.h>
|
||||
#include <__type_traits/underlying_type.h>
|
||||
#include <__utility/pair.h>
|
||||
#include <__utility/swap.h>
|
||||
@ -355,7 +356,8 @@ struct __hash_impl {
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_enum<_Tp>::value> > : __unary_function<_Tp, size_t> {
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_enum<_Tp>::value && __is_unqualified_v<_Tp> > >
|
||||
: __unary_function<_Tp, size_t> {
|
||||
_LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
|
||||
using type = __underlying_type_t<_Tp>;
|
||||
return hash<type>()(static_cast<type>(__v));
|
||||
@ -363,17 +365,21 @@ struct __hash_impl<_Tp, __enable_if_t<is_enum<_Tp>::value> > : __unary_function<
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_integral<_Tp>::value && (sizeof(_Tp) <= sizeof(size_t))> >
|
||||
struct __hash_impl<
|
||||
_Tp,
|
||||
__enable_if_t<is_integral<_Tp>::value && __is_unqualified_v<_Tp> && (sizeof(_Tp) <= sizeof(size_t))> >
|
||||
: __unary_function<_Tp, size_t> {
|
||||
_LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT { return static_cast<size_t>(__v); }
|
||||
};
|
||||
|
||||
template <class _Tp>
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_integral<_Tp>::value && (sizeof(_Tp) > sizeof(size_t))> >
|
||||
struct __hash_impl<_Tp,
|
||||
__enable_if_t<is_integral<_Tp>::value && __is_unqualified_v<_Tp> && (sizeof(_Tp) > sizeof(size_t))> >
|
||||
: __scalar_hash<_Tp> {};
|
||||
|
||||
template <class _Tp>
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_floating_point<_Tp>::value> > : __scalar_hash<_Tp> {
|
||||
struct __hash_impl<_Tp, __enable_if_t<is_floating_point<_Tp>::value && __is_unqualified_v<_Tp> > >
|
||||
: __scalar_hash<_Tp> {
|
||||
_LIBCPP_HIDE_FROM_ABI size_t operator()(_Tp __v) const _NOEXCEPT {
|
||||
// -0.0 and 0.0 should return same hash
|
||||
if (__v == 0.0f)
|
||||
|
||||
25
lib/libcxx/include/__type_traits/is_unqualified.h
Normal file
25
lib/libcxx/include/__type_traits/is_unqualified.h
Normal file
@ -0,0 +1,25 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef _LIBCPP___TYPE_TRAITS_IS_UNQUALIFIED_H
|
||||
#define _LIBCPP___TYPE_TRAITS_IS_UNQUALIFIED_H
|
||||
|
||||
#include <__config>
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
# pragma GCC system_header
|
||||
#endif
|
||||
|
||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||
|
||||
template <class _Tp>
|
||||
inline const bool __is_unqualified_v = __is_same(_Tp, __remove_cvref(_Tp));
|
||||
|
||||
_LIBCPP_END_NAMESPACE_STD
|
||||
|
||||
#endif // _LIBCPP___TYPE_TRAITS_IS_UNQUALIFIED_H
|
||||
Loading…
x
Reference in New Issue
Block a user