1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef _LIBCPP___TYPE_TRAITS_REMOVE_CVREF_H
10 #define _LIBCPP___TYPE_TRAITS_REMOVE_CVREF_H
11 
12 #include <__config>
13 #include <__type_traits/is_same.h>
14 #include <__type_traits/remove_cv.h>
15 #include <__type_traits/remove_reference.h>
16 
17 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18 #  pragma GCC system_header
19 #endif
20 
21 _LIBCPP_BEGIN_NAMESPACE_STD
22 
23 #if __has_builtin(__remove_cvref) && !defined(_LIBCPP_COMPILER_GCC)
24 template <class _Tp>
25 using __remove_cvref_t _LIBCPP_NODEBUG = __remove_cvref(_Tp);
26 #else
27 template <class _Tp>
28 using __remove_cvref_t _LIBCPP_NODEBUG = __remove_cv_t<__libcpp_remove_reference_t<_Tp> >;
29 #endif // __has_builtin(__remove_cvref)
30 
31 template <class _Tp, class _Up>
32 struct __is_same_uncvref : _IsSame<__remove_cvref_t<_Tp>, __remove_cvref_t<_Up> > {};
33 
34 #if _LIBCPP_STD_VER >= 20
35 template <class _Tp>
36 struct remove_cvref {
37   using type _LIBCPP_NODEBUG = __remove_cvref_t<_Tp>;
38 };
39 
40 template <class _Tp>
41 using remove_cvref_t = __remove_cvref_t<_Tp>;
42 #endif
43 
44 _LIBCPP_END_NAMESPACE_STD
45 
46 #endif // _LIBCPP___TYPE_TRAITS_REMOVE_CVREF_H
47