OSDN Git Service

2005-12-06 Paolo Carlini <pcarlini@suse.de>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 17:19:30 +0000 (17:19 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Dec 2005 17:19:30 +0000 (17:19 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108123 138bc75d-0d04-0410-961f-82ee72b054a4

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/basic_string.h
libstdc++-v3/include/bits/stl_iterator.h
libstdc++-v3/include/debug/safe_iterator.h
libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc [new file with mode: 0644]

index 12520c1..223bdd8 100644 (file)
@@ -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):
index 8623c8d..0ff2e54 100644 (file)
@@ -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);
       }
 
       /**
index 4c4630a..12b2e9c 100644 (file)
@@ -809,6 +809,12 @@ namespace __gnu_cxx
     { 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
              __n, const __normal_iterator<_Iterator, _Container>& __i)
index 0ff967e..c497c11 100644 (file)
@@ -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,
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc
new file mode 100644 (file)
index 0000000..a316cf5
--- /dev/null
@@ -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;
+}