diff options
Diffstat (limited to 'boost/move/algo/detail/insertion_sort.hpp')
-rw-r--r-- | boost/move/algo/detail/insertion_sort.hpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/boost/move/algo/detail/insertion_sort.hpp b/boost/move/algo/detail/insertion_sort.hpp index 15df35d9d6..3328f75748 100644 --- a/boost/move/algo/detail/insertion_sort.hpp +++ b/boost/move/algo/detail/insertion_sort.hpp @@ -31,6 +31,7 @@ #include <boost/move/detail/destruct_n.hpp> #include <boost/move/algo/detail/basic_op.hpp> #include <boost/move/detail/placement_new.hpp> +#include <boost/move/detail/iterator_to_raw_pointer.hpp> namespace boost { namespace movelib{ @@ -91,30 +92,30 @@ void insertion_sort(BirdirectionalIterator first, BirdirectionalIterator last, C } } -template <class Compare, class BirdirectionalIterator> +template <class Compare, class BirdirectionalIterator, class BirdirectionalRawIterator> void insertion_sort_uninitialized_copy (BirdirectionalIterator first1, BirdirectionalIterator const last1 - , typename iterator_traits<BirdirectionalIterator>::value_type* const first2 + , BirdirectionalRawIterator const first2 , Compare comp) { typedef typename iterator_traits<BirdirectionalIterator>::value_type value_type; if (first1 != last1){ - value_type* last2 = first2; - ::new(last2, boost_move_new_t()) value_type(move(*first1)); - destruct_n<value_type> d(first2); + BirdirectionalRawIterator last2 = first2; + ::new((iterator_to_raw_pointer)(last2), boost_move_new_t()) value_type(move(*first1)); + destruct_n<value_type, BirdirectionalRawIterator> d(first2); d.incr(); for (++last2; ++first1 != last1; ++last2){ - value_type* j2 = last2; - value_type* k2 = j2; + BirdirectionalRawIterator j2 = last2; + BirdirectionalRawIterator k2 = j2; if (comp(*first1, *--k2)){ - ::new(j2, boost_move_new_t()) value_type(move(*k2)); + ::new((iterator_to_raw_pointer)(j2), boost_move_new_t()) value_type(move(*k2)); d.incr(); for (--j2; k2 != first2 && comp(*first1, *--k2); --j2) *j2 = move(*k2); *j2 = move(*first1); } else{ - ::new(j2, boost_move_new_t()) value_type(move(*first1)); + ::new((iterator_to_raw_pointer)(j2), boost_move_new_t()) value_type(move(*first1)); d.incr(); } } |