basic_string.h (insert(iterator, _CharT), [...]): Avoid troubles with ADL, user defined operators and __normal_iterator.
2005-12-06 Paolo Carlini <pcarlini@suse.de> * include/bits/basic_string.h (insert(iterator, _CharT), erase(iterator), erase(iterator, iterator)): Avoid troubles with ADL, user defined operators and __normal_iterator. * include/bits/stl_iterator.h (operator-(const __normal_iterator <_Iterator, _Container>&, const __normal_iterator<_Iterator, _Container>&)): Add overload for left and right iterators of the same type. * include/debug/safe_iterator.h (operator-(const _Safe_iterator <_Iterator, _Sequence>&, const _Safe_iterator<_Iterator, _Sequence>&)): Likewise. * testsuite/21_strings/basic_string/types/1.cc: New. From-SVN: r108123
This commit is contained in:
parent
d1a4872d76
commit
3af22b23b3
5 changed files with 87 additions and 3 deletions
|
@ -1,3 +1,17 @@
|
|||
2005-12-06 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
* include/bits/basic_string.h (insert(iterator, _CharT),
|
||||
erase(iterator), erase(iterator, iterator)): Avoid troubles
|
||||
with ADL, user defined operators and __normal_iterator.
|
||||
* include/bits/stl_iterator.h (operator-(const __normal_iterator
|
||||
<_Iterator, _Container>&, const __normal_iterator<_Iterator,
|
||||
_Container>&)): Add overload for left and right iterators of
|
||||
the same type.
|
||||
* include/debug/safe_iterator.h (operator-(const _Safe_iterator
|
||||
<_Iterator, _Sequence>&, const _Safe_iterator<_Iterator,
|
||||
_Sequence>&)): Likewise.
|
||||
* testsuite/21_strings/basic_string/types/1.cc: New.
|
||||
|
||||
2005-12-05 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
* include/ext/sso_string_base.h (__sso_string_base<>::_M_assign):
|
||||
|
|
|
@ -1097,7 +1097,7 @@ namespace std
|
|||
const size_type __pos = __p - _M_ibegin();
|
||||
_M_replace_aux(__pos, size_type(0), size_type(1), __c);
|
||||
_M_rep()->_M_set_leaked();
|
||||
return this->_M_ibegin() + __pos;
|
||||
return iterator(_M_data() + __pos);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1138,7 +1138,7 @@ namespace std
|
|||
const size_type __pos = __position - _M_ibegin();
|
||||
_M_mutate(__pos, size_type(1), size_type(0));
|
||||
_M_rep()->_M_set_leaked();
|
||||
return _M_ibegin() + __pos;
|
||||
return iterator(_M_data() + __pos);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1158,7 +1158,7 @@ namespace std
|
|||
const size_type __pos = __first - _M_ibegin();
|
||||
_M_mutate(__pos, __last - __first, size_type(0));
|
||||
_M_rep()->_M_set_leaked();
|
||||
return _M_ibegin() + __pos;
|
||||
return iterator(_M_data() + __pos);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -808,6 +808,12 @@ namespace __gnu_cxx
|
|||
const __normal_iterator<_IteratorR, _Container>& __rhs)
|
||||
{ return __lhs.base() - __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline typename __normal_iterator<_Iterator, _Container>::difference_type
|
||||
operator-(const __normal_iterator<_Iterator, _Container>& __lhs,
|
||||
const __normal_iterator<_Iterator, _Container>& __rhs)
|
||||
{ return __lhs.base() - __rhs.base(); }
|
||||
|
||||
template<typename _Iterator, typename _Container>
|
||||
inline __normal_iterator<_Iterator, _Container>
|
||||
operator+(typename __normal_iterator<_Iterator, _Container>::difference_type
|
||||
|
|
|
@ -607,6 +607,22 @@ namespace __gnu_debug
|
|||
return __lhs.base() - __rhs.base();
|
||||
}
|
||||
|
||||
template<typename _Iterator, typename _Sequence>
|
||||
inline typename _Safe_iterator<_Iterator, _Sequence>::difference_type
|
||||
operator-(const _Safe_iterator<_Iterator, _Sequence>& __lhs,
|
||||
const _Safe_iterator<_Iterator, _Sequence>& __rhs)
|
||||
{
|
||||
_GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs._M_singular(),
|
||||
_M_message(__msg_distance_bad)
|
||||
._M_iterator(__lhs, "lhs")
|
||||
._M_iterator(__rhs, "rhs"));
|
||||
_GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs),
|
||||
_M_message(__msg_distance_different)
|
||||
._M_iterator(__lhs, "lhs")
|
||||
._M_iterator(__rhs, "rhs"));
|
||||
return __lhs.base() - __rhs.base();
|
||||
}
|
||||
|
||||
template<typename _Iterator, typename _Sequence>
|
||||
inline _Safe_iterator<_Iterator, _Sequence>
|
||||
operator+(typename _Safe_iterator<_Iterator,_Sequence>::difference_type __n,
|
||||
|
|
48
libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc
Normal file
48
libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc
Normal file
|
@ -0,0 +1,48 @@
|
|||
// 2005-12-01 Paolo Carlini <pcarlini@suse.de>
|
||||
|
||||
// Copyright (C) 2005 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 2, 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.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING. If not, write to the Free
|
||||
// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
// USA.
|
||||
|
||||
// { dg-do compile }
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace N
|
||||
{
|
||||
struct X { };
|
||||
|
||||
template<typename T>
|
||||
X operator+(T, std::size_t)
|
||||
{ return X(); }
|
||||
|
||||
template<typename T>
|
||||
X operator-(T, T)
|
||||
{ return X(); }
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::basic_string<N::X> s(5, N::X());
|
||||
|
||||
s.erase(s.begin());
|
||||
s.erase(s.begin(), s.end());
|
||||
s.insert(s.begin(), N::X());
|
||||
s.replace(s.begin(), s.end(), s.begin(), s.end());
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue