/* 
   For wchar support, you need to include the wchar.i file
   before this file, ie:
   
   %include <wchar.i>
   %include <std_sstream.i>

   or equivalently, just include

   %include <std_wsstream.i>
*/

%include <std_alloc.i>
%include <std_basic_string.i>
%include <std_string.i>
%include <std_ios.i>
#if defined(SWIG_WCHAR)
%include <std_wstring.i>
#endif
%include <std_streambuf.i>
%include <std_iostream.i>

%{
#include <sstream>
%}


namespace std
{
  template<typename _CharT, typename _Traits = char_traits<_CharT>,
	   typename _Alloc = allocator<_CharT> >
    class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
    {
    public:
      // Types:
      typedef _CharT 					char_type;
      typedef _Traits 					traits_type;
// 251. basic_stringbuf missing allocator_type
      typedef _Alloc				       	allocator_type;
      typedef typename traits_type::int_type 		int_type;
      typedef typename traits_type::pos_type 		pos_type;
      typedef typename traits_type::off_type 		off_type;

    public:
      // Constructors:
      explicit
      basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out);

      explicit
      basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __str,
		      ios_base::openmode __mode = ios_base::in | ios_base::out);

      // Get and set:
      basic_string<_CharT, _Traits, _Alloc>
      str() const;

      void
      str(const basic_string<_CharT, _Traits, _Alloc>& __s);

    };


  // 27.7.2  Template class basic_istringstream
  template<typename _CharT, typename _Traits = char_traits<_CharT>,
	   typename _Alloc = allocator<_CharT> >
  class basic_istringstream : public basic_istream<_CharT, _Traits>
  {
    public:
      // Types:
      typedef _CharT 					char_type;
      typedef _Traits 					traits_type;
// 251. basic_stringbuf missing allocator_type
      typedef _Alloc				       	allocator_type;
      typedef typename traits_type::int_type 		int_type;
      typedef typename traits_type::pos_type 		pos_type;
      typedef typename traits_type::off_type 		off_type;


    public:
      // Constructors:
      explicit
      basic_istringstream(ios_base::openmode __mode = ios_base::in);

      explicit
      basic_istringstream(const basic_string<_CharT, _Traits, _Alloc>& __str,
			  ios_base::openmode __mode = ios_base::in);

      ~basic_istringstream();

      // Members:
      basic_stringbuf<_CharT, _Traits, _Alloc>*
      rdbuf() const;

      basic_string<_CharT, _Traits, _Alloc>
      str() const;

      void
      str(const basic_string<_CharT, _Traits, _Alloc>& __s);
    };


  // 27.7.3  Template class basic_ostringstream
  template<typename _CharT, typename _Traits = char_traits<_CharT>,
	   typename _Alloc = allocator<_CharT> >
  class basic_ostringstream : public basic_ostream<_CharT, _Traits>
  {
    public:
      // Types:
      typedef _CharT 					char_type;
      typedef _Traits 					traits_type;
// 251. basic_stringbuf missing allocator_type
      typedef _Alloc				       	allocator_type;
      typedef typename traits_type::int_type 		int_type;
      typedef typename traits_type::pos_type 		pos_type;
      typedef typename traits_type::off_type 		off_type;


    public:
     // Constructors/destructor:
      explicit
      basic_ostringstream(ios_base::openmode __mode = ios_base::out);

      explicit
      basic_ostringstream(const basic_string<_CharT, _Traits, _Alloc>& __str,
			  ios_base::openmode __mode = ios_base::out);

      ~basic_ostringstream();

      // Members:
      basic_stringbuf<_CharT, _Traits, _Alloc>*
      rdbuf() const;

      basic_string<_CharT, _Traits, _Alloc>
      str() const;

#if 0
      void
      str(const basic_string<_CharT, _Traits, _Alloc>& __s);
#endif
    };


  // 27.7.4  Template class basic_stringstream
  template<typename _CharT, typename _Traits = char_traits<_CharT>,
	   typename _Alloc = allocator<_CharT> >
  class basic_stringstream : public basic_iostream<_CharT, _Traits>
  {
    public:
      // Types:
      typedef _CharT 					char_type;
      typedef _Traits 					traits_type;
// 251. basic_stringbuf missing allocator_type
      typedef _Alloc				       	allocator_type;
      typedef typename traits_type::int_type 		int_type;
      typedef typename traits_type::pos_type 		pos_type;
      typedef typename traits_type::off_type 		off_type;

    public:
      // Constructors/destructors
      explicit
      basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in);

      explicit
      basic_stringstream(const basic_string<_CharT, _Traits, _Alloc>& __str,
			 ios_base::openmode __m = ios_base::out | ios_base::in);

      ~basic_stringstream();

      // Members:
      basic_stringbuf<_CharT, _Traits, _Alloc>*
      rdbuf() const;

      basic_string<_CharT, _Traits, _Alloc>
      str() const;

      void
      str(const basic_string<_CharT, _Traits, _Alloc>& __s);
    };


} // namespace std


namespace std {
  %template(istringstream) basic_istringstream<char>;
  %template(ostringstream) basic_ostringstream<char>;
  %template(stringstream)  basic_stringstream<char>;


#if defined(SWIG_WCHAR)
  %template(wistringstream) basic_istringstream<wchar_t>;
  %template(wostringstream) basic_ostringstream<wchar_t>;
  %template(wstringstream)  basic_stringstream<wchar_t>;
#endif
}