diff options
author | François Dumont <fdumont@gcc.gnu.org> | 2018-07-03 15:50:12 +0000 |
---|---|---|
committer | François Dumont <fdumont@gcc.gnu.org> | 2018-07-03 15:50:12 +0000 |
commit | 315aadc8642b72fc2d7172312a35e18074cca85b (patch) | |
tree | 0af852f841a69ce2a390843c5613726ce3f0ff76 /libstdc++-v3 | |
parent | 42a98b43bbd3faf452545871daa49d155dfd03e2 (diff) | |
download | gcc-315aadc8642b72fc2d7172312a35e18074cca85b.zip gcc-315aadc8642b72fc2d7172312a35e18074cca85b.tar.gz gcc-315aadc8642b72fc2d7172312a35e18074cca85b.tar.bz2 |
stl_algobase.h (__niter_wrap): New.
2018-07-03 François Dumont <fdumont@gcc.gnu.org>
* include/bits/stl_algobase.h (__niter_wrap): New.
(__copy_move_a2(_II, _II, _OI)): Use latter.
(__copy_move_backward_a2(_BI1, _BI1, _BI2)): Likewise.
(fill_n(_OI, _Size, const _Tp&)): Likewise.
(equal(_II1, _II1, _II2)): Use __glibcxx_requires_can_increment.
* include/debug/stl_iterator.h
(std::__niter_base(const __gnu_cxx::_Safe_iterator<
__gnu_cxx::__normal_iterator<>, _Sequence>&)): New declaration.
* include/debug/vector (__niter_base(const __gnu_cxx::_Safe_iterator<
__gnu_cxx::__normal_iterator<>, _Sequence>&)): New.
From-SVN: r262349
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 29 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/stl_iterator.h | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/vector | 7 |
4 files changed, 56 insertions, 6 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ae734e8..838887c 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,16 @@ +2018-07-03 François Dumont <fdumont@gcc.gnu.org> + + * include/bits/stl_algobase.h (__niter_wrap): New. + (__copy_move_a2(_II, _II, _OI)): Use latter. + (__copy_move_backward_a2(_BI1, _BI1, _BI2)): Likewise. + (fill_n(_OI, _Size, const _Tp&)): Likewise. + (equal(_II1, _II1, _II2)): Use __glibcxx_requires_can_increment. + * include/debug/stl_iterator.h + (std::__niter_base(const __gnu_cxx::_Safe_iterator< + __gnu_cxx::__normal_iterator<>, _Sequence>&)): New declaration. + * include/debug/vector (__niter_base(const __gnu_cxx::_Safe_iterator< + __gnu_cxx::__normal_iterator<>, _Sequence>&)): New. + 2018-07-02 Jonathan Wakely <jwakely@redhat.com> P0758R1 Implicit conversion traits diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index 022a3f1..16a3f83 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -277,6 +277,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __niter_base(_Iterator __it) { return __it; } + // Reverse the __niter_base transformation to get a + // __normal_iterator back again (this assumes that __normal_iterator + // is only used to wrap random access iterators, like pointers). + template<typename _From, typename _To> + inline _From + __niter_wrap(_From __from, _To __res) + { return __from + (__res - std::__niter_base(__from)); } + + // No need to wrap, iterator already has the right type. + template<typename _Iterator> + inline _Iterator + __niter_wrap(_Iterator, _Iterator __res) + { return __res; } + // All of these auxiliary structs serve two purposes. (1) Replace // calls to copy with memmove whenever possible. (Memmove, not memcpy, // because the input and output ranges are permitted to overlap.) @@ -419,9 +433,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _OI __copy_move_a2(_II __first, _II __last, _OI __result) { - return _OI(std::__copy_move_a<_IsMove>(std::__niter_base(__first), - std::__niter_base(__last), - std::__niter_base(__result))); + return std::__niter_wrap(__result, + std::__copy_move_a<_IsMove>(std::__niter_base(__first), + std::__niter_base(__last), + std::__niter_base(__result))); } /** @@ -593,7 +608,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _BI2 __copy_move_backward_a2(_BI1 __first, _BI1 __last, _BI2 __result) { - return _BI2(std::__copy_move_backward_a<_IsMove> + return std::__niter_wrap(__result, + std::__copy_move_backward_a<_IsMove> (std::__niter_base(__first), std::__niter_base(__last), std::__niter_base(__result))); } @@ -785,7 +801,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __glibcxx_function_requires(_OutputIteratorConcept<_OI, _Tp>) __glibcxx_requires_can_increment(__first, __n); - return _OI(std::__fill_n_a(std::__niter_base(__first), __n, __value)); + return std::__niter_wrap(__first, + std::__fill_n_a(std::__niter_base(__first), __n, __value)); } template<bool _BoolType> @@ -1043,7 +1060,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO __glibcxx_function_requires(_EqualOpConcept< typename iterator_traits<_II1>::value_type, typename iterator_traits<_II2>::value_type>) - __glibcxx_requires_valid_range(__first1, __last1); + __glibcxx_requires_can_increment_range(__first1, __last1, __first2); return std::__equal_aux(std::__niter_base(__first1), std::__niter_base(__last1), diff --git a/libstdc++-v3/include/debug/stl_iterator.h b/libstdc++-v3/include/debug/stl_iterator.h index a6a2a76..f20b000 100644 --- a/libstdc++-v3/include/debug/stl_iterator.h +++ b/libstdc++-v3/include/debug/stl_iterator.h @@ -120,4 +120,17 @@ namespace __gnu_debug #endif } +namespace std +{ +_GLIBCXX_BEGIN_NAMESPACE_VERSION + + template<typename _Iterator, typename _Container, typename _Sequence> + _Iterator + __niter_base(const __gnu_debug::_Safe_iterator< + __gnu_cxx::__normal_iterator<_Iterator, _Container>, + _Sequence>&); + +_GLIBCXX_END_NAMESPACE_VERSION +} + #endif diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 802f4fd..ced5520 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -785,6 +785,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { return std::hash<_GLIBCXX_STD_C::vector<bool, _Alloc>>()(__b); } }; + template<typename _Iterator, typename _Container, typename _Sequence> + _Iterator + __niter_base(const __gnu_debug::_Safe_iterator< + __gnu_cxx::__normal_iterator<_Iterator, _Container>, + _Sequence>& __it) + { return std::__niter_base(__it.base()); } + _GLIBCXX_END_NAMESPACE_VERSION #endif |