[libcxx-commits] [libcxx] r354891 - Implement P1357: Traits for [Un]bounded Arrays; adopted in Kona

Marshall Clow via libcxx-commits libcxx-commits at lists.llvm.org
Tue Feb 26 08:07:03 PST 2019


Author: marshall
Date: Tue Feb 26 08:07:03 2019
New Revision: 354891

URL: http://llvm.org/viewvc/llvm-project?rev=354891&view=rev
Log:
Implement P1357: Traits for [Un]bounded Arrays; adopted in Kona

Added:
    libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_bounded_array.pass.cpp
    libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_unbounded_array.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=354891&r1=354890&r2=354891&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Tue Feb 26 08:07:03 2019
@@ -90,6 +90,9 @@ namespace std
     template <class T> struct remove_extent;
     template <class T> struct remove_all_extents;
 
+    template <class T> struct is_bounded_array;                 // C++20
+    template <class T> struct is_unbounded_array;               // C++20
+
     // Member introspection:
     template <class T> struct is_pod;
     template <class T> struct is_trivial;
@@ -196,6 +199,12 @@ namespace std
     template <class T>
       using remove_all_extents_t = typename remove_all_extents<T>::type;  // C++14
 
+    template <class T>
+      inline constexpr bool is_bounded_array_v
+        = is_bounded_array<T>::value;                                     // C++20
+      inline constexpr bool is_unbounded_array_v
+        = is_unbounded_array<T>::value;                                   // C++20
+
     // pointer modifications:
     template <class T>
       using remove_pointer_t = typename remove_pointer<T>::type;  // C++14
@@ -1335,6 +1344,26 @@ template <class _Tp, size_t _Np> struct
 template <class _Tp> using remove_all_extents_t = typename remove_all_extents<_Tp>::type;
 #endif
 
+#if _LIBCPP_STD_VER > 17
+// is_bounded_array
+
+template <class>                 struct _LIBCPP_TEMPLATE_VIS is_bounded_array           : false_type {};
+template <class _Tp, size_t _Np> struct _LIBCPP_TEMPLATE_VIS is_bounded_array<_Tp[_Np]> : true_type {};
+
+template <class _Tp>
+_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR
+bool is_bounded_array_v  = is_bounded_array<_Tp>::value;
+
+// is_unbounded_array
+
+template <class>     struct _LIBCPP_TEMPLATE_VIS is_unbounded_array        : false_type {};
+template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_unbounded_array<_Tp[]> : true_type {};
+
+template <class _Tp>
+_LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR
+bool is_unbounded_array_v  = is_unbounded_array<_Tp>::value;
+#endif
+
 // decay
 
 template <class _Up, bool>

Added: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_bounded_array.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_bounded_array.pass.cpp?rev=354891&view=auto
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_bounded_array.pass.cpp (added)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_bounded_array.pass.cpp Tue Feb 26 08:07:03 2019
@@ -0,0 +1,71 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+
+// type_traits
+
+// is_bounded_array<T>
+// T is an array type of known bound ([dcl.array])
+
+#include <type_traits>
+
+template <class T, bool B>
+void test_array_imp()
+{
+	static_assert( B == std::is_bounded_array<T>::value, "" );
+	static_assert( B == std::is_bounded_array_v<T>, "" );
+}
+
+template <class T, bool B>
+void test_array()
+{
+    test_array_imp<T, B>();
+    test_array_imp<const T, B>();
+    test_array_imp<volatile T, B>();
+    test_array_imp<const volatile T, B>();
+}
+
+typedef char array[3];
+typedef char incomplete_array[];
+
+class incomplete_type;
+
+class Empty {};
+union Union {};
+
+class Abstract
+{
+    virtual ~Abstract() = 0;
+};
+
+enum Enum {zero, one};
+typedef void (*FunctionPtr)();
+
+int main(int, char**)
+{
+//	Non-array types
+	test_array<void,           false>();
+	test_array<std::nullptr_t, false>();
+	test_array<int,            false>();
+	test_array<double,         false>();
+	test_array<void *,         false>();
+	test_array<int &,          false>();
+	test_array<int &&,         false>();
+    test_array<Empty,          false>();
+    test_array<Union,          false>();
+    test_array<Abstract,       false>();
+    test_array<Enum,           false>();
+    test_array<FunctionPtr,    false>();
+
+//  Array types
+    test_array<array,             true>();
+    test_array<incomplete_array,  false>();
+    test_array<incomplete_type[], false>();
+
+  return 0;
+}

Added: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_unbounded_array.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_unbounded_array.pass.cpp?rev=354891&view=auto
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_unbounded_array.pass.cpp (added)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.comp/is_unbounded_array.pass.cpp Tue Feb 26 08:07:03 2019
@@ -0,0 +1,71 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+
+// type_traits
+
+// is_unbounded_array<T>
+// T is an array type of unknown bound ([dcl.array])
+
+#include <type_traits>
+
+template <class T, bool B>
+void test_array_imp()
+{
+    static_assert( B == std::is_unbounded_array<T>::value, "" );
+    static_assert( B == std::is_unbounded_array_v<T>, "" );
+}
+
+template <class T, bool B>
+void test_array()
+{
+    test_array_imp<T, B>();
+    test_array_imp<const T, B>();
+    test_array_imp<volatile T, B>();
+    test_array_imp<const volatile T, B>();
+}
+
+typedef char array[3];
+typedef char incomplete_array[];
+
+class incomplete_type;
+
+class Empty {};
+union Union {};
+
+class Abstract
+{
+    virtual ~Abstract() = 0;
+};
+
+enum Enum {zero, one};
+typedef void (*FunctionPtr)();
+
+int main(int, char**)
+{
+//  Non-array types
+    test_array<void,           false>();
+    test_array<std::nullptr_t, false>();
+    test_array<int,            false>();
+    test_array<double,         false>();
+    test_array<void *,         false>();
+    test_array<int &,          false>();
+    test_array<int &&,         false>();
+    test_array<Empty,          false>();
+    test_array<Union,          false>();
+    test_array<Abstract,       false>();
+    test_array<Enum,           false>();
+    test_array<FunctionPtr,    false>();
+    
+//  Array types
+    test_array<array,             false>();
+    test_array<incomplete_array,  true>();
+    test_array<incomplete_type[], true>();
+
+  return 0;
+}




More information about the libcxx-commits mailing list