Skip to content

Commit 40174de

Browse files
committed
Fix bug: iterator category was not properly passed in the recursive segmented calls.
1 parent 530b41d commit 40174de

12 files changed

Lines changed: 64 additions & 51 deletions

include/boost/container/experimental/segmented_count_if.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,22 @@ typename boost::container::iterator_traits<SegIter>::difference_type
9595
typedef typename traits::segment_iterator segment_iterator;
9696
typedef typename traits::local_iterator local_iterator;
9797
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
98+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
9899

99100
segment_iterator sfirst = traits::segment(first);
100101
segment_iterator slast = traits::segment(last);
101102

102103
if(sfirst == slast) {
103-
return (segmented_count_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat());
104+
return (segmented_count_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t());
104105
}
105106
else {
106107
typename boost::container::iterator_traits<SegIter>::difference_type result = 0;
107-
result += (segmented_count_if_dispatch)(traits::local(first), traits::end(sfirst), pred, is_local_seg_t(), Cat());
108+
result += (segmented_count_if_dispatch)(traits::local(first), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t());
108109

109110
for(++sfirst; sfirst != slast; ++sfirst)
110-
result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, is_local_seg_t(), Cat());
111+
result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t());
111112

112-
return result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, is_local_seg_t(), Cat());
113+
return result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, is_local_seg_t(), local_cat_t());
113114
}
114115
}
115116

include/boost/container/experimental/segmented_find_if.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,30 +109,31 @@ SegIter segmented_find_if_dispatch
109109
typedef typename traits::local_iterator local_iterator;
110110
typedef typename traits::segment_iterator segment_iterator;
111111
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
112+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
112113

113114
segment_iterator sfirst = traits::segment(first);
114115
const segment_iterator slast = traits::segment(last);
115116

116117
if(sfirst == slast) {
117-
return traits::compose(sfirst, (segmented_find_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat()));
118+
return traits::compose(sfirst, (segmented_find_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t()));
118119
}
119120
else {
120121
//First segment
121122
{
122123
const local_iterator le = traits::end(sfirst);
123-
const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), le, pred, is_local_seg_t(), Cat());
124+
const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), le, pred, is_local_seg_t(), local_cat_t());
124125
if (r != le)
125126
return traits::compose(sfirst, r);
126127
}
127128
//Middle segments
128129
for (++sfirst; sfirst != slast; ++sfirst) {
129130
const local_iterator le = traits::end(sfirst);
130-
const local_iterator r = (segmented_find_if_dispatch)(traits::begin(sfirst), le, pred, is_local_seg_t(), Cat());
131+
const local_iterator r = (segmented_find_if_dispatch)(traits::begin(sfirst), le, pred, is_local_seg_t(), local_cat_t());
131132
if (r != le)
132133
return traits::compose(sfirst, r);
133134
}
134135
//Last segment
135-
return traits::compose(slast, (segmented_find_if_dispatch)(traits::begin(slast), traits::local(last), pred, is_local_seg_t(), Cat()));
136+
return traits::compose(slast, (segmented_find_if_dispatch)(traits::begin(slast), traits::local(last), pred, is_local_seg_t(), local_cat_t()));
136137
}
137138
}
138139

include/boost/container/experimental/segmented_for_each.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,19 @@ F segmented_for_each_dispatch
8989
typedef typename traits::local_iterator local_iterator;
9090
typedef typename traits::segment_iterator segment_iterator;
9191
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
92+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
9293

9394
segment_iterator sfirst = traits::segment(first);
9495
segment_iterator slast = traits::segment(last);
9596

9697
if(sfirst == slast) {
97-
return (segmented_for_each_dispatch)(traits::local(first), traits::local(last), boost::move(f), is_local_seg_t(), Cat());
98+
return (segmented_for_each_dispatch)(traits::local(first), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t());
9899
}
99100
else {
100-
f = (segmented_for_each_dispatch)(traits::local(first), traits::end(sfirst), boost::move(f), is_local_seg_t(), Cat());
101+
f = (segmented_for_each_dispatch)(traits::local(first), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t());
101102
for(++sfirst; sfirst != slast; ++sfirst)
102-
f = (segmented_for_each_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(f), is_local_seg_t(), Cat());
103-
return (segmented_for_each_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(f), is_local_seg_t(), Cat());
103+
f = (segmented_for_each_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t());
104+
return (segmented_for_each_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t());
104105
}
105106
}
106107

