diff options
author | Paolo Carlini <pcarlini@unitus.it> | 2002-04-02 12:07:07 +0000 |
---|---|---|
committer | Paolo Carlini <pcarlini@unitus.it> | 2002-04-02 12:07:07 +0000 |
commit | bb80076019482eb9eaa4e1cb784231f4bcd0d7cf (patch) | |
tree | 84110f6a4d89323263592cce80721716dec05443 /libstdc++-v3 | |
parent | 60b181cb105296dd56fc80e026e139c6ef6a745e (diff) |
2002-04-02 Paolo Carlini <pcarlini@unitus.it>
Nathan Myers <ncm@cantrip.org>
Philip Martin <philip@codematters.co.uk>
* include/bits/basic_string.h
(replace(i1, i2, _CharT* k1, _CharT* k2),
replace(i2, i2, const _CharT* k1, const _CharT* k2),
replace(i1, i2, iterator k1, iterator k2,
replace(i1, i2, const_iterator k1, const_iterator k2):
New specializations to optimize for the common cases of
pointers and iterators.
(replace(pos, n1, s, n2)): Tweak.
* include/bits/basic_string.tcc: Tweak comments.
* testsuite/21_strings/replace.cc (test04): New tests.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@51746 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 15 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 33 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.tcc | 16 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/replace.cc | 37 |
4 files changed, 87 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 1b4e77df111..a2fcd532eee 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2002-04-02 Paolo Carlini <pcarlini@unitus.it> + Nathan Myers <ncm@cantrip.org> + Philip Martin <philip@codematters.co.uk> + + * include/bits/basic_string.h + (replace(i1, i2, _CharT* k1, _CharT* k2), + replace(i2, i2, const _CharT* k1, const _CharT* k2), + replace(i1, i2, iterator k1, iterator k2, + replace(i1, i2, const_iterator k1, const_iterator k2): + New specializations to optimize for the common cases of + pointers and iterators. + (replace(pos, n1, s, n2)): Tweak. + * include/bits/basic_string.tcc: Tweak comments. + * testsuite/21_strings/replace.cc (test04): New tests. + 2002-04-01 Benjamin Kosnik <bkoz@redhat.com> libstdc++/5542 diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index f276d8976d4..ba539e7ae86 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -648,9 +648,12 @@ namespace std 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); + _M_ibegin() + __pos + __foldn1, __s, __s + __n2); + // Todo: optimized in-place replace. + else return + _M_replace(_M_ibegin() + __pos, _M_ibegin() + __pos + __foldn1, + __s, __s + __n2, + typename iterator_traits<const _CharT*>::iterator_category()); } basic_string& @@ -684,6 +687,30 @@ namespace std { return _M_replace(__i1, __i2, __k1, __k2, typename iterator_traits<_InputIterator>::iterator_category()); } + // Specializations for the common case of pointer and iterator: + // useful to avoid the overhead of temporary buffering in _M_replace. + basic_string& + replace(iterator __i1, iterator __i2, _CharT* __k1, _CharT* __k2) + { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, + __k1, __k2 - __k1); } + + basic_string& + replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2) + { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, + __k1, __k2 - __k1); } + + basic_string& + replace(iterator __i1, iterator __i2, iterator __k1, iterator __k2) + { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, + __k1.base(), __k2 - __k1); + } + + basic_string& + replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2) + { return this->replace(__i1 - _M_ibegin(), __i2 - __i1, + __k1.base(), __k2 - __k1); + } + private: template<class _InputIterator> basic_string& diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index dc6db6e1bcb..50818da602b 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -497,14 +497,10 @@ namespace std this->erase(__n); // else nothing (in particular, avoid calling _M_mutate() unnecessarily.) } - - // This is the general replace helper, which gets instantiated both - // for input-iterators and forward-iterators. It buffers internally and - // then calls _M_replace_safe. For input-iterators this is almost the - // best we can do, but for forward-iterators many optimizations could be - // conceived: f.i., when source and destination ranges do not overlap - // buffering is not really needed. In order to easily implement them, it - // could become useful to add an _M_replace(forward_iterator_tag) + + // This is the general replace helper, which currently gets instantiated both + // for input iterators and reverse iterators. It buffers internally and then + // calls _M_replace_safe. template<typename _CharT, typename _Traits, typename _Alloc> template<typename _InputIter> basic_string<_CharT, _Traits, _Alloc>& @@ -518,10 +514,8 @@ namespace std } // This is a special replace helper, which does not buffer internally - // and can be used in the "safe" situations involving forward-iterators, + // and can be used in "safe" situations involving forward iterators, // i.e., when source and destination ranges are known to not overlap. - // Presently, is called by _M_replace, by the various append and by - // the assigns. template<typename _CharT, typename _Traits, typename _Alloc> template<typename _ForwardIter> basic_string<_CharT, _Traits, _Alloc>& diff --git a/libstdc++-v3/testsuite/21_strings/replace.cc b/libstdc++-v3/testsuite/21_strings/replace.cc index aeaba190ecc..1b3cc3162f2 100644 --- a/libstdc++-v3/testsuite/21_strings/replace.cc +++ b/libstdc++-v3/testsuite/21_strings/replace.cc @@ -139,10 +139,47 @@ test03() VERIFY(str01 == "ultra"); } +// Some more tests for +// template<typename InputIter> +// string& replace(iterator it1, iterator it2, InputIter j1, InputIter j2) +void +test04() +{ + std::string str01 = "geogaddi"; + std::string str02; + + typedef std::string::iterator iterator; + typedef std::string::const_iterator const_iterator; + + iterator it1 = str01.begin(); + iterator it2 = str01.end(); + str02.replace(str02.begin(), str02.end(), it1, it2); + VERIFY(str02 == "geogaddi"); + + str02 = "boards"; + const_iterator c_it1 = str01.begin(); + const_iterator c_it2 = str01.end(); + str02.replace(str02.begin(), str02.end(), c_it1, c_it2); + VERIFY(str02 == "geogaddi"); + + str02 = "boards"; + const char* c_ptr1 = str01.c_str(); + const char* c_ptr2 = str01.c_str() + 8; + str02.replace(str02.begin(), str02.end(), c_ptr1, c_ptr2); + VERIFY(str02 == "geogaddi"); + + str02 = "boards"; + char* ptr1 = &*str01.begin(); + char* ptr2 = &*str01.end(); + str02.replace(str02.begin(), str02.end(), ptr1, ptr2); + VERIFY(str02 == "geogaddi"); +} + int main() { test01(); test02(); test03(); + test04(); return 0; } |