basic_string.h (operator+(basic_string<>&&, const basic_string<>&), [...]): Add.

2010-12-17  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/basic_string.h (operator+(basic_string<>&&,
	const basic_string<>&), operator+(const basic_string<>&,
	basic_string<>&&), operator+(basic_string<>&&, basic_string<>&&),
	operator+(const _CharT*, basic_string<>&&), operator+(_CharT,
	basic_string<>&&), operator+(basic_string<>&&, const _CharT*),
	operator+(basic_string<>&&, _CharT)): Add.
	* testsuite/21_strings/basic_string/operators/char/3.cc: New.
	* testsuite/21_strings/basic_string/operators/wchar_t/3.cc: Likewise.

From-SVN: r167994
This commit is contained in:
Paolo Carlini 2010-12-17 18:32:27 +00:00 committed by Paolo Carlini
parent 24de72dbe2
commit ce99f498c7
4 changed files with 241 additions and 0 deletions

View File

@ -1,3 +1,14 @@
2010-12-17 Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/basic_string.h (operator+(basic_string<>&&,
const basic_string<>&), operator+(const basic_string<>&,
basic_string<>&&), operator+(basic_string<>&&, basic_string<>&&),
operator+(const _CharT*, basic_string<>&&), operator+(_CharT,
basic_string<>&&), operator+(basic_string<>&&, const _CharT*),
operator+(basic_string<>&&, _CharT)): Add.
* testsuite/21_strings/basic_string/operators/char/3.cc: New.
* testsuite/21_strings/basic_string/operators/wchar_t/3.cc: Likewise.
2010-12-17 Paolo Carlini <paolo.carlini@oracle.com>
* aclocal.m4: Regenerate.

View File

