| //===----------------------------------------------------------------------===// |
| // |
| // 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_MAKE_UNSIGNED_H |
| #define _LIBCPP___TYPE_TRAITS_MAKE_UNSIGNED_H |
| |
| #include <__config> |
| #include <__type_traits/apply_cv.h> |
| #include <__type_traits/conditional.h> |
| #include <__type_traits/is_enum.h> |
| #include <__type_traits/is_integral.h> |
| #include <__type_traits/is_unsigned.h> |
| #include <__type_traits/nat.h> |
| #include <__type_traits/remove_cv.h> |
| #include <__type_traits/type_list.h> |
| |
| #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
| # pragma GCC system_header |
| #endif |
| |
| _LIBCPP_BEGIN_NAMESPACE_STD |
| |
| typedef |
| __type_list<unsigned char, |
| __type_list<unsigned short, |
| __type_list<unsigned int, |
| __type_list<unsigned long, |
| __type_list<unsigned long long, |
| #ifndef _LIBCPP_HAS_NO_INT128 |
| __type_list<__uint128_t, |
| #endif |
| __nat |
| #ifndef _LIBCPP_HAS_NO_INT128 |
| > |
| #endif |
| > > > > > __unsigned_types; |
| |
| template <class _Tp, bool = is_integral<_Tp>::value || is_enum<_Tp>::value> |
| struct __make_unsigned {}; |
| |
| template <class _Tp> |
| struct __make_unsigned<_Tp, true> |
| { |
| typedef typename __find_first<__unsigned_types, sizeof(_Tp)>::type type; |
| }; |
| |
| template <> struct __make_unsigned<bool, true> {}; |
| template <> struct __make_unsigned< signed short, true> {typedef unsigned short type;}; |
| template <> struct __make_unsigned<unsigned short, true> {typedef unsigned short type;}; |
| template <> struct __make_unsigned< signed int, true> {typedef unsigned int type;}; |
| template <> struct __make_unsigned<unsigned int, true> {typedef unsigned int type;}; |
| template <> struct __make_unsigned< signed long, true> {typedef unsigned long type;}; |
| template <> struct __make_unsigned<unsigned long, true> {typedef unsigned long type;}; |
| template <> struct __make_unsigned< signed long long, true> {typedef unsigned long long type;}; |
| template <> struct __make_unsigned<unsigned long long, true> {typedef unsigned long long type;}; |
| #ifndef _LIBCPP_HAS_NO_INT128 |
| template <> struct __make_unsigned<__int128_t, true> {typedef __uint128_t type;}; |
| template <> struct __make_unsigned<__uint128_t, true> {typedef __uint128_t type;}; |
| #endif |
| |
| template <class _Tp> |
| struct _LIBCPP_TEMPLATE_VIS make_unsigned |
| { |
| typedef typename __apply_cv<_Tp, typename __make_unsigned<typename remove_cv<_Tp>::type>::type>::type type; |
| }; |
| |
| #if _LIBCPP_STD_VER > 11 |
| template <class _Tp> using make_unsigned_t = typename make_unsigned<_Tp>::type; |
| #endif |
| |
| #ifndef _LIBCPP_CXX03_LANG |
| template <class _Tp> |
| _LIBCPP_HIDE_FROM_ABI constexpr |
| typename make_unsigned<_Tp>::type __to_unsigned_like(_Tp __x) noexcept { |
| return static_cast<typename make_unsigned<_Tp>::type>(__x); |
| } |
| #endif |
| |
| template <class _Tp, class _Up> |
| using __copy_unsigned_t = __conditional_t<is_unsigned<_Tp>::value, typename make_unsigned<_Up>::type, _Up>; |
| |
| _LIBCPP_END_NAMESPACE_STD |
| |
| #endif // _LIBCPP___TYPE_TRAITS_MAKE_UNSIGNED_H |