Implement P0887: The identity metafunction
authorMarshall Clow <mclow.lists@gmail.com>
Thu, 2 Aug 2018 01:56:02 +0000 (01:56 +0000)
committerMarshall Clow <mclow.lists@gmail.com>
Thu, 2 Aug 2018 01:56:02 +0000 (01:56 +0000)
llvm-svn: 338666

libcxx/include/type_traits
libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp [new file with mode: 0644]

index 30bfb16..e413d26 100644 (file)
@@ -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_TEMPLATE_VIS add_pointer
 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>
diff --git a/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp b/libcxx/test/std/utilities/meta/meta.trans/meta.trans.other/type_identity.pass.cpp
new file mode 100644 (file)
index 0000000..0799866
--- /dev/null
@@ -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) &&>();
+}