include/boost/container/experimental/segmented_generate.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,21 @@ void segmented_generate_dispatch
8585
typedef typename traits::local_iterator local_iterator;
8686
typedef typename traits::segment_iterator segment_iterator;
8787
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
88+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
8889

8990
segment_iterator sfirst = traits::segment(first);
9091
segment_iterator slast = traits::segment(last);
9192

9293
if(sfirst == slast) {
93-
(segmented_generate_dispatch)(traits::local(first), traits::local(last), gen, is_local_seg_t(), Cat());
94+
(segmented_generate_dispatch)(traits::local(first), traits::local(last), gen, is_local_seg_t(), local_cat_t());
9495
}
9596
else {
96-
(segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), gen, is_local_seg_t(), Cat());
97+
(segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t());
9798

9899
for(++sfirst; sfirst != slast; ++sfirst)
99-
(segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), gen, is_local_seg_t(), Cat());
100+
(segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t());
100101

101-
(segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), gen, is_local_seg_t(), Cat());
102+
(segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), gen, is_local_seg_t(), local_cat_t());
102103
}
103104
}
104105

include/boost/container/experimental/segmented_mismatch.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ std::pair<SegIter, InpIter2> segmented_mismatch_dispatch
122122
typedef typename traits::local_iterator local_iterator;
123123
typedef typename traits::segment_iterator segment_iterator;
124124
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
125+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
125126

126127
typedef std::pair<SegIter, InpIter2> return_t;
127128
typedef std::pair<local_iterator, InpIter2> local_return_t;
@@ -130,26 +131,26 @@ std::pair<SegIter, InpIter2> segmented_mismatch_dispatch
130131
segment_iterator const slast = traits::segment(last1);
131132

132133
if(sfirst == slast) {
133-
const local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), traits::local(last1), first2, pred, is_local_seg_t(), Cat());
134+
const local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), traits::local(last1), first2, pred, is_local_seg_t(), local_cat_t());
134135
return return_t(traits::compose(sfirst, r.first), r.second);
135136
}
136137
else {
137138
// First segment
138139
local_iterator le = traits::end(sfirst);
139-
local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), le, first2, pred, is_local_seg_t(), Cat());
140+
local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), le, first2, pred, is_local_seg_t(), local_cat_t());
140141
if (r.first != le)
141142
return return_t(traits::compose(sfirst, r.first), r.second);
142143

143144
// Middle segments
144145
for (++sfirst; sfirst != slast; ++sfirst) {
145146
le = traits::end(sfirst);
146-
r = (segmented_mismatch_dispatch)(traits::begin(sfirst), le, r.second, pred, is_local_seg_t(), Cat());
147+
r = (segmented_mismatch_dispatch)(traits::begin(sfirst), le, r.second, pred, is_local_seg_t(), local_cat_t());
147148
if (r.first != le)
148149
return return_t(traits::compose(sfirst, r.first), r.second);
149150
}
150151

151152
// Last segment
152-
r = (segmented_mismatch_dispatch)(traits::begin(slast), traits::local(last1), r.second, pred, is_local_seg_t(), Cat());
153+
r = (segmented_mismatch_dispatch)(traits::begin(slast), traits::local(last1), r.second, pred, is_local_seg_t(), local_cat_t());
153154
return return_t(traits::compose(sfirst, r.first), r.second);
154155
}
155156
}

