diff options
author | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-14 19:04:15 +0000 |
---|---|---|
committer | paolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-01-14 19:04:15 +0000 |
commit | ee73b234fecc4e51b3b5bbbcbd97127d78ea71f8 (patch) | |
tree | caa42f7b432dd4506dde01e7d8c7e1563d243029 | |
parent | 9f4d041d17d18b6d53a0c5edd0a47f8db66ece85 (diff) | |
download | gcc-ee73b234fecc4e51b3b5bbbcbd97127d78ea71f8.tar.gz |
2002-01-14 Paolo Carlini <pcarlini@unitus.it>
Nathan Myers <ncm@cantrip.org>
* include/bits/basic_string.h
(replace(__pos, __n1, __s, __n2)): Optimize by avoiding
temporaries (i.e., call _M_replace_safe) when possible.
(replace(__pos, __n, __str)): Call replace(__pos, __n1, __s, __n2).
(replace(__pos, __n1, __s)): Call replace(__pos, __n1, __s , __n2).
(replace(__i1, __i2, __str)): Call replace(__i1, __i2, __s, __n).
(replace(__i1, __i2, __s)): Call replace(__i1, __i2, __s, __n).
(replace(__i1, __i2, __s, __n)): Call replace(__pos1, __n1, __s, __n2).
* include/bits/basic_string.tcc
(replace(__pos1, __n1, __str, __pos2, __n2)): Call
replace(__pos, __n1, __s, __n2).
* testsuite/21_strings/replace.cc (test03): New testcases.
* include/bits/basic_string.h (insert(__pos, __s, __n)):
Adjust comparison wrt overflow.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@48834 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libstdc++-v3/ChangeLog | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 41 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.tcc | 13 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/replace.cc | 46 |
4 files changed, 95 insertions, 24 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cd8fe593477..ecd575702a0 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,22 @@ +2002-01-14 Paolo Carlini <pcarlini@unitus.it> + Nathan Myers <ncm@cantrip.org> + + * include/bits/basic_string.h + (replace(__pos, __n1, __s, __n2)): Optimize by avoiding + temporaries (i.e., call _M_replace_safe) when possible. + (replace(__pos, __n, __str)): Call replace(__pos, __n1, __s, __n2). + (replace(__pos, __n1, __s)): Call replace(__pos, __n1, __s , __n2). + (replace(__i1, __i2, __str)): Call replace(__i1, __i2, __s, __n). + (replace(__i1, __i2, __s)): Call replace(__i1, __i2, __s, __n). + (replace(__i1, __i2, __s, __n)): Call replace(__pos1, __n1, __s, __n2). + * include/bits/basic_string.tcc + (replace(__pos1, __n1, __str, __pos2, __n2)): Call + replace(__pos, __n1, __s, __n2). + * testsuite/21_strings/replace.cc (test03): New testcases. + + * include/bits/basic_string.h (insert(__pos, __s, __n)): + Adjust comparison wrt overflow. + 2002-01-12 Benjamin Kosnik <bkoz@redhat.com> * include/Makefile.am (std_headers_rename): New variable. diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index d25d9def39b..5756e9eac44 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -1,6 +1,7 @@ // Components for manipulating sequences of characters -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 +// 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 @@ -551,7 +552,7 @@ namespace std const size_type __size = this->size(); if (__pos > __size) __throw_out_of_range("basic_string::insert"); - if (__n + __size > this->max_size()) + if (__size > this->max_size() - __n) __throw_length_error("basic_string::insert"); if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data()) || less<const _CharT*>()(_M_data() + __size, __s)) @@ -626,10 +627,7 @@ namespace std basic_string& replace(size_type __pos, size_type __n, const basic_string& __str) - { - return this->replace(_M_check(__pos), _M_fold(__pos, __n), - __str.begin(), __str.end()); - } + { return this->replace(__pos, __n, __str._M_data(), __str.size()); } basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, @@ -639,36 +637,41 @@ namespace std replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2) { - return this->replace(_M_check(__pos), _M_fold(__pos, __n1), - __s, __s + __n2); + const size_type __size = this->size(); + if (__pos > __size) + __throw_out_of_range("basic_string::replace"); + if (__size - __n1 > this->max_size() - __n2) + __throw_length_error("basic_string::replace"); + const bool __testn1 = __n1 < __size - __pos; + const size_type __foldn1 = __testn1 ? __n1 : __size - __pos; + if (_M_rep()->_M_is_shared() || less<const _CharT*>()(__s, _M_data()) + || less<const _CharT*>()(_M_data() + __size, __s)) + return _M_replace_safe(_M_ibegin() + __pos, + _M_ibegin() + __pos + __foldn1, __s, __s + __n2); + else return this->replace(_M_check(__pos), _M_fold(__pos, __n1), + __s, __s + __n2); } basic_string& replace(size_type __pos, size_type __n1, const _CharT* __s) - { - return this->replace(_M_check(__pos), _M_fold(__pos, __n1), - __s, __s + traits_type::length(__s)); - } + { return this->replace(__pos, __n1, __s, traits_type::length(__s)); } basic_string& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c) - { - return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); - } + { return this->replace(_M_check(__pos), _M_fold(__pos, __n1), __n2, __c); } basic_string& replace(iterator __i1, iterator __i2, const basic_string& __str) - { return this->replace(__i1, __i2, __str.begin(), __str.end()); } + { return this->replace(__i1, __i2, __str._M_data(), __str.size()); } basic_string& replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n) - { return this->replace(__i1, __i2, __s, __s + __n); } + { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, __s, __n); } basic_string& replace(iterator __i1, iterator __i2, const _CharT* __s) - { return this->replace(__i1, __i2, __s, - __s + traits_type::length(__s)); } + { return this->replace(__i1, __i2, __s, traits_type::length(__s)); } basic_string& replace(iterator __i1, iterator __i2, size_type __n, _CharT __c); diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index 63a9864a9d0..b57c7f642f9 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -1,6 +1,7 @@ // Components for manipulating sequences of characters -*- C++ -*- -// Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. +// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 +// 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 @@ -543,9 +544,13 @@ namespace std replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) { - return this->replace(_M_check(__pos1), _M_fold(__pos1, __n1), - __str._M_check(__pos2), - __str._M_fold(__pos2, __n2)); + const size_type __strsize = __str.size(); + if (__pos2 > __strsize) + __throw_out_of_range("basic_string::replace"); + const bool __testn2 = __n2 < __strsize - __pos2; + const size_type __foldn2 = __testn2 ? __n2 : __strsize - __pos2; + return this->replace(__pos1, __n1, + __str._M_data() + __pos2, __foldn2); } template<typename _CharT, typename _Traits, typename _Alloc> diff --git a/libstdc++-v3/testsuite/21_strings/replace.cc b/libstdc++-v3/testsuite/21_strings/replace.cc index b42ae8d3fa6..aeaba190ecc 100644 --- a/libstdc++-v3/testsuite/21_strings/replace.cc +++ b/libstdc++-v3/testsuite/21_strings/replace.cc @@ -1,6 +1,6 @@ // 1999-06-10 bkoz -// Copyright (C) 1994, 1999 Free Software Foundation, Inc. +// Copyright (C) 1994, 1999, 2001, 2002 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 @@ -96,9 +96,53 @@ test02() VERIFY(aux == "../the lone long pier/Hanr/Hanalei Bay/Kauai/Hawaii"); } +// Some more miscellaneous tests +void +test03() +{ + const char* title01 = "nine types of ambiguity"; + const char* title02 = "ultra"; + std::string str01 = title01; + std::string str02 = title02; + + str01.replace(0, 4, str02); + VERIFY(str01 == "ultra types of ambiguity"); + + str01.replace(15, 9, str02, 2, 2); + VERIFY(str01 == "ultra types of tr"); + + str01 = title01; + str02.replace(0, 0, str01, 0, std::string::npos); + VERIFY(str02 == "nine types of ambiguityultra"); + + str02.replace(11, 2, title02, 5); + VERIFY(str02 == "nine types ultra ambiguityultra"); + + str02.replace(11, 5, title01, 2); + VERIFY(str02 == "nine types ni ambiguityultra"); + + str01.replace(str01.size(), 0, title02); + VERIFY(str01 == "nine types of ambiguityultra"); + + str01 = title01; + str02 = title02; + str01.replace(str01.begin(), str01.end(), str02); + VERIFY(str01 == "ultra"); + + str01.replace(str01.begin(), str01.begin(), title01, 4); + VERIFY(str01 == "nineultra"); + + str01.replace(str01.end(), str01.end(), title01 + 5, 5); + VERIFY(str01 == "nineultratypes"); + + str01.replace(str01.begin(), str01.end(), title02); + VERIFY(str01 == "ultra"); +} + int main() { test01(); test02(); + test03(); return 0; } |