#pragma once

#include <streambuf>
#include <stdtypedefs.h>
#include <string>

namespace std {
  template<class T> class allocator;

  template<class charT, class traits = char_traits<charT> > class basic_ios;
  template<class charT, class traits = char_traits<charT> > class basic_istream;
  template<class charT, class traits = char_traits<charT> > class basic_ostream;
  template<class charT, class traits = char_traits<charT> > class basic_iostream;
  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_stringbuf;

  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_istringstream;
  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_ostringstream;
  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_stringstream;

  template<class charT, class traits = char_traits<charT> > class basic_filebuf;
  template<class charT, class traits = char_traits<charT> > class basic_ifstream;
  template<class charT, class traits = char_traits<charT> > class basic_ofstream;
  template<class charT, class traits = char_traits<charT> > class basic_fstream;

  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_syncbuf;
  template<class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_osyncstream;

  template<class charT, class traits = char_traits<charT> > class istreambuf_iterator;
  template<class charT, class traits = char_traits<charT> > class ostreambuf_iterator;

  typedef basic_ios<char> ios;
  typedef basic_ios<wchar_t> wios;

  //typedef basic_istream<char> istream;
  //typedef basic_ostream<char> ostream;
  //typedef basic_iostream<char> iostream;
  class istream;
  class ostream;
  class iostream;

  typedef basic_stringbuf<char> stringbuf;
  typedef basic_istringstream<char> istringstream;
  typedef basic_ostringstream<char> ostringstream;
  typedef basic_stringstream<char> stringstream;

  typedef basic_filebuf<char> filebuf;
  //typedef basic_ifstream<char> ifstream;
  //typedef basic_ofstream<char> ofstream;
  //typedef basic_fstream<char> fstream;
  class ifstream;
  class ofstream;
  class fstream;

  typedef basic_syncbuf<char> syncbuf;
  typedef basic_osyncstream<char> osyncstream;

  typedef basic_istream<wchar_t> wistream;
  typedef basic_ostream<wchar_t> wostream;
  typedef basic_iostream<wchar_t> wiostream;

  typedef basic_stringbuf<wchar_t> wstringbuf;
  typedef basic_istringstream<wchar_t> wistringstream;
  typedef basic_ostringstream<wchar_t> wostringstream;
  typedef basic_stringstream<wchar_t> wstringstream;

  typedef basic_filebuf<wchar_t> wfilebuf;
  typedef basic_ifstream<wchar_t> wifstream;
  typedef basic_ofstream<wchar_t> wofstream;
  typedef basic_fstream<wchar_t> wfstream;

  typedef basic_syncbuf<wchar_t> wsyncbuf;
  typedef basic_osyncstream<wchar_t> wosyncstream;

  template<class state> class fpos;
  typedef fpos<mbstate_t> streampos;
  typedef fpos<mbstate_t> wstreampos;
}