include/boost/container/experimental/segmented_partition.hpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,37 +191,39 @@ RAIter partition_scan(RAIter first, RAIter last, Pred pred, non_segmented_iterat
191191
#endif //BOOST_CONTAINER_SEGMENTED_LOOP_UNROLLING
192192

193193
template <class SegIt, class OutIter, class Pred, class Cat>
194-
OutIter partition_scan(SegIt first, SegIt last, OutIter result, Pred pred, segmented_iterator_tag, const Cat & cat)
194+
OutIter partition_scan(SegIt first, SegIt last, OutIter result, Pred pred, segmented_iterator_tag, const Cat &)
195195
{
196196
typedef segmented_iterator_traits<SegIt> traits;
197197
typedef typename traits::local_iterator local_iterator;
198198
typedef typename traits::segment_iterator segment_iterator;
199199

200200
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
201+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
201202
segment_iterator scur = traits::segment(first);
202203
segment_iterator slast = traits::segment(last);
203204
local_iterator lcur = traits::local(first);
204205

205206
if(scur == slast) {
206-
return partition_scan(lcur, traits::local(last), result, pred, is_local_seg_t(), cat);
207+
return partition_scan(lcur, traits::local(last), result, pred, is_local_seg_t(), local_cat_t());
207208
}
208209
else {
209-
result = partition_scan(lcur, traits::end(scur), result, pred, is_local_seg_t(), cat);
210+
result = partition_scan(lcur, traits::end(scur), result, pred, is_local_seg_t(), local_cat_t());
210211

211212
for(++scur; scur != slast; ++scur)
212-
result = partition_scan(traits::begin(scur), traits::end(scur), result, pred, is_local_seg_t(), cat);
213+
result = partition_scan(traits::begin(scur), traits::end(scur), result, pred, is_local_seg_t(), local_cat_t());
213214

214-
return partition_scan(traits::begin(scur), traits::local(last), result, pred, is_local_seg_t(), cat);
215+
return partition_scan(traits::begin(scur), traits::local(last), result, pred, is_local_seg_t(), local_cat_t());
215216
}
216217
}
217218

218219
template <class SegIt, class Pred>
219-
SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag, const std::bidirectional_iterator_tag& cat)
220+
SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag, const std::bidirectional_iterator_tag&)
220221
{
221222
typedef segmented_iterator_traits<SegIt> traits;
222223
typedef typename traits::local_iterator local_iterator;
223224
typedef typename traits::segment_iterator segment_iterator;
224225
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
226+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
225227

226228
segment_iterator sf = traits::segment(first);
227229
segment_iterator sl = traits::segment(last);
@@ -273,7 +275,7 @@ SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag,
273275
}
274276

275277
same_segment_partition_step:
276-
return traits::compose(sf, partition_scan(f_loc, l_loc, pred, is_local_seg_t(), cat));
278+
return traits::compose(sf, partition_scan(f_loc, l_loc, pred, is_local_seg_t(), local_cat_t()));
277279
}
278280

279281
//////////////////////////////////////////////

include/boost/container/experimental/segmented_partition_copy.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,22 +117,23 @@ segmented_partition_copy_dispatch
117117
typedef typename traits::local_iterator local_iterator;
118118
typedef typename traits::segment_iterator segment_iterator;
119119
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
120+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
120121
typedef std::pair<OutIter1, OutIter2> pair_t;
121122

122123
segment_iterator sfirst = traits::segment(first);
123124
segment_iterator slast = traits::segment(last);
124125

125126
if(sfirst == slast) {
126-
return (segmented_partition_copy_dispatch)(traits::local(first), traits::local(last), out_true, out_false, pred, is_local_seg_t(), Cat());
127+
return (segmented_partition_copy_dispatch)(traits::local(first), traits::local(last), out_true, out_false, pred, is_local_seg_t(), local_cat_t());
127128
}
128129
else {
129-
pair_t p = (segmented_partition_copy_dispatch)(traits::local(first), traits::end(sfirst), out_true, out_false, pred, is_local_seg_t(), Cat());
130+
pair_t p = (segmented_partition_copy_dispatch)(traits::local(first), traits::end(sfirst), out_true, out_false, pred, is_local_seg_t(), local_cat_t());
130131

131132
for(++sfirst; sfirst != slast; ++sfirst) {
132-
p = (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::end(sfirst), p.first, p.second, pred, is_local_seg_t(), Cat());
133+
p = (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::end(sfirst), p.first, p.second, pred, is_local_seg_t(), local_cat_t());
133134
}
134135

135-
return (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::local(last), p.first, p.second, pred, is_local_seg_t(), Cat());
136+
return (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::local(last), p.first, p.second, pred, is_local_seg_t(), local_cat_t());
136137
}
137138
}
138139

include/boost/container/experimental/segmented_partition_point.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,30 +111,31 @@ SegIter segmented_partition_point_dispatch
111111
typedef typename traits::segment_iterator segment_iterator;
112112
typedef typename segmented_iterator_traits
113113
<local_iterator>::is_segmented_iterator is_local_seg_t;
114+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
114115

115116
segment_iterator scur = traits::segment(first);
116117
segment_iterator const slast = traits::segment(last);
117118

