Commit 52f6afe0 by Jonathan Wakely Committed by Jonathan Wakely

PR libstdc++/91748 fix std::for_each_n for random access iterators

	PR libstdc++/91748
	* include/bits/stl_algo.h (for_each_n): Fix random access iterator
	case.
	* testsuite/25_algorithms/for_each/for_each_n.cc: Test with random
	access iterators.

From-SVN: r275683
parent 58cc9876
2019-09-12 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/91748
* include/bits/stl_algo.h (for_each_n): Fix random access iterator
case.
* testsuite/25_algorithms/for_each/for_each_n.cc: Test with random
access iterators.
2019-09-11 Jonathan Wakely <jwakely@redhat.com> 2019-09-11 Jonathan Wakely <jwakely@redhat.com>
* python/libstdcxx/v6/xmethods.py (SharedPtrUseCountWorker.__call__): * python/libstdcxx/v6/xmethods.py (SharedPtrUseCountWorker.__call__):
......
...@@ -3993,7 +3993,11 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO ...@@ -3993,7 +3993,11 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
auto __n2 = std::__size_to_integer(__n); auto __n2 = std::__size_to_integer(__n);
using _Cat = typename iterator_traits<_InputIterator>::iterator_category; using _Cat = typename iterator_traits<_InputIterator>::iterator_category;
if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>) if constexpr (is_base_of_v<random_access_iterator_tag, _Cat>)
return std::for_each(__first, __first + __n2, __f); {
auto __last = __first + __n2;
std::for_each(__first, __last, std::move(__f));
return __last;
}
else else
{ {
while (__n2-->0) while (__n2-->0)
......
...@@ -47,11 +47,42 @@ void test01() ...@@ -47,11 +47,42 @@ void test01()
}; };
auto res = std::for_each_n(con.begin(), Size(con.size()), Func(sum)); auto res = std::for_each_n(con.begin(), Size(con.size()), Func(sum));
VERIFY( res.ptr == con.end().ptr ); VERIFY( res == con.end() );
VERIFY( sum == 15 ); VERIFY( sum == 15 );
} }
void
test02()
{
using __gnu_test::test_container;
using __gnu_test::random_access_iterator_wrapper;
int array[5] = { 2, 4, 6, 8, 10 };
test_container<int, random_access_iterator_wrapper> con(array);
int prod = 1;
struct Func
{
Func(int& i) : i(i) { }
Func(Func&&) = default;
Func& operator=(Func&&) = delete;
void operator()(int n) const { i *= n; }
int& i;
};
struct Size
{
Size(short v) : val(v) { }
operator short() const { return val; }
short val;
};
auto res = std::for_each_n(con.begin(), Size(con.size()), Func(prod));
VERIFY( res == con.end() );
VERIFY( prod == 3840 );
}
int main() int main()
{ {
test01(); test01();
test02();
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment