Replace reference parameters with return value

This commit is contained in:
Ion Gaztañaga
2026-03-17 13:31:00 +01:00
parent 9524edaf65
commit 5451da7434
3 changed files with 29 additions and 38 deletions
@@ -21,6 +21,7 @@
#include <boost/container/detail/config_begin.hpp>
#include <boost/container/detail/workaround.hpp>
#include <boost/container/experimental/segmented_iterator_traits.hpp>
#include <boost/container/experimental/segmented_copy.hpp>
namespace boost {
namespace container {
@@ -42,7 +43,7 @@ struct merge_default_less
};
template <class FwdIt, class InIter2, class Sent2, class OutIter, class Comp>
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 <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
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<SegIt> 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 <class SegIter, class InIter2, class Sent2, class OutIter, class Comp>
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 <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp, class Tag>
@@ -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;
}
@@ -43,19 +43,21 @@ struct set_difference_default_less
};
template <class FwdIt, class InIter2, class Sent2, class OutIter, class Comp>
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 <class SegIt, class InIter2, class Sent2, class OutIter, class Comp>
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<SegIt> 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 <class SegIter, class InIter2, class Sent2, class OutIter, class Comp>
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 <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp, class Tag>
@@ -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
@@ -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 <class InIter1, class Sent1, class InIter2, class Sent2, class OutIter, class Comp, class Tag>
@@ -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;
}