blob: 3d7c70268ade739eb93681ba3e1cc8efb8ad8c36 [file] [log] [blame]
// Copyright (C) 2018-2021 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 "-Wno-deprecated" }
// { dg-do run { target c++11 } }
#include <strstream>
#include <testsuite_hooks.h>
void
test01()
{
std::istrstream is("15 16");
std::istrstream is2 = std::move(is);
int a;
is >> a;
VERIFY( !is );
is2 >> a;
VERIFY( is2 );
VERIFY( a == 15 );
std::istrstream is3 = std::move(is2);
int b;
is2 >> b;
VERIFY( !is2 );
is3 >> b;
VERIFY( is3 );
VERIFY( b == 16 );
}
void
test02()
{
std::istrstream is("");
int a;
is >> a;
VERIFY( !is );
is = std::istrstream("17 18");
is >> a;
VERIFY( is );
VERIFY( a == 17 );
is = std::istrstream("");
int b;
is >> b;
VERIFY( !is );
}
void
test03()
{
std::ostrstream os;
os << "a few chars"; // fits in initial allocation
char* s = os.str(); // os now frozen
std::ostrstream os2 = std::move(os);
VERIFY( os2.str() == s );
VERIFY( os.str() == nullptr );
os2.freeze(false);
os2 << "enough additional chars to force a reallocation";
VERIFY( os2 );
s = os2.str(); // os2 now frozen
std::ostrstream os3 = std::move(os2);
VERIFY( os3.str() == s );
VERIFY( os2.str() == nullptr );
delete[] s;
}
void
test04()
{
char buf[16];
std::ostrstream os(buf, sizeof(buf));
os << "a few chars";
char* s = os.str(); // os now frozen
VERIFY( s == buf );
std::ostrstream os2 = std::move(os);
VERIFY( os2.str() == s );
VERIFY( os.str() == nullptr );
os2.freeze(false);
os2 << "enough additional chars to force a reallocation";
VERIFY( !os2 );
s = os2.str(); // os2 now frozen
VERIFY( s == buf );
std::ostrstream os3 = std::move(os2);
VERIFY( os3.str() == s );
VERIFY( os2.str() == nullptr );
}
void
test05()
{
char buf[] = "0123456789";
std::ostrstream os(buf, 1);
os << "aa";
VERIFY( !os );
os = std::ostrstream(buf, 10);
os << "some chars";
VERIFY( os );
VERIFY( os.pcount() == 10 );
os << "a";
VERIFY( !os );
os = std::ostrstream();
os << "a";
VERIFY( os );
VERIFY( os.pcount() == 1 );
char* s = os.str(); // os now frozen
os = std::ostrstream();
os.freeze(false); // no effect
delete[] s;
}
void
test06()
{
char buf[] = "15 16";
std::strstream ss(buf, 5, std::ios::in|std::ios::app);
std::strstream ss2 = std::move(ss);
int a;
ss >> a;
VERIFY( !ss );
ss2 >> a;
VERIFY( ss2 );
VERIFY( a == 15 );
std::strstream ss3 = std::move(ss2);
int b;
ss2 >> b;
VERIFY( !ss2 );
ss3 >> b;
VERIFY( ss3 );
VERIFY( b == 16 );
}
void
test07()
{
std::strstream ss;
int a;
ss >> a;
VERIFY( !ss );
char buf[] = "17 18";
ss = std::strstream(buf, 5, std::ios::in|std::ios::app);
ss >> a;
VERIFY( ss );
VERIFY( a == 17 );
ss = std::strstream();
int b;
ss >> b;
VERIFY( !ss );
}
void
test08()
{
std::strstream ss;
ss << "a few chars"; // fits in initial allocation
char* s = ss.str(); // ss now frozen
std::strstream ss2 = std::move(ss);
VERIFY( ss2.str() == s );
VERIFY( ss.str() == nullptr );
ss2.freeze(false);
ss2 << "enough additional chars to force a reallocation";
VERIFY( ss2 );
s = ss2.str(); // ss2 now frozen
std::strstream ss3 = std::move(ss2);
VERIFY( ss3.str() == s );
VERIFY( ss2.str() == nullptr );
delete[] s;
}
void
test09()
{
char buf[16];
std::strstream ss(buf, sizeof(buf));
ss << "a few chars";
char* s = ss.str(); // ss now frozen
VERIFY( s == buf );
std::strstream ss2 = std::move(ss);
VERIFY( ss2.str() == s );
VERIFY( ss.str() == nullptr );
ss2.freeze(false);
ss2 << "enough additional chars to force a reallocation";
VERIFY( !ss2 );
s = ss2.str(); // ss2 now frozen
VERIFY( s == buf );
std::strstream ss3 = std::move(ss2);
VERIFY( ss3.str() == s );
VERIFY( ss2.str() == nullptr );
}
void
test10()
{
char buf[] = "0123456789";
std::strstream ss(buf, 1);
ss << "aa";
VERIFY( !ss );
ss = std::strstream(buf, 10);
ss << "some chars";
VERIFY( ss );
VERIFY( ss.pcount() == 10 );
ss << "a";
VERIFY( !ss );
ss = std::strstream();
ss << "a";
VERIFY( ss );
VERIFY( ss.pcount() == 1 );
char* s = ss.str(); // ss now frozen
ss = std::strstream();
ss.freeze(false); // no effect
delete[] s;
}
int
main()
{
test01();
test02();
test03();
test04();
test05();
test06();
test07();
test08();
test09();
test10();
}