%include <std_ios.i>
%{
#ifndef SWIG_STD_NOMODERN_STL
#include <streambuf>
#else
#include <streambuf.h>
#endif
%}

namespace std {

  template<typename _CharT, typename _Traits = char_traits<_CharT> >
  class basic_streambuf 
  {
  public:
    // Types:
    typedef _CharT 					char_type;
    typedef _Traits 					traits_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:
    virtual 
    ~basic_streambuf();

    // Locales:
    locale 
    pubimbue(const locale &__loc);

    locale   
    getloc() const; 

    // Buffer and positioning:
    basic_streambuf<_CharT, _Traits>* 
    pubsetbuf(char_type* __s, streamsize __n);

    pos_type 
    pubseekoff(off_type __off, ios_base::seekdir __way, 
	       ios_base::openmode __mode = std::ios_base::in | std::ios_base::out);

    pos_type 
    pubseekpos(pos_type __sp,
	       ios_base::openmode __mode = std::ios_base::in | std::ios_base::out);

    int 
    pubsync() ;

    // Get and put areas:
    // Get area:
    streamsize 
    in_avail();

    int_type 
    snextc();

    int_type 
    sbumpc();

    int_type 
    sgetc();

    streamsize 
    sgetn(char_type* __s, streamsize __n);

    // Putback:
    int_type 
    sputbackc(char_type __c);

    int_type 
    sungetc();

    // Put area:
    int_type 
    sputc(char_type __c);

    streamsize 
    sputn(const char_type* __s, streamsize __n);

  protected:
    basic_streambuf();

  private:
    basic_streambuf(const basic_streambuf& other);

  }; 
}

namespace std {
  %template(streambuf) basic_streambuf<char>;
#if defined(SWIG_WCHAR)
  %template(wstreambuf) basic_streambuf<wchar_t>;
#endif
}
