From 5451da7434ff06f978e04749761f91edecff3cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Tue, 17 Mar 2026 13:31:00 +0100 Subject: [PATCH] Replace reference parameters with return value --- .../experimental/segmented_merge.hpp | 33 ++++++++----------- .../experimental/segmented_set_difference.hpp | 26 +++++++-------- .../segmented_set_symmetric_difference.hpp | 8 ++--- 3 files changed, 29 insertions(+), 38 deletions(-) diff --git a/include/boost/container/experimental/segmented_merge.hpp b/include/boost/container/experimental/segmented_merge.hpp index 7605ddd..b86d3d0 100644 --- a/include/boost/container/experimental/segmented_merge.hpp +++ b/include/boost/container/experimental/segmented_merge.hpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace boost { namespace container { @@ -42,7 +43,7 @@ struct merge_default_less }; template -void merge_scan(FwdIt first, FwdIt last, InIter2& first2, Sent2 last2, OutIter& result, Comp comp, +OutIter merge_scan(FwdIt first, FwdIt last, InIter2& first2, Sent2 last2, OutIter result, Comp comp, non_segmented_iterator_tag) { while(first != last && first2 != last2) { @@ -50,12 +51,11 @@ void merge_scan(FwdIt first, FwdIt last, InIter2& first2, Sent2 last2, OutIter& else { *result = *first; ++first; } ++result; } - for(; first != last; ++first, ++result) - *result = *first; + return (segmented_copy)(first, last, result); } template -void merge_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, OutIter& result, Comp comp, +OutIter merge_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, OutIter result, Comp comp, segmented_iterator_tag) { typedef segmented_iterator_traits traits; @@ -68,24 +68,20 @@ void merge_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, OutIter& merge_scan(lcur, traits::local(last), first2, last2, result, comp, is_local_seg_t()); } else { - merge_scan(lcur, traits::end(scur), first2, last2, result, comp, - is_local_seg_t()); + result = merge_scan(lcur, traits::end(scur), first2, last2, result, comp, is_local_seg_t()); for(++scur; scur != slast; ++scur) - merge_scan(traits::begin(scur), traits::end(scur), first2, last2, result, comp, - is_local_seg_t()); - merge_scan(traits::begin(scur), traits::local(last), first2, last2, result, comp, - is_local_seg_t()); + result = merge_scan(traits::begin(scur), traits::end(scur), first2, last2, result, comp, is_local_seg_t()); + result = merge_scan(traits::begin(scur), traits::local(last), first2, last2, result, comp, is_local_seg_t()); } + return result; } template -OutIter segmented_merge_dispatch +BOOST_CONTAINER_FORCEINLINE OutIter segmented_merge_dispatch (SegIter first1, SegIter last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp, segmented_iterator_tag) { - merge_scan(first1, last1, first2, last2, result, comp, segmented_iterator_tag()); - for(; first2 != last2; ++first2, ++result) - *result = *first2; - return result; + result = merge_scan(first1, last1, first2, last2, result, comp, segmented_iterator_tag()); + return (segmented_copy)(first2, last2, result); } template @@ -105,10 +101,9 @@ segmented_merge_dispatch } ++result; } - for(; first1 != last1; ++first1, ++result) - *result = *first1; - for(; first2 != last2; ++first2, ++result) - *result = *first2; + result = (segmented_copy)(first1, last1, result); + result = (segmented_copy)(first2, last2, result); + return result; } diff --git a/include/boost/container/experimental/segmented_set_difference.hpp b/include/boost/container/experimental/segmented_set_difference.hpp index d3ed118..0795932 100644 --- a/include/boost/container/experimental/segmented_set_difference.hpp +++ b/include/boost/container/experimental/segmented_set_difference.hpp @@ -43,19 +43,21 @@ struct set_difference_default_less }; template -void set_difference_scan(FwdIt first, FwdIt last, InIter2& first2, Sent2 last2, OutIter& result, Comp comp, +OutIter set_difference_scan(FwdIt first, FwdIt last, InIter2& first2_out, Sent2 last2, OutIter result, Comp comp, non_segmented_iterator_tag) { + InIter2 first2 = first2_out; while(first != last && first2 != last2) { if(comp(*first, *first2)) { *result = *first; ++first; ++result; } else if(comp(*first2, *first)) { ++first2; } else { ++first; ++first2; } } - result = (segmented_copy)(first, last, result); + first2_out = first2; + return (segmented_copy)(first, last, result); } template -void set_difference_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, OutIter& result, Comp comp, +OutIter set_difference_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, OutIter result, Comp comp, segmented_iterator_tag) { typedef segmented_iterator_traits traits; @@ -65,25 +67,22 @@ void set_difference_scan(SegIt first, SegIt last, InIter2& first2, Sent2 last2, typename traits::segment_iterator slast = traits::segment(last); local_iterator lcur = traits::local(first); if(scur == slast) { - set_difference_scan(lcur, traits::local(last), first2, last2, result, comp, is_local_seg_t()); + result = set_difference_scan(lcur, traits::local(last), first2, last2, result, comp, is_local_seg_t()); } else { - set_difference_scan(lcur, traits::end(scur), first2, last2, result, comp, - is_local_seg_t()); + result = set_difference_scan(lcur, traits::end(scur), first2, last2, result, comp, is_local_seg_t()); for(++scur; scur != slast; ++scur) - set_difference_scan(traits::begin(scur), traits::end(scur), first2, last2, result, comp, - is_local_seg_t()); - set_difference_scan(traits::begin(scur), traits::local(last), first2, last2, result, comp, - is_local_seg_t()); + result = set_difference_scan(traits::begin(scur), traits::end(scur), first2, last2, result, comp, is_local_seg_t()); + result = set_difference_scan(traits::begin(scur), traits::local(last), first2, last2, result, comp, is_local_seg_t()); } + return result; } template BOOST_CONTAINER_FORCEINLINE OutIter segmented_set_difference_dispatch (SegIter first1, SegIter last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp, segmented_iterator_tag) { - set_difference_scan(first1, last1, first2, last2, result, comp, segmented_iterator_tag()); - return result; + return set_difference_scan(first1, last1, first2, last2, result, comp, segmented_iterator_tag()); } template @@ -97,8 +96,7 @@ segmented_set_difference_dispatch else if(comp(*first2, *first1)) { ++first2; } else { ++first1; ++first2; } } - for(; first1 != last1; ++first1, ++result) *result = *first1; - return result; + return (segmented_copy)(first1, last1, result); } } // namespace detail_algo diff --git a/include/boost/container/experimental/segmented_set_symmetric_difference.hpp b/include/boost/container/experimental/segmented_set_symmetric_difference.hpp index 05ef729..aa2b5ab 100644 --- a/include/boost/container/experimental/segmented_set_symmetric_difference.hpp +++ b/include/boost/container/experimental/segmented_set_symmetric_difference.hpp @@ -83,9 +83,7 @@ OutIter segmented_set_symmetric_difference_dispatch (SegIter first1, SegIter last1, InIter2 first2, Sent2 last2, OutIter result, Comp comp, segmented_iterator_tag) { set_symmetric_difference_scan(first1, last1, first2, last2, result, comp, segmented_iterator_tag()); - for(; first2 != last2; ++first2, ++result) - *result = *first2; - return result; + return (segmented_copy)(first2, last2, result); } template @@ -99,8 +97,8 @@ segmented_set_symmetric_difference_dispatch else if(comp(*first2, *first1)) { *result = *first2; ++first2; ++result; } else { ++first1; ++first2; } } - for(; first1 != last1; ++first1, ++result) *result = *first1; - for(; first2 != last2; ++first2, ++result) *result = *first2; + result = (segmented_copy)(first1, last1, result); + result = (segmented_copy)(first2, last2, result); return result; }