#ifndef TINYSTL_FSTREAM
#define TINYSTL_FSTREAM

#include <iostream>
#include <string>

namespace std {
  
  class basic_filebuf : public basic_streambuf
  {
  };
  
  typedef basic_filebuf filebuf;

  // ..
  
  class basic_ifstream : public basic_istream
  { 
  public:
    basic_ifstream ()
      : m_open (false) {
    }
    
    explicit basic_ifstream (const char* p, openmode m = in)
      : m_open (false)
    {
      open (p);
    }
    
    virtual ~basic_ifstream () {
      if (is_open())
	close();
    }
    
    bool is_open () const {
      return m_open;
    }
    
    void open (const char* p, openmode m = in) {
      m_fname = p;
      m_f = fopen (p, "r");
      if (m_f != NULL)
	m_open = true;
    }
    
    void close () {
      if (m_open)
	fclose (m_f);
      m_open = false;
    }
    
  private:
    bool m_open;
    string m_fname;
  }; 
  
  class basic_ofstream : public basic_ostream {
  public:
    basic_ofstream ()
      : m_open (false) {
    }
    
    explicit basic_ofstream (const char* p, openmode m = out)
      : m_open (false)
    {
      open (p);
    }
    
    virtual ~basic_ofstream () {
      if (is_open())
	close();
    }
    
    bool is_open () const {
      return m_open;
    }
    
    void open (const char* p, openmode m = in) {
      m_fname = p;
      m_f = fopen (p, "w");
      if (m_f != NULL)
	m_open = true;
    }
    
    void close () {
      if (m_open)
	fclose (m_f);
      m_open = false;
    }
    
  public:
    bool m_open;
    string m_fname;
  };
  
  class basic_fstream : public basic_iostream {
  public:
    basic_fstream ();
    explicit basic_fstream (const char* p, openmode m = out);
    
    virtual ~basic_fstream ();
	 
    
    bool is_open () const;
    void open (const char* p, openmode m = out);
    void close ();
  };
  
  typedef basic_ifstream ifstream;
  typedef basic_ofstream ofstream;
  typedef basic_fstream fstream;
}

#endif
