From 40174dec40fefc8153b5aa48180d0cfcaf63dd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Sun, 29 Mar 2026 23:23:25 +0200 Subject: [PATCH] Fix bug: iterator category was not properly passed in the recursive segmented calls. --- .../experimental/segmented_count_if.hpp | 9 +++++---- .../container/experimental/segmented_find_if.hpp | 9 +++++---- .../experimental/segmented_for_each.hpp | 9 +++++---- .../experimental/segmented_generate.hpp | 9 +++++---- .../experimental/segmented_mismatch.hpp | 9 +++++---- .../experimental/segmented_partition.hpp | 16 +++++++++------- .../experimental/segmented_partition_copy.hpp | 9 +++++---- .../experimental/segmented_partition_point.hpp | 9 +++++---- .../experimental/segmented_remove_copy_if.hpp | 9 +++++---- .../experimental/segmented_replace_if.hpp | 9 +++++---- .../experimental/segmented_reverse_copy.hpp | 9 +++++---- .../experimental/segmented_transform.hpp | 9 +++++---- 12 files changed, 64 insertions(+), 51 deletions(-) diff --git a/include/boost/container/experimental/segmented_count_if.hpp b/include/boost/container/experimental/segmented_count_if.hpp index 76eadcf..6fe81aa 100644 --- a/include/boost/container/experimental/segmented_count_if.hpp +++ b/include/boost/container/experimental/segmented_count_if.hpp @@ -95,21 +95,22 @@ typename boost::container::iterator_traits::difference_type typedef typename traits::segment_iterator segment_iterator; typedef typename traits::local_iterator local_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return (segmented_count_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat()); + return (segmented_count_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t()); } else { typename boost::container::iterator_traits::difference_type result = 0; - result += (segmented_count_if_dispatch)(traits::local(first), traits::end(sfirst), pred, is_local_seg_t(), Cat()); + result += (segmented_count_if_dispatch)(traits::local(first), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, is_local_seg_t(), Cat()); + result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, is_local_seg_t(), local_cat_t()); - return result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, is_local_seg_t(), Cat()); + return result += (segmented_count_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_find_if.hpp b/include/boost/container/experimental/segmented_find_if.hpp index acec9ef..f8276c7 100644 --- a/include/boost/container/experimental/segmented_find_if.hpp +++ b/include/boost/container/experimental/segmented_find_if.hpp @@ -109,30 +109,31 @@ SegIter segmented_find_if_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); const segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return traits::compose(sfirst, (segmented_find_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat())); + return traits::compose(sfirst, (segmented_find_if_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t())); } else { //First segment { const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), le, pred, is_local_seg_t(), Cat()); + const local_iterator r = (segmented_find_if_dispatch)(traits::local(first), le, pred, is_local_seg_t(), local_cat_t()); if (r != le) return traits::compose(sfirst, r); } //Middle segments for (++sfirst; sfirst != slast; ++sfirst) { const local_iterator le = traits::end(sfirst); - const local_iterator r = (segmented_find_if_dispatch)(traits::begin(sfirst), le, pred, is_local_seg_t(), Cat()); + const local_iterator r = (segmented_find_if_dispatch)(traits::begin(sfirst), le, pred, is_local_seg_t(), local_cat_t()); if (r != le) return traits::compose(sfirst, r); } //Last segment - return traits::compose(slast, (segmented_find_if_dispatch)(traits::begin(slast), traits::local(last), pred, is_local_seg_t(), Cat())); + return traits::compose(slast, (segmented_find_if_dispatch)(traits::begin(slast), traits::local(last), pred, is_local_seg_t(), local_cat_t())); } } diff --git a/include/boost/container/experimental/segmented_for_each.hpp b/include/boost/container/experimental/segmented_for_each.hpp index 43bb253..7ecdd29 100644 --- a/include/boost/container/experimental/segmented_for_each.hpp +++ b/include/boost/container/experimental/segmented_for_each.hpp @@ -89,18 +89,19 @@ F segmented_for_each_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return (segmented_for_each_dispatch)(traits::local(first), traits::local(last), boost::move(f), is_local_seg_t(), Cat()); + return (segmented_for_each_dispatch)(traits::local(first), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t()); } else { - f = (segmented_for_each_dispatch)(traits::local(first), traits::end(sfirst), boost::move(f), is_local_seg_t(), Cat()); + f = (segmented_for_each_dispatch)(traits::local(first), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - f = (segmented_for_each_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(f), is_local_seg_t(), Cat()); - return (segmented_for_each_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(f), is_local_seg_t(), Cat()); + f = (segmented_for_each_dispatch)(traits::begin(sfirst), traits::end(sfirst), boost::move(f), is_local_seg_t(), local_cat_t()); + return (segmented_for_each_dispatch)(traits::begin(sfirst), traits::local(last), boost::move(f), is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_generate.hpp b/include/boost/container/experimental/segmented_generate.hpp index 3eda9e0..d8b5ac6 100644 --- a/include/boost/container/experimental/segmented_generate.hpp +++ b/include/boost/container/experimental/segmented_generate.hpp @@ -85,20 +85,21 @@ void segmented_generate_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - (segmented_generate_dispatch)(traits::local(first), traits::local(last), gen, is_local_seg_t(), Cat()); + (segmented_generate_dispatch)(traits::local(first), traits::local(last), gen, is_local_seg_t(), local_cat_t()); } else { - (segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), gen, is_local_seg_t(), Cat()); + (segmented_generate_dispatch)(traits::local(first), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - (segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), gen, is_local_seg_t(), Cat()); + (segmented_generate_dispatch)(traits::begin(sfirst), traits::end(sfirst), gen, is_local_seg_t(), local_cat_t()); - (segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), gen, is_local_seg_t(), Cat()); + (segmented_generate_dispatch)(traits::begin(sfirst), traits::local(last), gen, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_mismatch.hpp b/include/boost/container/experimental/segmented_mismatch.hpp index 2f1e6c7..066ffb8 100644 --- a/include/boost/container/experimental/segmented_mismatch.hpp +++ b/include/boost/container/experimental/segmented_mismatch.hpp @@ -122,6 +122,7 @@ std::pair segmented_mismatch_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; typedef std::pair return_t; typedef std::pair local_return_t; @@ -130,26 +131,26 @@ std::pair segmented_mismatch_dispatch segment_iterator const slast = traits::segment(last1); if(sfirst == slast) { - const local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), traits::local(last1), first2, pred, is_local_seg_t(), Cat()); + const local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), traits::local(last1), first2, pred, is_local_seg_t(), local_cat_t()); return return_t(traits::compose(sfirst, r.first), r.second); } else { // First segment local_iterator le = traits::end(sfirst); - local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), le, first2, pred, is_local_seg_t(), Cat()); + local_return_t r = (segmented_mismatch_dispatch)(traits::local(first1), le, first2, pred, is_local_seg_t(), local_cat_t()); if (r.first != le) return return_t(traits::compose(sfirst, r.first), r.second); // Middle segments for (++sfirst; sfirst != slast; ++sfirst) { le = traits::end(sfirst); - r = (segmented_mismatch_dispatch)(traits::begin(sfirst), le, r.second, pred, is_local_seg_t(), Cat()); + r = (segmented_mismatch_dispatch)(traits::begin(sfirst), le, r.second, pred, is_local_seg_t(), local_cat_t()); if (r.first != le) return return_t(traits::compose(sfirst, r.first), r.second); } // Last segment - r = (segmented_mismatch_dispatch)(traits::begin(slast), traits::local(last1), r.second, pred, is_local_seg_t(), Cat()); + r = (segmented_mismatch_dispatch)(traits::begin(slast), traits::local(last1), r.second, pred, is_local_seg_t(), local_cat_t()); return return_t(traits::compose(sfirst, r.first), r.second); } } diff --git a/include/boost/container/experimental/segmented_partition.hpp b/include/boost/container/experimental/segmented_partition.hpp index a3b5c32..b0779a9 100644 --- a/include/boost/container/experimental/segmented_partition.hpp +++ b/include/boost/container/experimental/segmented_partition.hpp @@ -191,37 +191,39 @@ RAIter partition_scan(RAIter first, RAIter last, Pred pred, non_segmented_iterat #endif //BOOST_CONTAINER_SEGMENTED_LOOP_UNROLLING template -OutIter partition_scan(SegIt first, SegIt last, OutIter result, Pred pred, segmented_iterator_tag, const Cat & cat) +OutIter partition_scan(SegIt first, SegIt last, OutIter result, Pred pred, segmented_iterator_tag, const Cat &) { typedef segmented_iterator_traits traits; typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator scur = traits::segment(first); segment_iterator slast = traits::segment(last); local_iterator lcur = traits::local(first); if(scur == slast) { - return partition_scan(lcur, traits::local(last), result, pred, is_local_seg_t(), cat); + return partition_scan(lcur, traits::local(last), result, pred, is_local_seg_t(), local_cat_t()); } else { - result = partition_scan(lcur, traits::end(scur), result, pred, is_local_seg_t(), cat); + result = partition_scan(lcur, traits::end(scur), result, pred, is_local_seg_t(), local_cat_t()); for(++scur; scur != slast; ++scur) - result = partition_scan(traits::begin(scur), traits::end(scur), result, pred, is_local_seg_t(), cat); + result = partition_scan(traits::begin(scur), traits::end(scur), result, pred, is_local_seg_t(), local_cat_t()); - return partition_scan(traits::begin(scur), traits::local(last), result, pred, is_local_seg_t(), cat); + return partition_scan(traits::begin(scur), traits::local(last), result, pred, is_local_seg_t(), local_cat_t()); } } template -SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag, const std::bidirectional_iterator_tag& cat) +SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag, const std::bidirectional_iterator_tag&) { typedef segmented_iterator_traits traits; typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sf = traits::segment(first); segment_iterator sl = traits::segment(last); @@ -273,7 +275,7 @@ SegIt partition_scan(SegIt first, SegIt last, Pred pred, segmented_iterator_tag, } same_segment_partition_step: - return traits::compose(sf, partition_scan(f_loc, l_loc, pred, is_local_seg_t(), cat)); + return traits::compose(sf, partition_scan(f_loc, l_loc, pred, is_local_seg_t(), local_cat_t())); } ////////////////////////////////////////////// diff --git a/include/boost/container/experimental/segmented_partition_copy.hpp b/include/boost/container/experimental/segmented_partition_copy.hpp index 3d37698..cab60f1 100644 --- a/include/boost/container/experimental/segmented_partition_copy.hpp +++ b/include/boost/container/experimental/segmented_partition_copy.hpp @@ -117,22 +117,23 @@ segmented_partition_copy_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; typedef std::pair pair_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return (segmented_partition_copy_dispatch)(traits::local(first), traits::local(last), out_true, out_false, pred, is_local_seg_t(), Cat()); + return (segmented_partition_copy_dispatch)(traits::local(first), traits::local(last), out_true, out_false, pred, is_local_seg_t(), local_cat_t()); } else { - pair_t p = (segmented_partition_copy_dispatch)(traits::local(first), traits::end(sfirst), out_true, out_false, pred, is_local_seg_t(), Cat()); + 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()); for(++sfirst; sfirst != slast; ++sfirst) { - p = (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::end(sfirst), p.first, p.second, pred, is_local_seg_t(), Cat()); + p = (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::end(sfirst), p.first, p.second, pred, is_local_seg_t(), local_cat_t()); } - return (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::local(last), p.first, p.second, pred, is_local_seg_t(), Cat()); + return (segmented_partition_copy_dispatch)(traits::begin(sfirst), traits::local(last), p.first, p.second, pred, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_partition_point.hpp b/include/boost/container/experimental/segmented_partition_point.hpp index c3a52d6..abf309a 100644 --- a/include/boost/container/experimental/segmented_partition_point.hpp +++ b/include/boost/container/experimental/segmented_partition_point.hpp @@ -111,30 +111,31 @@ SegIter segmented_partition_point_dispatch typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits ::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator scur = traits::segment(first); segment_iterator const slast = traits::segment(last); if(scur == slast) { return traits::compose(scur, - (segmented_partition_point_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), Cat())); + (segmented_partition_point_dispatch)(traits::local(first), traits::local(last), pred, is_local_seg_t(), local_cat_t())); } else { { local_iterator lcur = - (segmented_partition_point_dispatch)(traits::local(first), traits::end(scur), pred, is_local_seg_t(), Cat()); + (segmented_partition_point_dispatch)(traits::local(first), traits::end(scur), pred, is_local_seg_t(), local_cat_t()); if (lcur != traits::end(scur)) return traits::compose(scur, lcur); } for(++scur; scur != slast; ++scur) { local_iterator lcur = - (segmented_partition_point_dispatch)(traits::begin(scur), traits::end(scur), pred, is_local_seg_t(), Cat()); + (segmented_partition_point_dispatch)(traits::begin(scur), traits::end(scur), pred, is_local_seg_t(), local_cat_t()); if(lcur != traits::end(scur)) return traits::compose(scur, lcur); } return traits::compose(slast, - (segmented_partition_point_dispatch)(traits::begin(scur), traits::local(last), pred, is_local_seg_t(), Cat())); + (segmented_partition_point_dispatch)(traits::begin(scur), traits::local(last), pred, is_local_seg_t(), local_cat_t())); } return last; } diff --git a/include/boost/container/experimental/segmented_remove_copy_if.hpp b/include/boost/container/experimental/segmented_remove_copy_if.hpp index b1b1eaf..481b253 100644 --- a/include/boost/container/experimental/segmented_remove_copy_if.hpp +++ b/include/boost/container/experimental/segmented_remove_copy_if.hpp @@ -92,20 +92,21 @@ OutIter segmented_remove_copy_if_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return (segmented_remove_copy_if_dispatch)(traits::local(first), traits::local(last), result, pred, is_local_seg_t(), Cat()); + return (segmented_remove_copy_if_dispatch)(traits::local(first), traits::local(last), result, pred, is_local_seg_t(), local_cat_t()); } else { - result = (segmented_remove_copy_if_dispatch)(traits::local(first), traits::end(sfirst), result, pred, is_local_seg_t(), Cat()); + result = (segmented_remove_copy_if_dispatch)(traits::local(first), traits::end(sfirst), result, pred, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - result = (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, pred, is_local_seg_t(), Cat()); + result = (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, pred, is_local_seg_t(), local_cat_t()); - return (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::local(last), result, pred, is_local_seg_t(), Cat()); + return (segmented_remove_copy_if_dispatch)(traits::begin(sfirst), traits::local(last), result, pred, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_replace_if.hpp b/include/boost/container/experimental/segmented_replace_if.hpp index 29eb6cf..ac949bd 100644 --- a/include/boost/container/experimental/segmented_replace_if.hpp +++ b/include/boost/container/experimental/segmented_replace_if.hpp @@ -88,20 +88,21 @@ void segmented_replace_if_dispatch typedef typename traits::local_iterator local_iterator; typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - (segmented_replace_if_dispatch)(traits::local(first), traits::local(last), pred, new_val, is_local_seg_t(), Cat()); + (segmented_replace_if_dispatch)(traits::local(first), traits::local(last), pred, new_val, is_local_seg_t(), local_cat_t()); } else { - (segmented_replace_if_dispatch)(traits::local(first), traits::end(sfirst), pred, new_val, is_local_seg_t(), Cat()); + (segmented_replace_if_dispatch)(traits::local(first), traits::end(sfirst), pred, new_val, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - (segmented_replace_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, new_val, is_local_seg_t(), Cat()); + (segmented_replace_if_dispatch)(traits::begin(sfirst), traits::end(sfirst), pred, new_val, is_local_seg_t(), local_cat_t()); - (segmented_replace_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, new_val, is_local_seg_t(), Cat()); + (segmented_replace_if_dispatch)(traits::begin(sfirst), traits::local(last), pred, new_val, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_reverse_copy.hpp b/include/boost/container/experimental/segmented_reverse_copy.hpp index 595df75..9c0aa3e 100644 --- a/include/boost/container/experimental/segmented_reverse_copy.hpp +++ b/include/boost/container/experimental/segmented_reverse_copy.hpp @@ -90,20 +90,21 @@ OutIter segmented_reverse_copy_dispatch typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits ::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator const sfirst = traits::segment(first); segment_iterator slast = traits::segment(last); if(sfirst == slast) { - return (segmented_reverse_copy_dispatch)(traits::local(first), traits::local(last), result, is_local_seg_t(), Cat()); + return (segmented_reverse_copy_dispatch)(traits::local(first), traits::local(last), result, is_local_seg_t(), local_cat_t()); } else { - result = (segmented_reverse_copy_dispatch)(traits::begin(slast), traits::local(last), result, is_local_seg_t(), Cat()); + result = (segmented_reverse_copy_dispatch)(traits::begin(slast), traits::local(last), result, is_local_seg_t(), local_cat_t()); for (--slast; slast != sfirst; --slast) - result = (segmented_reverse_copy_dispatch)(traits::begin(slast), traits::end(slast), result, is_local_seg_t(), Cat()); + result = (segmented_reverse_copy_dispatch)(traits::begin(slast), traits::end(slast), result, is_local_seg_t(), local_cat_t()); - return (segmented_reverse_copy_dispatch)(traits::local(first), traits::end(sfirst), result, is_local_seg_t(), Cat()); + return (segmented_reverse_copy_dispatch)(traits::local(first), traits::end(sfirst), result, is_local_seg_t(), local_cat_t()); } } diff --git a/include/boost/container/experimental/segmented_transform.hpp b/include/boost/container/experimental/segmented_transform.hpp index e5bc142..cacfa86 100644 --- a/include/boost/container/experimental/segmented_transform.hpp +++ b/include/boost/container/experimental/segmented_transform.hpp @@ -90,20 +90,21 @@ OutIter segmented_transform_dispatch typedef typename traits::segment_iterator segment_iterator; typedef typename segmented_iterator_traits ::is_segmented_iterator is_local_seg_t; + typedef typename iterator_traits::iterator_category local_cat_t; segment_iterator sfirst = traits::segment(first); segment_iterator const slast = traits::segment(last); if(sfirst == slast) { - return (segmented_transform_dispatch)(traits::local(first), traits::local(last), result, op, is_local_seg_t(), Cat()); + return (segmented_transform_dispatch)(traits::local(first), traits::local(last), result, op, is_local_seg_t(), local_cat_t()); } else { - result = (segmented_transform_dispatch)(traits::local(first), traits::end(sfirst), result, op, is_local_seg_t(), Cat()); + result = (segmented_transform_dispatch)(traits::local(first), traits::end(sfirst), result, op, is_local_seg_t(), local_cat_t()); for(++sfirst; sfirst != slast; ++sfirst) - result = (segmented_transform_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, op, is_local_seg_t(), Cat()); + result = (segmented_transform_dispatch)(traits::begin(sfirst), traits::end(sfirst), result, op, is_local_seg_t(), local_cat_t()); - return (segmented_transform_dispatch)(traits::begin(sfirst), traits::local(last), result, op, is_local_seg_t(), Cat()); + return (segmented_transform_dispatch)(traits::begin(sfirst), traits::local(last), result, op, is_local_seg_t(), local_cat_t()); } }