// -*- C++ -*-
// Testing streambuf/filebuf/stringbuf for the C++ library testsuite.
//
// Copyright (C) 2003, 2004 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 2, 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 COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
//
// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

#ifndef _GLIBCXX_TESTSUITE_IO_H
#define _GLIBCXX_TESTSUITE_IO_H

#include <fstream>
#include <sstream>

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() != NULL; 
	bool two = this->pptr() < this->epptr();
	return one && two;
      }
      
      bool
      read_position()
      { 
	bool one = this->gptr() != NULL; 
	bool two = this->gptr() < this->egptr();
	return one && two;
      }
      
      bool
      unbuffered() 
      { 
	bool one = this->pbase() == NULL; 
	bool two = this->pptr() == NULL; 
	return one && two;
      }
  
      bool
      check_pointers()
      {
	bool one   = this->eback() == NULL;
	bool two   = this->gptr() == NULL;
	bool three = this->egptr() == NULL;
	
	bool four  = this->pbase() == NULL;
	bool five  = this->pptr() == NULL;
	bool six   = this->epptr() == NULL;
	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();
	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 a, 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& __err, 
	     unsigned short&) const
      { throw facet_error(); return iter_type(); }
      
      virtual iter_type 
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, 
	     unsigned int&) const
      { throw facet_error(); return iter_type(); }
      
      virtual iter_type 
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, 
	     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& __err, 
	     long long&) const
      { throw facet_error(); return iter_type(); }
      
      virtual iter_type 
      do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err, 
	     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& __err, 
	     float&) const
      { 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(); }
    };

  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 __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 
      virtual iter_type 
      do_put(iter_type, ios_base&, char_type __fill, long long __v) const
      { throw facet_error(); return iter_type(NULL); }

      virtual iter_type 
      do_put(iter_type, ios_base&, char_type __fill, unsigned long long) const
      { throw facet_error(); return iter_type(NULL); }
#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 
      do_put(iter_type, ios_base&, char_type __fill, long double __v) const
      { 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); }
    };

  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

