testsuite_io.h (class sync_buf): New, templatized version of sync_streambuf; add typedefs for streambuf/wstreambuf.

2004-12-02  Paolo Carlini  <pcarlini@suse.de>

	* testsuite/testsuite_io.h (class sync_buf): New, templatized
	version of sync_streambuf; add typedefs for streambuf/wstreambuf.
	(class fail_buf): Likewise, for fail_streambuf.
	(class fail_num_get): Templatize and add char/wchar_t typedefs.
	(class fail_num_put): Likewise.
	* testsuite/27_io/basic_istream/extractors_arithmetic/char/
	exceptions_badbit_throw.cc: Use the latter.
	* testsuite/27_io/basic_istream/extractors_arithmetic/char/
	exceptions_failbit_throw.cc: Likewise.
	* testsuite/27_io/basic_ostream/inserters_arithmetic/char/
	exceptions_badbit_throw.cc: Likewise.
	* testsuite/27_io/basic_ostream/inserters_arithmetic/char/
	exceptions_failbit_throw.cc: Likewise.

From-SVN: r91635
This commit is contained in:
Paolo Carlini 2004-12-02 13:24:46 +00:00 committed by Paolo Carlini
parent 1afffb0073
commit 9b8d9ac39f
6 changed files with 209 additions and 158 deletions

View File

@ -1,3 +1,19 @@
2004-12-02 Paolo Carlini <pcarlini@suse.de>
* testsuite/testsuite_io.h (class sync_buf): New, templatized
version of sync_streambuf; add typedefs for streambuf/wstreambuf.
(class fail_buf): Likewise, for fail_streambuf.
(class fail_num_get): Templatize and add char/wchar_t typedefs.
(class fail_num_put): Likewise.
* testsuite/27_io/basic_istream/extractors_arithmetic/char/
exceptions_badbit_throw.cc: Use the latter.
* testsuite/27_io/basic_istream/extractors_arithmetic/char/
exceptions_failbit_throw.cc: Likewise.
* testsuite/27_io/basic_ostream/inserters_arithmetic/char/
exceptions_badbit_throw.cc: Likewise.
* testsuite/27_io/basic_ostream/inserters_arithmetic/char/
exceptions_failbit_throw.cc: Likewise.
2004-12-01 Paolo Carlini <pcarlini@suse.de> 2004-12-01 Paolo Carlini <pcarlini@suse.de>
* testsuite/27_io/basic_istream/get/wchar_t/1.cc: New. * testsuite/27_io/basic_istream/get/wchar_t/1.cc: New.

View File

@ -1,6 +1,6 @@
// 2003-03-08 Jerry Quinn <jlquinn@optonline.net> // 2003-03-08 Jerry Quinn <jlquinn@optonline.net>
// Copyright (C) 2003 Free Software Foundation, Inc. // Copyright (C) 2003, 2004 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // 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 // software; you can redistribute it and/or modify it under the
@ -30,7 +30,7 @@ void test_badbit()
using namespace std; using namespace std;
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
locale loc(locale::classic(), new __gnu_test::fail_num_get); locale loc(locale::classic(), new __gnu_test::fail_num_get_char);
istringstream stream("jaylib - champion sound"); istringstream stream("jaylib - champion sound");
stream.imbue(loc); stream.imbue(loc);

View File

@ -1,5 +1,4 @@
// Copyright (C) 2003 // Copyright (C) 2003, 2004 Free Software Foundation, Inc.
// Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // 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 // software; you can redistribute it and/or modify it under the
@ -37,7 +36,7 @@ void test_failbit()
using namespace std; using namespace std;
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
locale loc(locale::classic(), new __gnu_test::fail_num_get); locale loc(locale::classic(), new __gnu_test::fail_num_get_char);
istringstream stream("jaylib - champion sound"); istringstream stream("jaylib - champion sound");
stream.imbue(loc); stream.imbue(loc);

View File

@ -30,7 +30,7 @@ void test_badbit()
using namespace std; using namespace std;
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
locale loc(locale::classic(), new __gnu_test::fail_num_put); locale loc(locale::classic(), new __gnu_test::fail_num_put_char);
ostringstream stream("jaylib - champion sound"); ostringstream stream("jaylib - champion sound");
stream.imbue(loc); stream.imbue(loc);

