aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@unitus.it>2002-04-02 12:07:07 +0000
committerPaolo Carlini <pcarlini@unitus.it>2002-04-02 12:07:07 +0000
commitbb80076019482eb9eaa4e1cb784231f4bcd0d7cf (patch)
tree84110f6a4d89323263592cce80721716dec05443 /libstdc++-v3
parent60b181cb105296dd56fc80e026e139c6ef6a745e (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/ChangeLog15
-rw-r--r--libstdc++-v3/include/bits/basic_string.h33
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc16
-rw-r--r--libstdc++-v3/testsuite/21_strings/replace.cc37
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;
}