diff --git a/include/boost/container/experimental/segmented_fill_n.hpp b/include/boost/container/experimental/segmented_fill_n.hpp index b7a0839..f4e57e9 100644 --- a/include/boost/container/experimental/segmented_fill_n.hpp +++ b/include/boost/container/experimental/segmented_fill_n.hpp @@ -33,8 +33,10 @@ namespace detail_algo { template FwdIt fill_n_scan(FwdIt first, FwdIt last, Size& count, const T& value, non_segmented_iterator_tag) { - for(; first != last && count > 0; ++first, --count) + Size n = count; //Avoid aliasing the count parameter + for(; first != last && n > 0; ++first, --n) *first = value; + count = n; return first; } @@ -54,8 +56,7 @@ SegIt fill_n_scan(SegIt first, SegIt last, Size& count, const T& value, segmente lcur = fill_n_scan(lcur, traits::end(scur), count, value, is_local_seg_t()); for(++scur; scur != slast && count > 0; ++scur) - lcur = fill_n_scan(traits::begin(scur), traits::end(scur), count, value, - is_local_seg_t()); + lcur = fill_n_scan(traits::begin(scur), traits::end(scur), count, value, is_local_seg_t()); if(count > 0) lcur = fill_n_scan(traits::begin(scur), traits::local(last), count, value, is_local_seg_t()); diff --git a/include/boost/container/experimental/segmented_generate_n.hpp b/include/boost/container/experimental/segmented_generate_n.hpp index 659d1d6..1bc17cf 100644 --- a/include/boost/container/experimental/segmented_generate_n.hpp +++ b/include/boost/container/experimental/segmented_generate_n.hpp @@ -33,8 +33,10 @@ namespace detail_algo { template FwdIt generate_n_scan(FwdIt first, FwdIt last, Size& count, Generator& gen, non_segmented_iterator_tag) { - for(; first != last && count > 0; ++first, --count) + Size n = count; //Avoid aliasing the count parameter + for(; first != last && n > 0; ++first, --n) *first = gen(); + count = n; return first; } @@ -51,14 +53,11 @@ SegIt generate_n_scan(SegIt first, SegIt last, Size& count, Generator& gen, segm lcur = generate_n_scan(lcur, traits::local(last), count, gen, is_local_seg_t()); } else { - lcur = generate_n_scan(lcur, traits::end(scur), count, gen, - is_local_seg_t()); + lcur = generate_n_scan(lcur, traits::end(scur), count, gen, is_local_seg_t()); for(++scur; scur != slast && count > 0; ++scur) - lcur = generate_n_scan(traits::begin(scur), traits::end(scur), count, gen, - is_local_seg_t()); + lcur = generate_n_scan(traits::begin(scur), traits::end(scur), count, gen, is_local_seg_t()); if(count > 0) - lcur = generate_n_scan(traits::begin(scur), traits::local(last), count, gen, - is_local_seg_t()); + lcur = generate_n_scan(traits::begin(scur), traits::local(last), count, gen, is_local_seg_t()); } return traits::compose(scur, lcur); }