mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-03 17:44:01 +08:00
e9afbed0d6
2018-08-22 François Dumont <fdumont@gcc.gnu.org> PR libstdc++/68222 * include/debug/safe_iterator.h (_Safe_iterator<_It, _Sq, _Cat>): Add category template parameter. (_Safe_iterator<>::_Const_iterator): Remove. (_Safe_iterator<>::_IsConstant): New. (_Safe_iterator<>::_OtherIterator): New. (_Safe_iterator<_It, _Sq, _Cat>::_Safe_iterator<_MutIte>( const _Safe_iterator<_MutIte, _Sq, _Cat>&)): Add _IsConstant::__value in __gnu_cxx::__enable_if condition. (_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_to): New. (_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_from_begin): New. (_Safe_iterator<_It, _Sq, _Cat>::_M_get_distance_to_end): New. (_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag>): New. (_Safe_iterator<_It, _Sq, _Cat>::operator--()): Move... (_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag> ::operator--()): ...here. (_Safe_iterator<_It, _Sq, _Cat>::operator--(int)): Move... (_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag> ::operator--(int)): ...here. (_Safe_iterator<_It, _Sq, _Cat>::_M_decrementable()): Move... (_Safe_iterator<_It, _Sq, std::bidirectional_iterator_tag> ::_M_decrementable()): ...here. (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag>): New. (_Safe_iterator<_It, _Sq, _Cat>::operator[](const difference_type&)): Move... (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag> ::operator[](const difference_type&)): ...here. (_Safe_iterator<_It, _Sq, _Cat>::operator+=(const difference_type&)): Move... (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag> ::operator+=(const difference_type&)): ...here. (_Safe_iterator<_It, _Sq, _Cat>::operator+(const difference_type&)): Move... (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag> ::operator+(const difference_type&)): ...here. (_Safe_iterator<_It, _Sq, _Cat>::operator-=(const difference_type&)): Move... (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag> ::operator-=(const difference_type&)): ...here. (_Safe_iterator<_It, _Sq, _Cat>::operator-(const difference_type&)): Move... (_Safe_iterator<_It, _Sq, std::random_access_iterator_tag> ::operator-(const difference_type&)): ...here. (operator<(const _Safe_iterator<>&, const _Safe_iterator<>&)): Constraint to random access iterators. (operator<=(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator>(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator>=(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator-(const _Safe_iterator<>&, const _Safe_iterator<>&)): Likewise. (operator+(const difference_type&, const _Safe_iterator<>&)): Likewise. (__check_dereferenceable(const _Safe_iterator<>&)): Remove. (__get_distance): Remove. (__get_distance_from_begin): Remove. (__get_distance_to_end): Remove. (struct __is_safe_random_iterator<_Safe_iterator<>>): Remove partial specialization. (__base(const _Safe_iterator<>&, std::input_iterator_tag)): Remove. (__base(const _Safe_iterator<>&, std::random_access_iterator_tag)): Remove. (__base(const _Safe_iterator<>&)): Constraint to random access iterator. * include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_get_distance_from_begin()): New. (_Safe_iterator<>::_M_get_distance_to_end()): New. (_Safe_iterator<>::_M_get_distance_to(const _Safe_iterator<>&)): New. (_Safe_iterator<_It, _Seq, std::random_access_iterator_tag> ::_M_valid_range): New. * include/debug/safe_local_iterator.h (_Safe_local_iterator<>::_Const_local_iterator): Remove. (_Safe_local_iterator<>::_IsConstant): New. (_Safe_local_iterator<>::_OtherIterator): New. (_Safe_local_iterator<_It, _Cont>::_Safe_local_iterator<_MutIte, _Cont>( const _Safe_local_iterator<_MutIte, _Seq>&)): Add _IsConstant::__value in __gnu_cxx::__enable_if condition. If singular compare base iterator with _MutIte rather than _It. (_Safe_local_iterator<>::_S_constant): Make constexpr. (_Safe_local_iterator<>::_M_get_distance_to): New. (__check_dereferenceable(const _Safe_local_iterator<>&)): Remove. (__get_distance(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&, std::input_iterator_tag)): Remove. (__valid_range(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&)): New. * include/debug/safe_local_iterator.tcc (_Safe_local_iterator<>::_M_get_distance_to): New. * include/debug/deque (std::__debug::deque<>): Add ::__gnu_debug::_Safe_iterator<> friend declaration. * include/debug/forward_list (std::__debug::forward_list<>): Likewise. * include/debug/list (std::__debug::list<>): Likewise. * include/debug/map.h (std::__debug::map<>): Likewise. * include/debug/multimap.h (std::__debug::multimap<>): Likewise. * include/debug/set.h (std::__debug::set<>): Likewise. * include/debug/multiset.h (std::__debug::multiset<>): Likewise. * include/debug/string (std::__debug::basic_string<>): Likewise. * include/debug/unordered_map (std::__debug::unordered_map<>): Likewise and add ::__gnu_debug::_Safe_local_iterator<> friend declaration. (std::__debug::unordered_multimap<>): Likewise. * include/debug/unordered_set (std::__debug::unordered_set<>): Likewise. (std::__debug::unordered_multiset<>): Likewise. * include/debug/formatter.h: Adapt. * include/debug/helper_functions.h (__gnu_debug::_Safe_local_iterator<>): Add declaration. (__get_distance<_Ite>(_Ite, _Ite, std::random_access_iterator_tag): Pass parameter by copy. (__get_distance<_Ite>(_Ite, _Ite, std::input_iterator_tag): Likewise. (__get_distance<_Ite>(_Ite, _Ite): Likewise. (__valid_range_aux<_Integral>): Pass _Integral by copy. (__valid_range<_InputIterator>): Pass _InputIterator by copy. (__valid_range<>(const _Safe_iterator<>&, const _Safe_iterator<>&, typename _Distance_traits<>::__type&)): Declare. (__valid_range(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&, typename _Distance_traits<>::__type&)): Declare. (__valid_range<>(const _Safe_iterator<>&, const _Safe_iterator<>&)): Declare. (__valid_range(const _Safe_local_iterator<>&, const _Safe_local_iterator<>&)): Declare. (__can_advance): Adapt. (struct __is_safe_random_iterator<>): Remove. (struct _SIter_base<>): Remove. * include/debug/functions.h: Include <bits/stl_iterator.h>. (__check_dereferenceable): Remove. (__foreign_iterator_aux4, __foreign_iterator_aux3): Adapt. (__foreign_iterator_aux2, __foreign_iterator_aux): Adapt. (__foreign_iterator): Adapt. * include/debug/stl_iterator.h (__is_safe_random_iterator<std::reverse_iterator<>>): Remove. (__base(const std::reverse_iterator<_Safe_iterator<_It, _Sq>)): Constraint for random access iterators. (__niter_base): Adapt. * testsuite/util/testsuite_containers.h: Include <bits/boost_concept_check.h>. (iterator_concept_checks<_It, _Mutable, _Category>): New. (citerator<_Cont>::forward_members::forward_members()): Instantiate latter for container iterator and const_iterator. * testsuite/23_containers/list/68222_neg.cc: New. * testsuite/23_containers/vector/cons/destructible_debug_neg.cc: Adapt line number. * testsuite/23_containers/unordered_set/debug/debug_functions.cc: (test01): Remove. * testsuite/23_containers/vector/debug/debug_functions.cc (test01): Remove. From-SVN: r263786
132 lines
4.8 KiB
C++
132 lines
4.8 KiB
C++
// Debugging support implementation -*- C++ -*-
|
|
|
|
// Copyright (C) 2015-2018 Free Software Foundation, Inc.
|
|
//
|
|
// This file is part of the GNU ISO C++ Library. This library is free
|
|
// software; you can redistribute it and/or modify it under the
|
|
// terms of the GNU General Public License as published by the
|
|
// Free Software Foundation; either version 3, or (at your option)
|
|
// any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// Under Section 7 of GPL version 3, you are granted additional
|
|
// permissions described in the GCC Runtime Library Exception, version
|
|
// 3.1, as published by the Free Software Foundation.
|
|
|
|
// You should have received a copy of the GNU General Public License and
|
|
// a copy of the GCC Runtime Library Exception along with this program;
|
|
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
// <http://www.gnu.org/licenses/>.
|
|
|
|
/** @file debug/stl_iterator.h
|
|
* This file is a GNU debug extension to the Standard C++ Library.
|
|
*/
|
|
|
|
#ifndef _GLIBCXX_DEBUG_STL_ITERATOR_H
|
|
#define _GLIBCXX_DEBUG_STL_ITERATOR_H 1
|
|
|
|
#include <debug/helper_functions.h>
|
|
|
|
namespace __gnu_debug
|
|
{
|
|
// Help Debug mode to see through reverse_iterator.
|
|
template<typename _Iterator>
|
|
inline bool
|
|
__valid_range(const std::reverse_iterator<_Iterator>& __first,
|
|
const std::reverse_iterator<_Iterator>& __last,
|
|
typename _Distance_traits<_Iterator>::__type& __dist)
|
|
{ return __valid_range(__last.base(), __first.base(), __dist); }
|
|
|
|
template<typename _Iterator>
|
|
inline typename _Distance_traits<_Iterator>::__type
|
|
__get_distance(const std::reverse_iterator<_Iterator>& __first,
|
|
const std::reverse_iterator<_Iterator>& __last)
|
|
{ return __get_distance(__last.base(), __first.base()); }
|
|
|
|
template<typename _Iterator, typename _Size>
|
|
inline bool
|
|
__can_advance(const std::reverse_iterator<_Iterator>& __it, _Size __n)
|
|
{ return __can_advance(__it.base(), -__n); }
|
|
|
|
template<typename _Iterator, typename _Sequence>
|
|
inline std::reverse_iterator<_Iterator>
|
|
__base(const std::reverse_iterator<_Safe_iterator<
|
|
_Iterator, _Sequence, std::random_access_iterator_tag> >& __it)
|
|
{ return std::reverse_iterator<_Iterator>(__it.base().base()); }
|
|
|
|
#if __cplusplus < 201103L
|
|
template<typename _Iterator>
|
|
struct _Unsafe_type<std::reverse_iterator<_Iterator> >
|
|
{
|
|
typedef typename _Unsafe_type<_Iterator>::_Type _UnsafeType;
|
|
typedef std::reverse_iterator<_UnsafeType> _Type;
|
|
};
|
|
|
|
template<typename _Iterator>
|
|
inline std::reverse_iterator<typename _Unsafe_type<_Iterator>::_Type>
|
|
__unsafe(const std::reverse_iterator<_Iterator>& __it)
|
|
{
|
|
typedef typename _Unsafe_type<_Iterator>::_Type _UnsafeType;
|
|
return std::reverse_iterator<_UnsafeType>(__unsafe(__it.base()));
|
|
}
|
|
#else
|
|
template<typename _Iterator>
|
|
inline auto
|
|
__unsafe(const std::reverse_iterator<_Iterator>& __it)
|
|
-> decltype(std::__make_reverse_iterator(__unsafe(__it.base())))
|
|
{ return std::__make_reverse_iterator(__unsafe(__it.base())); }
|
|
#endif
|
|
|
|
#if __cplusplus >= 201103L
|
|
// Help Debug mode to see through move_iterator.
|
|
template<typename _Iterator>
|
|
inline bool
|
|
__valid_range(const std::move_iterator<_Iterator>& __first,
|
|
const std::move_iterator<_Iterator>& __last,
|
|
typename _Distance_traits<_Iterator>::__type& __dist)
|
|
{ return __valid_range(__first.base(), __last.base(), __dist); }
|
|
|
|
template<typename _Iterator>
|
|
inline typename _Distance_traits<_Iterator>::__type
|
|
__get_distance(const std::move_iterator<_Iterator>& __first,
|
|
const std::move_iterator<_Iterator>& __last)
|
|
{ return __get_distance(__first.base(), __last.base()); }
|
|
|
|
template<typename _Iterator, typename _Size>
|
|
inline bool
|
|
__can_advance(const std::move_iterator<_Iterator>& __it, _Size __n)
|
|
{ return __can_advance(__it.base(), __n); }
|
|
|
|
template<typename _Iterator>
|
|
inline auto
|
|
__unsafe(const std::move_iterator<_Iterator>& __it)
|
|
-> decltype(std::make_move_iterator(__unsafe(__it.base())))
|
|
{ return std::make_move_iterator(__unsafe(__it.base())); }
|
|
|
|
template<typename _Iterator>
|
|
inline auto
|
|
__base(const std::move_iterator<_Iterator>& __it)
|
|
-> decltype(std::make_move_iterator(__base(__it.base())))
|
|
{ return std::make_move_iterator(__base(__it.base())); }
|
|
#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, std::random_access_iterator_tag>&);
|
|
|
|
_GLIBCXX_END_NAMESPACE_VERSION
|
|
}
|
|
|
|
#endif
|