|
21 | 21 | #include <boost/container/detail/config_begin.hpp> |
22 | 22 | #include <boost/container/detail/workaround.hpp> |
23 | 23 | #include <boost/container/experimental/segmented_iterator_traits.hpp> |
| 24 | +#include <boost/container/detail/iterator.hpp> |
24 | 25 |
|
25 | 26 | namespace boost { |
26 | 27 | namespace container { |
@@ -68,39 +69,41 @@ OutIter segmented_copy_dispatch |
68 | 69 |
|
69 | 70 | #endif //BOOST_CONTAINER_SEGMENTED_LOOP_UNROLLING |
70 | 71 |
|
| 72 | +template <class InIter, class Sent, class OutIter, class Tag, class Cat> |
| 73 | +typename algo_enable_if_c< |
| 74 | + !Tag::value || is_sentinel<Sent, InIter>::value, OutIter>::type |
| 75 | + segmented_copy_dispatch(InIter first, Sent last, OutIter result, Tag, Cat) |
| 76 | +{ |
| 77 | + for(; first != last; ++first, ++result) |
| 78 | + *result = *first; |
| 79 | + return result; |
| 80 | +} |
| 81 | + |
71 | 82 | template <class SegIter, class OutIter, class Cat> |
72 | 83 | OutIter segmented_copy_dispatch(SegIter first, SegIter last, OutIter result, segmented_iterator_tag, Cat) |
73 | 84 | { |
74 | 85 | typedef segmented_iterator_traits<SegIter> traits; |
75 | | - typedef typename traits::local_iterator local_iterator; |
76 | | - typedef typename traits::segment_iterator segment_iterator; |
| 86 | + typedef typename traits::local_iterator local_iterator; |
| 87 | + typedef typename traits::segment_iterator segment_iterator; |
| 88 | + typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t; |
| 89 | + typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t; |
77 | 90 |
|
78 | 91 | segment_iterator sfirst = traits::segment(first); |
79 | 92 | segment_iterator slast = traits::segment(last); |
80 | 93 |
|
81 | 94 | if(sfirst == slast) { |
82 | | - return (segmented_copy)(traits::local(first), traits::local(last), result); |
| 95 | + return (segmented_copy_dispatch)(traits::local(first), traits::local(last), result, is_local_seg_t(), local_cat_t()); |
83 | 96 | } |
84 | 97 | else { |
85 | | - result = (segmented_copy)(traits::local(first), traits::end(sfirst), result); |
| 98 | + result = (segmented_copy_dispatch)(traits::local(first), traits::end(sfirst), result, is_local_seg_t(), local_cat_t()); |
86 | 99 |
|
87 | 100 | for(++sfirst; sfirst != slast; ++sfirst) |
88 | | - result = (segmented_copy)(traits::begin(sfirst), traits::end(sfirst), result); |
| 101 | + result = (segmented_copy_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, is_local_seg_t(), local_cat_t()); |
89 | 102 |
|
90 | | - return (segmented_copy)(traits::begin(sfirst), traits::local(last), result); |
| 103 | + return (segmented_copy_dispatch)(traits::begin(sfirst), traits::local(last), result, is_local_seg_t(), local_cat_t()); |
91 | 104 | } |
92 | 105 | } |
93 | 106 |
|
94 | | -template <class InIter, class Sent, class OutIter, class Tag, class Cat> |
95 | | -typename algo_enable_if_c< |
96 | | - !Tag::value || is_sentinel<Sent, InIter>::value, OutIter>::type |
97 | | - segmented_copy_dispatch(InIter first, Sent last, OutIter result, Tag, Cat) |
98 | | -{ |
99 | | - for(; first != last; ++first, ++result) |
100 | | - *result = *first; |
101 | | - return result; |
102 | | -} |
103 | | - |
104 | 107 | } // namespace detail_algo |
105 | 108 |
|
106 | 109 | //! Copies elements from [first, last) to the range beginning at \c result. |
|
0 commit comments