View File

@ -37,7 +37,7 @@ void test_failbit()
using namespace std; using namespace std;
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
locale loc(locale::classic(), new __gnu_test::fail_num_put); locale loc(locale::classic(), new __gnu_test::fail_num_put_char);
ostringstream stream("jaylib - champion sound"); ostringstream stream("jaylib - champion sound");
stream.imbue(loc); stream.imbue(loc);

View File

@ -103,189 +103,225 @@ namespace __gnu_test
// Used to check if basic_streambuf::pubsync() has been called. // Used to check if basic_streambuf::pubsync() has been called.
// This is useful for checking if a function creates [io]stream::sentry // This is useful for checking if a function creates [io]stream::sentry
// objects, since the sentry constructors call tie()->flush(). // objects, since the sentry constructors call tie()->flush().
class sync_streambuf : public std::streambuf template<typename T>
{ class sync_buf
private: : public T
bool m_sync_called;
public:
sync_streambuf()
: m_sync_called(false)
{ }
bool sync_called() const
{ return m_sync_called; }
protected:
int sync()
{ {
m_sync_called = true; private:
return 0; bool m_sync_called;
}
}; public:
sync_buf()
: m_sync_called(false)
{ }
bool sync_called() const
{ return m_sync_called; }
protected:
int sync()
{
m_sync_called = true;
return 0;
}
};
typedef sync_buf<std::streambuf> sync_streambuf;
#ifdef _GLIBCXX_USE_WCHAR_T
typedef sync_buf<std::wstreambuf> sync_wstreambuf;
#endif
// Throws on all overflow and underflow calls. // Throws on all overflow and underflow calls.
struct underflow_error: std::exception { }; struct underflow_error: std::exception { };
struct overflow_error: std::exception { }; struct overflow_error: std::exception { };
struct positioning_error: std::exception { }; struct positioning_error: std::exception { };
struct fail_streambuf : std::streambuf template<typename T>
{ struct fail_buf
private: : public T
char p[2];
public:
fail_streambuf()
{ {
p[0] = 's'; typedef typename T::char_type char_type;
p[1] = char(); typedef typename T::int_type int_type;
setg(p, p, p + 1); typedef typename T::off_type off_type;
} typedef typename T::pos_type pos_type;
virtual int_type underflow() private:
{ char_type p[2];
throw underflow_error();
return -1;
}
virtual int_type uflow()
{
throw underflow_error();
return -1;
}
virtual int_type public:
overflow(int_type) fail_buf()
{ {
throw overflow_error(); p[0] = char_type('s');
return -1; p[1] = char_type();
} setg(p, p, p + 1);
}
virtual pos_type virtual int_type underflow()
seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode) {
{ throw underflow_error();
throw positioning_error(); return -1;
return pos_type(off_type(-1)); }
}
virtual int_type uflow()
virtual pos_type {
seekpos(pos_type, std::ios_base::openmode) throw underflow_error();
{ return -1;
throw positioning_error(); }
return pos_type(off_type(-1));
} virtual int_type
overflow(int_type)
{
throw overflow_error();
return -1;
}
virtual pos_type
seekoff(off_type, std::ios_base::seekdir, std::ios_base::openmode)
{
throw positioning_error();
return pos_type(off_type(-1));
}
virtual pos_type
seekpos(pos_type, std::ios_base::openmode)
{
throw positioning_error();
return pos_type(off_type(-1));
}
virtual int
sync()
{
throw positioning_error();
return 0;
}
};
virtual int typedef fail_buf<std::streambuf> fail_streambuf;
sync() #ifdef _GLIBCXX_USE_WCHAR_T
{ typedef fail_buf<std::wstreambuf> fail_wstreambuf;
throw positioning_error(); #endif
return 0;
}
};
// Facets that throw an exception for every virtual function. // Facets that throw an exception for every virtual function.
struct facet_error: std::exception { }; struct facet_error: std::exception { };
class fail_num_get : public std::num_get<char> template<typename T>
{ class fail_num_get
typedef std::ios_base ios_base; : public std::num_get<T>
{
typedef std::ios_base ios_base;
typedef typename std::num_get<T>::iter_type iter_type;
protected: protected:
iter_type iter_type
do_get(iter_type a, iter_type, ios_base&, ios_base::iostate&, bool&) const do_get(iter_type a, iter_type, ios_base&, ios_base::iostate&, bool&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
unsigned short&) const unsigned short&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
unsigned int&) const unsigned int&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
unsigned long&) const unsigned long&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
#ifdef _GLIBCXX_USE_LONG_LONG #ifdef _GLIBCXX_USE_LONG_LONG
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
long long&) const long long&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
unsigned long long&) const unsigned long long&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
#endif #endif
virtual iter_type virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
float&) const float&) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(); }
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
double&) const
{ throw facet_error(); return iter_type(); }
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
long double&) const
{ throw facet_error(); return iter_type(); }
virtual iter_type
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
void*&) const
{ throw facet_error(); return iter_type(); }
};
virtual iter_type typedef fail_num_get<char> fail_num_get_char;
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, #ifdef _GLIBCXX_USE_WCHAR_T
double&) const typedef fail_num_get<wchar_t> fail_num_get_wchar_t;
{ throw facet_error(); return iter_type(); } #endif
virtual iter_type template<typename T>
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, class fail_num_put
long double&) const : public std::num_put<T>
{ throw facet_error(); return iter_type(); } {
typedef std::ios_base ios_base;
typedef typename std::num_put<T>::iter_type iter_type;
typedef typename std::num_put<T>::char_type char_type;
virtual iter_type protected:
do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, iter_type
void*&) const do_put(iter_type, ios_base&, char_type __fill, bool __v) const
{ throw facet_error(); return iter_type(); } { throw facet_error(); return iter_type(NULL); }
};
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, long __v) const
{ throw facet_error(); return iter_type(NULL); }
class fail_num_put : public std::num_put<char> virtual iter_type
{ do_put(iter_type, ios_base&, char_type __fill, unsigned long) const
typedef std::ios_base ios_base; { throw facet_error(); return iter_type(NULL); }
protected:
iter_type
do_put(iter_type, ios_base&, char_type __fill, bool __v) const
{ throw facet_error(); return iter_type(NULL); }
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, long __v) const
{ throw facet_error(); return iter_type(NULL); }
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, unsigned long) const
{ throw facet_error(); return iter_type(NULL); }
#ifdef _GLIBCXX_USE_LONG_LONG #ifdef _GLIBCXX_USE_LONG_LONG
virtual iter_type virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, long long __v) const do_put(iter_type, ios_base&, char_type __fill, long long __v) const
{ throw facet_error(); return iter_type(NULL); } { throw facet_error(); return iter_type(NULL); }
virtual iter_type virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const
{ throw facet_error(); return iter_type(NULL); } { throw facet_error(); return iter_type(NULL); }
#endif #endif
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, double __v) const
{ throw facet_error(); return iter_type(NULL); }
virtual iter_type virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, double __v) const do_put(iter_type, ios_base&, char_type __fill, long double __v) const
{ throw facet_error(); return iter_type(NULL); } { throw facet_error(); return iter_type(NULL); }
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, const void* __v) const
{ throw facet_error(); return iter_type(NULL); }
};
virtual iter_type typedef fail_num_put<char> fail_num_put_char;
do_put(iter_type, ios_base&, char_type __fill, long double __v) const #ifdef _GLIBCXX_USE_WCHAR_T
{ throw facet_error(); return iter_type(NULL); } typedef fail_num_put<wchar_t> fail_num_put_wchar_t;
#endif
virtual iter_type
do_put(iter_type, ios_base&, char_type __fill, const void* __v) const
{ throw facet_error(); return iter_type(NULL); }
};
}; // namespace __gnu_test }; // namespace __gnu_test
#endif // _GLIBCXX_TESTSUITE_IO_H #endif // _GLIBCXX_TESTSUITE_IO_H