@ -2363,6 +2363,50 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
return __str;
}
#ifdef __GXX_EXPERIMENTAL_CXX0X__
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return std::move(__lhs.append(__rhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__lhs.append(__rhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(const _CharT* __lhs,
basic_string<_CharT, _Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(_CharT __lhs, basic_string<_CharT,
_Traits, _Alloc>&& __rhs)
{ return std::move(__rhs.insert(0, 1, __lhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
const _CharT* __rhs)
{ return std::move(__lhs.append(__rhs)); }
template<typename _CharT, typename _Traits, typename _Alloc>
inline basic_string<_CharT, _Traits, _Alloc>
operator+(basic_string<_CharT, _Traits, _Alloc>&& __lhs,
_CharT __rhs)
{ return std::move(__lhs.append(1, __rhs)); }
#endif
// operator ==
/**
* @brief Test equivalence of two strings.

View File

@ -0,0 +1,93 @@
// 2010-12-17 Paolo Carlini <paolo.carlini@oracle.com>
//
// Copyright (C) 2010 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 3, 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 COPYING3. If not see
// <http://www.gnu.org/licenses/>.
//
// { dg-options "-std=gnu++0x" }
// { dg-require-string-conversions "" }
#include <string>
#include <testsuite_hooks.h>
void test01()
{
bool test __attribute__((unused)) = true;
using std::string;
VERIFY( (string("abc") + string("def")
== string("abcdef")) );
string s1("abc");
VERIFY( s1 + string("def") == string("abcdef") );
string s2("def");
VERIFY( string("abc") + s2 == string("abcdef") );
VERIFY( string("abc") + 'd' == string("abcd") );
VERIFY( string("abc") + "def" == string("abcdef") );
VERIFY( 'a' + string("bcd") == string("abcd") );
VERIFY( "abc" + string("def") == string("abcdef") );
VERIFY( (string("abcdefghij") + string("klmnopqrst")
== string("abcdefghijklmnopqrst")) );
string s1l("abcdefghij");
VERIFY( (s1l + string("klmnopqrst")
== string("abcdefghijklmnopqrst")) );
string s2l("klmnopqrst");
VERIFY( (string("abcdefghij") + s2l
== string("abcdefghijklmnopqrst")) );
VERIFY( (string("abcdefghijklmno") + 'p'
== string("abcdefghijklmnop")) );
VERIFY( (string("abcdefghijklmno") + "pqrst"
== string("abcdefghijklmnopqrst")) );
VERIFY( ('a' + string("bcdefghijklmnop")
== string("abcdefghijklmnop")) );
VERIFY( ("abcde" + string("fghijklmnopqrst")
== string("abcdefghijklmnopqrst")) );
VERIFY( (string("abcdefghijklmnopqrst") + string("uvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( (string("abcde") + string("fghijklmnopqrstuvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
string s1ll1("abcdefghijklmnopqrst");
VERIFY( (s1ll1 + string("uvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
string s1ll2("abcde");
VERIFY( (s1ll2 + string("fghijklmnopqrstuvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
string s2ll1("fghijklmnopqrstuvwxy");
VERIFY( (string("abcde") + s2ll1
== string("abcdefghijklmnopqrstuvwxy")) );
string s2ll2("uvwxy");
VERIFY( (string("abcdefghijklmnopqrst") + s2ll2
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( (string("abcdefghijklmnopqrst") + 'u'
== string("abcdefghijklmnopqrstu")) );
VERIFY( (string("abcdefghijklmnopqrst") + "uvwxy"
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( (string("abcde") + "fghijklmnopqrstuvwxy"
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( ('a' + string("bcdefghijklmnopqrstuvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( ("abcde" + string("fghijklmnopqrstuvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
VERIFY( ("abcdefghijklmnopqrst" + string("uvwxy")
== string("abcdefghijklmnopqrstuvwxy")) );
}
int main()
{
test01();
return 0;
}

View File

@ -0,0 +1,93 @@
// 2010-12-17 Paolo Carlini <paolo.carlini@oracle.com>
//
// Copyright (C) 2010 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 3, 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 COPYING3. If not see
// <http://www.gnu.org/licenses/>.
//
// { dg-options "-std=gnu++0x" }
// { dg-require-string-conversions "" }
#include <string>
#include <testsuite_hooks.h>
void test01()
{
bool test __attribute__((unused)) = true;
using std::wstring;
VERIFY( (wstring(L"abc") + wstring(L"def")
== wstring(L"abcdef")) );
wstring s1(L"abc");
VERIFY( s1 + wstring(L"def") == wstring(L"abcdef") );
wstring s2(L"def");
VERIFY( wstring(L"abc") + s2 == wstring(L"abcdef") );
VERIFY( wstring(L"abc") + L'd' == wstring(L"abcd") );
VERIFY( wstring(L"abc") + L"def" == wstring(L"abcdef") );
VERIFY( L'a' + wstring(L"bcd") == wstring(L"abcd") );
VERIFY( L"abc" + wstring(L"def") == wstring(L"abcdef") );
VERIFY( (wstring(L"abcdefghij") + wstring(L"klmnopqrst")
== wstring(L"abcdefghijklmnopqrst")) );
wstring s1l(L"abcdefghij");
VERIFY( (s1l + wstring(L"klmnopqrst")
== wstring(L"abcdefghijklmnopqrst")) );
wstring s2l(L"klmnopqrst");
VERIFY( (wstring(L"abcdefghij") + s2l
== wstring(L"abcdefghijklmnopqrst")) );
VERIFY( (wstring(L"abcdefghijklmno") + L'p'
== wstring(L"abcdefghijklmnop")) );
VERIFY( (wstring(L"abcdefghijklmno") + L"pqrst"
== wstring(L"abcdefghijklmnopqrst")) );
VERIFY( (L'a' + wstring(L"bcdefghijklmnop")
== wstring(L"abcdefghijklmnop")) );
VERIFY( (L"abcde" + wstring(L"fghijklmnopqrst")
== wstring(L"abcdefghijklmnopqrst")) );
VERIFY( (wstring(L"abcdefghijklmnopqrst") + wstring(L"uvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (wstring(L"abcde") + wstring(L"fghijklmnopqrstuvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
wstring s1ll1(L"abcdefghijklmnopqrst");
VERIFY( (s1ll1 + wstring(L"uvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
wstring s1ll2(L"abcde");
VERIFY( (s1ll2 + wstring(L"fghijklmnopqrstuvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
wstring s2ll1(L"fghijklmnopqrstuvwxy");
VERIFY( (wstring(L"abcde") + s2ll1
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
wstring s2ll2(L"uvwxy");
VERIFY( (wstring(L"abcdefghijklmnopqrst") + s2ll2
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (wstring(L"abcdefghijklmnopqrst") + L'u'
== wstring(L"abcdefghijklmnopqrstu")) );
VERIFY( (wstring(L"abcdefghijklmnopqrst") + L"uvwxy"
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (wstring(L"abcde") + L"fghijklmnopqrstuvwxy"
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (L'a' + wstring(L"bcdefghijklmnopqrstuvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (L"abcde" + wstring(L"fghijklmnopqrstuvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
VERIFY( (L"abcdefghijklmnopqrst" + wstring(L"uvwxy")
== wstring(L"abcdefghijklmnopqrstuvwxy")) );
}
int main()
{
test01();
return 0;
}