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
This commit is contained in:
parent
42a98b43bb
commit
315aadc864
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue