[cfe-commits] [libcxx] r119541 - in /libcxx/trunk: include/__tuple include/tuple test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp

Howard Hinnant hhinnant at apple.com
Wed Nov 17 11:22:43 PST 2010


Author: hhinnant
Date: Wed Nov 17 13:22:43 2010
New Revision: 119541

URL: http://llvm.org/viewvc/llvm-project?rev=119541&view=rev
Log:
LWG 1118

Modified:
    libcxx/trunk/include/__tuple
    libcxx/trunk/include/tuple
    libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp
    libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp

Modified: libcxx/trunk/include/__tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__tuple?rev=119541&r1=119540&r2=119541&view=diff
==============================================================================
--- libcxx/trunk/include/__tuple (original)
+++ libcxx/trunk/include/__tuple Wed Nov 17 13:22:43 2010
@@ -26,8 +26,42 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template <class _Tp> class _LIBCPP_VISIBLE tuple_size;
+
+template <class _Tp>
+class _LIBCPP_VISIBLE tuple_size<const _Tp>
+    : public tuple_size<_Tp> {};
+
+template <class _Tp>
+class _LIBCPP_VISIBLE tuple_size<volatile _Tp>
+    : public tuple_size<_Tp> {};
+
+template <class _Tp>
+class _LIBCPP_VISIBLE tuple_size<const volatile _Tp>
+    : public tuple_size<_Tp> {};
+
 template <size_t _Ip, class _Tp> class _LIBCPP_VISIBLE tuple_element;
 
+template <size_t _Ip, class _Tp>
+class _LIBCPP_VISIBLE tuple_element<_Ip, const _Tp>
+{
+public:
+    typedef typename add_const<typename tuple_element<_Ip, _Tp>::type>::type type;
+};
+
+template <size_t _Ip, class _Tp>
+class _LIBCPP_VISIBLE tuple_element<_Ip, volatile _Tp>
+{
+public:
+    typedef typename add_volatile<typename tuple_element<_Ip, _Tp>::type>::type type;
+};
+
+template <size_t _Ip, class _Tp>
+class _LIBCPP_VISIBLE tuple_element<_Ip, const volatile _Tp>
+{
+public:
+    typedef typename add_cv<typename tuple_element<_Ip, _Tp>::type>::type type;
+};
+
 template <class ..._Tp> class _LIBCPP_VISIBLE tuple;
 template <class _T1, class _T2> class _LIBCPP_VISIBLE pair;
 template <class _Tp, size_t _Size> struct _LIBCPP_VISIBLE array;

Modified: libcxx/trunk/include/tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/tuple?rev=119541&r1=119540&r2=119541&view=diff
==============================================================================
--- libcxx/trunk/include/tuple (original)
+++ libcxx/trunk/include/tuple Wed Nov 17 13:22:43 2010
@@ -127,12 +127,6 @@
 {
 };
 
-template <class ..._Tp>
-class _LIBCPP_VISIBLE tuple_size<const tuple<_Tp...>>
-    : public integral_constant<size_t, sizeof...(_Tp)>
-{
-};
-
 // tuple_element
 
 template <size_t _Ip, class ..._Tp>
@@ -142,13 +136,6 @@
     typedef typename tuple_element<_Ip, __tuple_types<_Tp...>>::type type;
 };
 
-template <size_t _Ip, class ..._Tp>
-class _LIBCPP_VISIBLE tuple_element<_Ip, const tuple<_Tp...>>
-{
-public:
-    typedef const typename tuple_element<_Ip, __tuple_types<_Tp...>>::type type;
-};
-
 // __tuple_leaf
 
 template <size_t _Ip, class _Hp, bool=is_empty<_Hp>::value>

Modified: libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp?rev=119541&r1=119540&r2=119541&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp (original)
+++ libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_element.pass.cpp Wed Nov 17 13:22:43 2010
@@ -21,27 +21,20 @@
 #include <tuple>
 #include <type_traits>
 
+template <class T, std::size_t N, class U>
+void test()
+{
+    static_assert((std::is_same<typename std::tuple_element<N, T>::type, U>::value), "");
+    static_assert((std::is_same<typename std::tuple_element<N, const T>::type, const U>::value), "");
+    static_assert((std::is_same<typename std::tuple_element<N, volatile T>::type, volatile U>::value), "");
+    static_assert((std::is_same<typename std::tuple_element<N, const volatile T>::type, const volatile U>::value), "");
+}
 int main()
 {
-    {
-        typedef std::tuple<int> T;
-        static_assert((std::is_same<std::tuple_element<0, T>::type,
-                                    int>::value), "");
-    }
-    {
-        typedef std::tuple<char, int> T;
-        static_assert((std::is_same<std::tuple_element<0, T>::type,
-                                    char>::value), "");
-        static_assert((std::is_same<std::tuple_element<1, T>::type,
-                                    int>::value), "");
-    }
-    {
-        typedef std::tuple<int*, char, int> T;
-        static_assert((std::is_same<std::tuple_element<0, T>::type,
-                                    int*>::value), "");
-        static_assert((std::is_same<std::tuple_element<1, T>::type,
-                                    char>::value), "");
-        static_assert((std::is_same<std::tuple_element<2, T>::type,
-                                    int>::value), "");
-    }
+    test<std::tuple<int>, 0, int>();
+    test<std::tuple<char, int>, 0, char>();
+    test<std::tuple<char, int>, 1, int>();
+    test<std::tuple<int*, char, int>, 0, int*>();
+    test<std::tuple<int*, char, int>, 1, char>();
+    test<std::tuple<int*, char, int>, 2, int>();
 }

Modified: libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp?rev=119541&r1=119540&r2=119541&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp (original)
+++ libcxx/trunk/test/utilities/tuple/tuple.tuple/tuple.helper/tuple_size.pass.cpp Wed Nov 17 13:22:43 2010
@@ -18,26 +18,23 @@
 #include <tuple>
 #include <type_traits>
 
+template <class T, std::size_t N>
+void test()
+{
+    static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+                                   std::tuple_size<T> >::value), "");
+    static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+                                   std::tuple_size<const T> >::value), "");
+    static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+                                   std::tuple_size<volatile T> >::value), "");
+    static_assert((std::is_base_of<std::integral_constant<std::size_t, N>,
+                                   std::tuple_size<const volatile T> >::value), "");
+}
+
 int main()
 {
-    {
-        typedef std::tuple<> T;
-        static_assert((std::is_base_of<std::integral_constant<std::size_t, 0>,
-                                      std::tuple_size<T> >::value), "");
-    }
-    {
-        typedef std::tuple<int> T;
-        static_assert((std::is_base_of<std::integral_constant<std::size_t, 1>,
-                                      std::tuple_size<T> >::value), "");
-    }
-    {
-        typedef std::tuple<char, int> T;
-        static_assert((std::is_base_of<std::integral_constant<std::size_t, 2>,
-                                      std::tuple_size<T> >::value), "");
-    }
-    {
-        typedef std::tuple<char, char*, int> T;
-        static_assert((std::is_base_of<std::integral_constant<std::size_t, 3>,
-                                      std::tuple_size<T> >::value), "");
-    }
+    test<std::tuple<>, 0>();
+    test<std::tuple<int>, 1>();
+    test<std::tuple<char, int>, 2>();
+    test<std::tuple<char, char*, int>, 3>();
 }





More information about the cfe-commits mailing list