123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- // -*- C++ -*-
- // Testing streambuf/filebuf/stringbuf for the C++ library testsuite.
- //
- // Copyright (C) 2003-2022 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/>.
- //
- #ifndef _GLIBCXX_TESTSUITE_IO_H
- #define _GLIBCXX_TESTSUITE_IO_H
- #include <ios>
- namespace __gnu_test
- {
- // Used to verify the constraints/requirements on get and put areas
- // as defined in
- // 27.5.1 - Stream buffer requirements: get and put areas
- // 27.8.1.1 - Template class basic_filebuf p 3
- // If the file is not open (ios_base::in) -> input seq. cannot be read
- // If the file is not open (ios_base::out) -> output seq. cannot be written
- // Joint file position
- // 27.8.1.4 - Overridden virtual functions p9
- // If unbuffered, pbase == pptr == NULL
- // 27.7.1.1 - Basic_stringbuf constructors p 1
- // 27.8.1.2 - Basic_filebuf constructors p 1
- // ... , initializing the base class with basic_streambuf() 27.5.2.1
- template<typename T>
- class constraint_buf
- : public T
- {
- public:
- bool
- write_position()
- {
- bool one = this->pptr() != 0;
- bool two = this->pptr() < this->epptr();
- return one && two;
- }
- bool
- read_position()
- {
- bool one = this->gptr() != 0;
- bool two = this->gptr() < this->egptr();
- return one && two;
- }
- bool
- unbuffered()
- {
- bool one = this->pbase() == 0;
- bool two = this->pptr() == 0;
- return one && two;
- }
- bool
- check_pointers()
- {
- bool one = this->eback() == 0;
- bool two = this->gptr() == 0;
- bool three = this->egptr() == 0;
- bool four = this->pbase() == 0;
- bool five = this->pptr() == 0;
- bool six = this->epptr() == 0;
- return one && two && three && four && five && six;
- }
- };
- typedef constraint_buf<std::streambuf> constraint_streambuf;
- typedef constraint_buf<std::filebuf> constraint_filebuf;
- typedef constraint_buf<std::stringbuf> constraint_stringbuf;
- #ifdef _GLIBCXX_USE_WCHAR_T
- typedef constraint_buf<std::wstreambuf> constraint_wstreambuf;
- typedef constraint_buf<std::wfilebuf> constraint_wfilebuf;
- typedef constraint_buf<std::wstringbuf> constraint_wstringbuf;
- #endif
- // Used to check if basic_streambuf::pubsync() has been called.
- // This is useful for checking if a function creates [io]stream::sentry
- // objects, since the sentry constructors call tie()->flush().
- template<typename T>
- class sync_buf
- : public T
- {
- private:
- 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.
- struct underflow_error: std::exception { };
- struct overflow_error: std::exception { };
- struct positioning_error: std::exception { };
- template<typename T>
- struct fail_buf
- : public T
- {
- typedef typename T::char_type char_type;
- typedef typename T::int_type int_type;
- typedef typename T::off_type off_type;
- typedef typename T::pos_type pos_type;
- private:
- char_type p[2];
- public:
- fail_buf()
- {
- p[0] = char_type('s');
- p[1] = char_type();
- this->setg(p, p, p + 1);
- }
- virtual int_type underflow()
- {
- throw underflow_error();
- return int_type();
- }
- virtual int_type uflow()
- {
- throw underflow_error();
- return int_type();
- }
- virtual int_type
- overflow(int_type)
- {
- throw overflow_error();
- return int_type();
- }
- 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;
- }
- };
- typedef fail_buf<std::streambuf> fail_streambuf;
- #ifdef _GLIBCXX_USE_WCHAR_T
- typedef fail_buf<std::wstreambuf> fail_wstreambuf;
- #endif
- // Facets that throw an exception for every virtual function.
- struct facet_error: std::exception { };
- template<typename T>
- class fail_num_get
- : public std::num_get<T>
- {
- typedef std::ios_base ios_base;
- typedef typename std::num_get<T>::iter_type iter_type;
- protected:
- iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, bool&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, long&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- unsigned short&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- unsigned int&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- unsigned long&) const
- { throw facet_error(); return iter_type(); }
- #ifdef _GLIBCXX_USE_LONG_LONG
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- long long&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- unsigned long long&) const
- { throw facet_error(); return iter_type(); }
- #endif
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- float&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- double&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- long double&) const
- { throw facet_error(); return iter_type(); }
- virtual iter_type
- do_get(iter_type, iter_type, ios_base&, ios_base::iostate&,
- void*&) const
- { throw facet_error(); return iter_type(); }
- };
- typedef fail_num_get<char> fail_num_get_char;
- #ifdef _GLIBCXX_USE_WCHAR_T
- typedef fail_num_get<wchar_t> fail_num_get_wchar_t;
- #endif
- template<typename T>
- class fail_num_put
- : public std::num_put<T>
- {
- 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;
- protected:
- iter_type
- do_put(iter_type, ios_base&, char_type, bool) const
- { throw facet_error(); return iter_type(0); }
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, long) const
- { throw facet_error(); return iter_type(0); }
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, unsigned long) const
- { throw facet_error(); return iter_type(0); }
- #ifdef _GLIBCXX_USE_LONG_LONG
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, long long) const
- { throw facet_error(); return iter_type(0); }
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, unsigned long long) const
- { throw facet_error(); return iter_type(0); }
- #endif
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, double) const
- { throw facet_error(); return iter_type(0); }
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, long double) const
- { throw facet_error(); return iter_type(0); }
- virtual iter_type
- do_put(iter_type, ios_base&, char_type, const void*) const
- { throw facet_error(); return iter_type(0); }
- };
- typedef fail_num_put<char> fail_num_put_char;
- #ifdef _GLIBCXX_USE_WCHAR_T
- typedef fail_num_put<wchar_t> fail_num_put_wchar_t;
- #endif
- } // namespace __gnu_test
- #endif // _GLIBCXX_TESTSUITE_IO_H
|