118119
if(scur == slast) {
119120
return traits::compose(scur,
120-
(segmented_partition_point_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat()));
121+
(segmented_partition_point_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t()));
121122
}
122123
else {
123124
{
124125
local_iterator lcur =
125-
(segmented_partition_point_dispatch)(traits::local(first), traits::end(scur), pred, is_local_seg_t(), Cat());
126+
(segmented_partition_point_dispatch)(traits::local(first), traits::end(scur), pred, is_local_seg_t(), local_cat_t());
126127
if (lcur != traits::end(scur))
127128
return traits::compose(scur, lcur);
128129
}
129130

130131
for(++scur; scur != slast; ++scur) {
131132
local_iterator lcur =
132-
(segmented_partition_point_dispatch)(traits::begin(scur), traits::end(scur), pred, is_local_seg_t(), Cat());
133+
(segmented_partition_point_dispatch)(traits::begin(scur), traits::end(scur), pred, is_local_seg_t(), local_cat_t());
133134
if(lcur != traits::end(scur))
134135
return traits::compose(scur, lcur);
135136
}
136137
return traits::compose(slast,
137-
(segmented_partition_point_dispatch)(traits::begin(scur), traits::local(last), pred, is_local_seg_t(), Cat()));
138+
(segmented_partition_point_dispatch)(traits::begin(scur), traits::local(last), pred, is_local_seg_t(), local_cat_t()));
138139
}
139140
return last;
140141
}

include/boost/container/experimental/segmented_remove_copy_if.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,21 @@ OutIter segmented_remove_copy_if_dispatch
9292
typedef typename traits::local_iterator local_iterator;
9393
typedef typename traits::segment_iterator segment_iterator;
9494
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
95+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
9596

9697
segment_iterator sfirst = traits::segment(first);
9798
segment_iterator slast = traits::segment(last);
9899

99100
if(sfirst == slast) {
100-
return (segmented_remove_copy_if_dispatch)(traits::local(first), traits::local(last), result, pred, is_local_seg_t(), Cat());
101+
return (segmented_remove_copy_if_dispatch)(traits::local(first), traits::local(last), result, pred, is_local_seg_t(), local_cat_t());
101102
}
102103
else {
103-
result = (segmented_remove_copy_if_dispatch)(traits::local(first), traits::end(sfirst), result, pred, is_local_seg_t(), Cat());
104+
result = (segmented_remove_copy_if_dispatch)(traits::local(first), traits::end(sfirst), result, pred, is_local_seg_t(), local_cat_t());
104105

105106
for(++sfirst; sfirst != slast; ++sfirst)
106-
result = (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, pred, is_local_seg_t(), Cat());
107+
result = (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, pred, is_local_seg_t(), local_cat_t());
107108

108-
return (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::local(last), result, pred, is_local_seg_t(), Cat());
109+
return (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::local(last), result, pred, is_local_seg_t(), local_cat_t());
109110
}
110111
}
111112

include/boost/container/experimental/segmented_replace_if.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,20 +88,21 @@ void segmented_replace_if_dispatch
8888
typedef typename traits::local_iterator local_iterator;
8989
typedef typename traits::segment_iterator segment_iterator;
9090
typedef typename segmented_iterator_traits<local_iterator>::is_segmented_iterator is_local_seg_t;
91+
typedef typename iterator_traits<local_iterator>::iterator_category local_cat_t;
9192

9293
segment_iterator sfirst = traits::segment(first);
9394
segment_iterator slast = traits::segment(last);
9495

9596
if(sfirst == slast) {
96-
(segmented_replace_if_dispatch)(traits::local(first), traits::local(last), pred, new_val, is_local_seg_t(), Cat());
97+
(segmented_replace_if_dispatch)(traits::local(first), traits::local(last), pred, new_val, is_local_seg_t(), local_cat_t());
9798
}
9899
else {
99-
(segmented_replace_if_dispatch)(traits::local(first), traits::end(sfirst), pred, new_val, is_local_seg_t(), Cat());
100+
(segmented_replace_if_dispatch)(traits::local(first), traits::end(sfirst), pred, new_val, is_local_seg_t(), local_cat_t());
100101

101102
for(++sfirst; sfirst != slast; ++sfirst)
102-
(segmented_replace_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, new_val, is_local_seg_t(), Cat());
103+
(segmented_replace_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, new_val, is_local_seg_t(), local_cat_t());
103104

104-
(segmented_replace_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, new_val, is_local_seg_t(), Cat());
105+
(segmented_replace_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, new_val, is_local_seg_t(), local_cat_t());
105106
}
106107
}
107108

0 commit comments

Comments
 (0)