/*******************************************************************\
 *
 *
 * Author: Blanc Nicolas
 *
 * 
\*******************************************************************/

#ifndef STL_IOSTREAM
#define STL_IOSTREAM

namespace std
{
  struct ostream
  {
    ostream(int id): id(id){}
    ostream(const ostream&); // disabled
    ostream& operator=(const ostream&); // disabled
    int id;
  };

  struct istream
  {
    istream(int id): id(id){}
    istream(const istream&); // disabled
    istream& operator=(const istream&); // disabled
    int id;
  };

  struct iostream: ostream, istream
  {
    iostream(int id): ostream(id), istream(id){}
    iostream(const iostream&); // disabled
    iostream& operator=(const iostream&); // disabled
  };

  extern iostream cout;
  extern iostream cerr;

  char endl = '\n';
}

namespace scoot
{
	void scoot_print_cstr(int io, const char* cstr);
	void scoot_print_char(int io, char c);
	void scoot_print_int(int io, int i);
	void scoot_print_unsigned(int io, unsigned i);       	
}

namespace std
{

	
	inline ostream& operator << (ostream& o, const char*  cstr)
	{ 
	  scoot::scoot_print_cstr(o.id, cstr);
	  return o;
	}

	inline ostream& operator << (ostream& o, char  c)
	{ 
	  scoot::scoot_print_char(o.id, c);
	  return o;
	}

	inline ostream&  operator << (ostream& o, int  i)
	{ 
	  scoot::scoot_print_int(o.id, i);
	  return o;
	}

	inline ostream& operator << (ostream& o, unsigned  i)
	{ 
	  scoot::scoot_print_unsigned(o.id, i);
	  return o;
	}

}
#endif
