mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			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
	
	 François Dumont
						François Dumont