#ifndef __pxx_stream_hh__
#define __pxx_stream_hh__

#include "pxx_common.hh"

#include <wchar.h>

namespace pxx
{

class Stream
{

protected:

  io_mode_t mode ;
  bool eof ;

  virtual void put (char _c) = 0 ;
  virtual void get (char& _c) = 0 ;
  virtual void unget (char _c) = 0 ;

public:

  inline Stream (io_mode_t _mode) ;

  virtual inline ~Stream () ;

  virtual Stream& flush () = 0 ;
  virtual Stream& endl () = 0 ;

  virtual inline operator bool () ;

  virtual size_t write (void* _buf, size_t _len) = 0 ;
  virtual size_t read (void* _buf, size_t _len) = 0 ;
//  virtual Stream& operator << (char _c) = 0 ;
//  virtual Stream& operator >> (char& _c) = 0 ;
  virtual Stream& operator << (int8_t _num) = 0 ;
  virtual Stream& operator >> (int8_t& _num) = 0 ;
  virtual Stream& operator << (uint8_t _num) = 0 ;
  virtual Stream& operator >> (uint8_t& _c) = 0 ;
  virtual Stream& operator << (int16_t _num) = 0 ;
  virtual Stream& operator >> (int16_t& _num) = 0 ;
  virtual Stream& operator << (uint16_t _num) = 0 ;
  virtual Stream& operator >> (uint16_t& _num) = 0 ;
  virtual Stream& operator << (int32_t _num) = 0 ;
  virtual Stream& operator >> (int32_t& _num) = 0 ;
  virtual Stream& operator << (uint32_t _num) = 0 ;
  virtual Stream& operator >> (uint32_t& _num) = 0 ;
  virtual Stream& operator << (int64_t _num) = 0 ;
  virtual Stream& operator >> (int64_t& _num) = 0 ;
  virtual Stream& operator << (uint64_t _num) = 0 ;
  virtual Stream& operator >> (uint64_t& _num) = 0 ;
  virtual inline Stream& operator << (char* _s) ;
  virtual inline Stream& operator << (wchar_t* _s) ;

  inline Stream& operator << (Stream& (*pf)(Stream&)) ;

};

inline Stream& flush (Stream& _s) ;
inline Stream& endl (Stream& _s) ;

}

#endif // __pxx_stream_hh__
