This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

miter_base simplification


On 30/04/2015 13:18, Jonathan Wakely wrote:
On 30/04/15 10:40 +0200, François Dumont wrote:
On 27/04/2015 13:55, Jonathan Wakely wrote:
(Alternatively, could the same simplification be made for
__miter_base? Do we need _Miter_base<> or just two overloads of
__miter_base()?)

Definitely, I already have a patch for that.

Great :-)

And here is the patch for this part.

I have implemented it in such a way that it will also remove several layers of move_iterator.

2015-05-04  François Dumont  <fdumont@gcc.gnu.org>

    * include/bits/cpp_type_traits.h
    (std::move_iterator): Delete declaration.
(std::__is_move_iterator<move_iterator>): Move partial specialization...
    * include/bits/stl_iterator.h: ... here.
    (std::__miter_base): Overloads for std::reverse_iterator and
    std::move_iterator.
    * include/bits/stl_algobase.h (std::__miter_base): Provide default
    implementation.

Tested under Linux x86_64.

Ok to commit ?

François

Index: include/bits/cpp_type_traits.h
===================================================================
--- include/bits/cpp_type_traits.h	(revision 222751)
+++ include/bits/cpp_type_traits.h	(working copy)
@@ -399,18 +399,6 @@
       typedef __false_type __type;
     };
 
-#if __cplusplus >= 201103L
-  template<typename _Iterator>
-    class move_iterator;
-
-  template<typename _Iterator>
-    struct __is_move_iterator< move_iterator<_Iterator> >
-    {
-      enum { __value = 1 };
-      typedef __true_type __type;
-    };
-#endif
-
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 
Index: include/bits/stl_algobase.h
===================================================================
--- include/bits/stl_algobase.h	(revision 222751)
+++ include/bits/stl_algobase.h	(working copy)
@@ -277,17 +277,11 @@
     __niter_base(_Iterator __it)
     { return __it; }
 
-  // If _Iterator is a move_iterator return its base otherwise return it
-  // untouched.  See copy, fill, ...
+  // Likewise for move_iterator.
   template<typename _Iterator>
-    struct _Miter_base
-    : _Iter_base<_Iterator, __is_move_iterator<_Iterator>::__value>
-    { };
-
-  template<typename _Iterator>
-    inline typename _Miter_base<_Iterator>::iterator_type
+    inline _Iterator
     __miter_base(_Iterator __it)
-    { return std::_Miter_base<_Iterator>::_S_base(__it); }
+    { return __it; }
 
   // All of these auxiliary structs serve two purposes.  (1) Replace
   // calls to copy with memmove whenever possible.  (Memmove, not memcpy,
Index: include/bits/stl_iterator.h
===================================================================
--- include/bits/stl_iterator.h	(revision 222751)
+++ include/bits/stl_iterator.h	(working copy)
@@ -414,6 +414,17 @@
     __niter_base(reverse_iterator<_Iterator> __it)
     -> decltype(__make_reverse_iterator(__niter_base(__it.base())))
     { return __make_reverse_iterator(__niter_base(__it.base())); }
+
+  template<typename _Iterator>
+    struct __is_move_iterator<reverse_iterator<_Iterator> >
+      : __is_move_iterator<_Iterator>
+    { };
+
+  template<typename _Iterator>
+    auto
+    __miter_base(reverse_iterator<_Iterator> __it)
+    -> decltype(__make_reverse_iterator(__miter_base(__it.base())))
+    { return __make_reverse_iterator(__miter_base(__it.base())); }
 #endif
 
   // 24.4.2.2.1 back_insert_iterator
@@ -1202,6 +1213,19 @@
     -> decltype(make_move_iterator(__niter_base(__it.base())))
     { return make_move_iterator(__niter_base(__it.base())); }
 
+  template<typename _Iterator>
+    struct __is_move_iterator<move_iterator<_Iterator> >
+    {
+      enum { __value = 1 };
+      typedef __true_type __type;
+    };
+
+  template<typename _Iterator>
+    auto
+    __miter_base(move_iterator<_Iterator> __it)
+    -> decltype(__miter_base(__it.base()))
+    { return __miter_base(__it.base()); }
+
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]