[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