Author: marshall Date: Wed Aug 1 18:56:02 2018 New Revision: 338666 URL: http://llvm.org/viewvc/llvm-project?rev=338666&view=rev Log: Implement P0887: The identity metafunction
Added: libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp Modified: libcxx/trunk/include/type_traits Modified: libcxx/trunk/include/type_traits URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=338666&r1=338665&r2=338666&view=diff ============================================================================== --- libcxx/trunk/include/type_traits (original) +++ libcxx/trunk/include/type_traits Wed Aug 1 18:56:02 2018 @@ -75,6 +75,10 @@ namespace std template <class T> struct remove_pointer; template <class T> struct add_pointer; + template<class T> struct type_identity; // C++20 + template<class T> + using type_identity_t = typename type_identity<T>::type; // C++20 + // Integral properties: template <class T> struct is_signed; template <class T> struct is_unsigned; @@ -1226,6 +1230,12 @@ template <class _Tp> struct _LIBCPP_TEMP template <class _Tp> using add_pointer_t = typename add_pointer<_Tp>::type; #endif +// type_identity +#if _LIBCPP_STD_VER > 17 +template<class _Tp> struct type_identity { typedef _Tp type; }; +template<class _Tp> using type_identity_t = typename type_identity<_Tp>::type; +#endif + // is_signed template <class _Tp, bool = is_integral<_Tp>::value> Added: libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp?rev=338666&view=auto ============================================================================== --- libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp (added) +++ libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp Wed Aug 1 18:56:02 2018 @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 + +// type_traits + +// type_identity + +#include <type_traits> + +#include "test_macros.h" + +template <class T> +void test_type_identity() +{ + static_assert((std::is_same<typename std::type_identity<T>::type, T>::value), ""); + static_assert((std::is_same< std::type_identity_t<T>, T>::value), ""); +} + +int main() +{ + test_type_identity<void>(); + test_type_identity<int>(); + test_type_identity<const volatile int>(); + test_type_identity<int*>(); + test_type_identity< int[3]>(); + test_type_identity<const int[3]>(); + + test_type_identity<void (*)()>(); + test_type_identity<int(int) const>(); + test_type_identity<int(int) volatile>(); + test_type_identity<int(int) &>(); + test_type_identity<int(int) &&>(); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits