Skip to content

Commit 6f39505

Browse files
committed
Move generator instead of taking by reference to improve code generation.
1 parent e193300 commit 6f39505

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

include/boost/container/experimental/segmented_generate.hpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <boost/container/detail/workaround.hpp>
2323
#include <boost/container/experimental/segmented_iterator_traits.hpp>
2424
#include <boost/container/detail/iterator.hpp>
25+
#include <boost/move/utility_core.hpp>
26+
2527

2628
namespace boost {
2729
namespace container {
@@ -35,7 +37,7 @@ namespace detail_algo {
3537

3638
template <class RAIter, class Generator>
3739
void segmented_generate_dispatch
38-
(RAIter first, RAIter last, Generator &gen, const non_segmented_iterator_tag &, const std::random_access_iterator_tag &)
40+
(RAIter first, RAIter last, Generator gen, const non_segmented_iterator_tag &, const std::random_access_iterator_tag &)
3941
{
4042
typedef typename iterator_traits<RAIter>::difference_type difference_type;
4143

@@ -68,15 +70,15 @@ void segmented_generate_dispatch
6870
template <class FwdIt, class Sent, class Generator, class Tag, class Cat>
6971
BOOST_CONTAINER_FORCEINLINE typename algo_enable_if_c<
7072
!Tag::value || is_sentinel<Sent, FwdIt>::value>::type
71-
segmented_generate_dispatch(FwdIt first, Sent last, Generator &gen, Tag, Cat)
73+
segmented_generate_dispatch(FwdIt first, Sent last, Generator gen, Tag, Cat)
7274
{
7375
for(; first != last; ++first)
7476
*first = gen();
7577
}
7678

7779
template <class SegIter, class Generator, class Cat>
7880
void segmented_generate_dispatch
79-
(SegIter first, SegIter last, Generator &gen, segmented_iterator_tag, Cat)
81+
(SegIter first, SegIter last, Generator gen, segmented_iterator_tag, Cat)
8082
{
8183
typedef segmented_iterator_traits<SegIter> traits;
8284
typedef typename traits::local_iterator local_iterator;
@@ -88,15 +90,15 @@ void segmented_generate_dispatch
8890
segment_iterator slast = traits::segment(last);
8991

9092
if(sfirst == slast) {
91-
(segmented_generate_dispatch)(traits::local(first), traits::local(last), gen, is_local_seg_t(), local_cat_t());
93+
(segmented_generate_dispatch)(traits::local(first), traits::local(last), boost::move(gen), is_local_seg_t(), local_cat_t());
9294
}
9395
else {
94-
(segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t());
96+
(segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), boost::move(gen), is_local_seg_t(), local_cat_t());
9597

9698
for(++sfirst; sfirst != slast; ++sfirst)
97-
(segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t());
99+
(segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(gen), is_local_seg_t(), local_cat_t());
98100

99-
(segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), gen, is_local_seg_t(), local_cat_t());
101+
(segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(gen), is_local_seg_t(), local_cat_t());
100102
}
101103
}
102104

@@ -111,7 +113,7 @@ void segmented_generate(FwdIt first, Sent last, Generator gen)
111113
{
112114
typedef segmented_iterator_traits<FwdIt> traits;
113115
detail_algo::segmented_generate_dispatch
114-
(first, last, gen, typename traits::is_segmented_iterator(), typename iterator_traits<FwdIt>::iterator_category());
116+
(first, last, boost::move(gen), typename traits::is_segmented_iterator(), typename iterator_traits<FwdIt>::iterator_category());
115117
}
116118

117119
} // namespace container

0 commit comments

Comments
 (0)