basic_string.h (replace(i1, i2, _CharT* k1, _CharT* k2), [...]): New specializations to optimize for the common cases of pointers and iterators.
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. Co-Authored-By: Nathan Myers <ncm@cantrip.org> Co-Authored-By: Philip Martin <philip@codematters.co.uk> From-SVN: r51746
This commit is contained in:
parent
a14713223f
commit
418bb88063
4 changed files with 87 additions and 14 deletions
|
@ -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
|
||||
|
|
|
@ -649,8 +649,11 @@ namespace std
|
|||
|| 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);
|
||||
// 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&
|
||||
|
|
|
@ -498,13 +498,9 @@ namespace std
|
|||
// 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>&
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue