From c546fb9d147af028d3a129755b421e94fec671ff Mon Sep 17 00:00:00 2001
From: "Duncan P. N. Exon Smith" <dexonsmith@apple.com>
Date: Wed, 29 Jul 2015 11:18:31 -0700
Subject: [PATCH 1/2] algorithm: Refactor __buffered_inplace_merge(), NFC

Split out a common version of `__buffered_inplace_merge()` with the
ranges already reversed (if necessary).  Thusly, share the logic for
copying to the temporary buffer, enabling a future commit to bring back
an old optimization there.
---
 include/algorithm | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/include/algorithm b/include/algorithm
index 7b0c53e..efd9d09 100644
--- a/include/algorithm
+++ b/include/algorithm
@@ -4389,6 +4389,19 @@ void __half_inplace_merge(_InputIterator1 __first1, _InputIterator1 __last1,
     // __first2 through __last2 are already in the right spot.
 }
 
+template <class _Compare, class _ForwardIterator>
+void
+__buffered_inplace_merge(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
+                _Compare __comp, typename iterator_traits<_ForwardIterator>::value_type* __buff,
+                __destruct_n &__d)
+{
+    typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
+    value_type* __p = __buff;
+    for (_ForwardIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
+        ::new(__p) value_type(_VSTD::move(*__i));
+    __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
+}
+
 template <class _Compare, class _BidirectionalIterator>
 void
 __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
@@ -4401,21 +4414,14 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator
     unique_ptr<value_type, __destruct_n&> __h2(__buff, __d);
     if (__len1 <= __len2)
     {
-        value_type* __p = __buff;
-        for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), (void) ++__i, ++__p)
-            ::new(__p) value_type(_VSTD::move(*__i));
-        __half_inplace_merge(__buff, __p, __middle, __last, __first, __comp);
+        __buffered_inplace_merge(__first, __middle, __last, __comp, __buff,
+                                 __d);
     }
     else
     {
-        value_type* __p = __buff;
-        for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), (void) ++__i, ++__p)
-            ::new(__p) value_type(_VSTD::move(*__i));
         typedef reverse_iterator<_BidirectionalIterator> _RBi;
-        typedef reverse_iterator<value_type*> _Rv;
-        __half_inplace_merge(_Rv(__p), _Rv(__buff), 
-                             _RBi(__middle), _RBi(__first),
-                             _RBi(__last), __negate<_Compare>(__comp));
+        __buffered_inplace_merge(_RBi(__last), _RBi(__middle), _RBi(__first),
+                                 __negate<_Compare>(__comp), __buff, __d);
     }
 }
 
-- 
2.3.8 (Apple Git-58)

