[libcxx] r245806 - Recommit rL245802: Cleanup fancy pointer rebinding in list using __rebind_pointer.
Eric Fiselier via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 22 19:56:06 PDT 2015
Author: ericwf
Date: Sat Aug 22 21:56:05 2015
New Revision: 245806
URL: http://llvm.org/viewvc/llvm-project?rev=245806&view=rev
Log:
Recommit rL245802: Cleanup fancy pointer rebinding in list using __rebind_pointer.
Currently we need an #ifdef branch every time we use pointer traits to rebind a pointer because
it is done differently in C++11 and C++03. This patch introduces the __rebind_pointer utility to
clean this up.
Also add a test that list and it's iterators can be instantiated with incomplete element types.
Added:
libcxx/trunk/test/std/containers/sequences/list/incomplete_type.pass.cpp
Modified:
libcxx/trunk/include/list
libcxx/trunk/include/memory
Modified: libcxx/trunk/include/list
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/list?rev=245806&r1=245805&r2=245806&view=diff
==============================================================================
--- libcxx/trunk/include/list (original)
+++ libcxx/trunk/include/list Sat Aug 22 21:56:05 2015
@@ -191,19 +191,10 @@ template <class _Tp, class _VoidPtr> str
template <class _Tp, class _VoidPtr>
struct __list_node_base
{
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__list_node<_Tp, _VoidPtr> > pointer;
-#else
- rebind<__list_node<_Tp, _VoidPtr> >::other pointer;
-#endif
-
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__list_node_base> __base_pointer;
-#else
- rebind<__list_node_base>::other __base_pointer;
-#endif
+ typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
+ pointer;
+ typedef typename __rebind_pointer<_VoidPtr, __list_node_base>::type
+ __base_pointer;
pointer __prev_;
pointer __next_;
@@ -232,12 +223,8 @@ template <class _Tp, class _VoidPtr> cla
template <class _Tp, class _VoidPtr>
class _LIBCPP_TYPE_VIS_ONLY __list_iterator
{
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
-#else
- rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
-#endif
+ typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
+ __node_pointer;
__node_pointer __ptr_;
@@ -262,13 +249,7 @@ public:
typedef bidirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef value_type& reference;
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<value_type>
-#else
- rebind<value_type>::other
-#endif
- pointer;
+ typedef typename __rebind_pointer<_VoidPtr, value_type>::type pointer;
typedef typename pointer_traits<pointer>::difference_type difference_type;
_LIBCPP_INLINE_VISIBILITY
@@ -365,12 +346,8 @@ public:
template <class _Tp, class _VoidPtr>
class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator
{
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
-#else
- rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
-#endif
+ typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
+ __node_pointer;
__node_pointer __ptr_;
@@ -392,13 +369,7 @@ public:
typedef bidirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef const value_type& reference;
- typedef typename pointer_traits<_VoidPtr>::template
-#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
- rebind<const value_type>
-#else
- rebind<const value_type>::other
-#endif
- pointer;
+ typedef typename __rebind_pointer<_VoidPtr, const value_type>::type pointer;
typedef typename pointer_traits<pointer>::difference_type difference_type;
_LIBCPP_INLINE_VISIBILITY
Modified: libcxx/trunk/include/memory
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/memory?rev=245806&r1=245805&r2=245806&view=diff
==============================================================================
--- libcxx/trunk/include/memory (original)
+++ libcxx/trunk/include/memory Sat Aug 22 21:56:05 2015
@@ -932,6 +932,15 @@ public:
{return _VSTD::addressof(__r);}
};
+template <class _From, class _To>
+struct __rebind_pointer {
+#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+ typedef typename pointer_traits<_From>::template rebind<_To> type;
+#else
+ typedef typename pointer_traits<_From>::template rebind<_To>::other type;
+#endif
+};
+
// allocator_traits
namespace __has_pointer_type_imp
Added: libcxx/trunk/test/std/containers/sequences/list/incomplete_type.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/incomplete_type.pass.cpp?rev=245806&view=auto
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/list/incomplete_type.pass.cpp (added)
+++ libcxx/trunk/test/std/containers/sequences/list/incomplete_type.pass.cpp Sat Aug 22 21:56:05 2015
@@ -0,0 +1,27 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+// <list>
+
+// Check that std::list and it's iterators can be instantiated with an incomplete
+// type.
+
+#include <list>
+
+struct A {
+ std::list<A> l;
+ std::list<A>::iterator it;
+ std::list<A>::const_iterator cit;
+ std::list<A>::reverse_iterator rit;
+ std::list<A>::const_reverse_iterator crit;
+};
+
+int main() {
+ A a;
+}
More information about the cfe-commits
mailing list