+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
__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.)
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)));
}
/**
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)));
}
__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>
__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),