// file : xsd/cxx/tree/ostream.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_CXX_TREE_OSTREAM_HXX #define XSD_CXX_TREE_OSTREAM_HXX #include // std::size_t namespace xsd { namespace cxx { namespace tree { class ostream_common { public: template struct as_size { explicit as_size (T x) : x_ (x) {} T x_; }; // 8-bit // template struct as_int8 { explicit as_int8 (T x) : x_ (x) {} T x_; }; template struct as_uint8 { explicit as_uint8 (T x) : x_ (x) {} T x_; }; // 16-bit // template struct as_int16 { explicit as_int16 (T x) : x_ (x) {} T x_; }; template struct as_uint16 { explicit as_uint16 (T x) : x_ (x) {} T x_; }; // 32-bit // template struct as_int32 { explicit as_int32 (T x) : x_ (x) {} T x_; }; template struct as_uint32 { explicit as_uint32 (T x) : x_ (x) {} T x_; }; // 64-bit // template struct as_int64 { explicit as_int64 (T x) : x_ (x) {} T x_; }; template struct as_uint64 { explicit as_uint64 (T x) : x_ (x) {} T x_; }; // Boolean // template struct as_bool { explicit as_bool (T x) : x_ (x) {} T x_; }; // Floating-point // template struct as_float32 { explicit as_float32 (T x) : x_ (x) {} T x_; }; template struct as_float64 { explicit as_float64 (T x) : x_ (x) {} T x_; }; }; template class ostream: public ostream_common { public: explicit ostream (S& s) : s_ (s) { } S& impl () { return s_; } private: ostream (const ostream&); ostream& operator= (const ostream&); private: S& s_; }; // 8-bit // template inline ostream& operator<< (ostream& s, signed char x) { return s << ostream_common::as_int8 (x); } template inline ostream& operator<< (ostream& s, unsigned char x) { return s << ostream_common::as_uint8 (x); } // 16-bit // template inline ostream& operator<< (ostream& s, short x) { return s << ostream_common::as_int16 (x); } template inline ostream& operator<< (ostream& s, unsigned short x) { return s << ostream_common::as_uint16 (x); } // 32-bit // template inline ostream& operator<< (ostream& s, int x) { return s << ostream_common::as_int32 (x); } template inline ostream& operator<< (ostream& s, unsigned int x) { return s << ostream_common::as_uint32 (x); } // 64-bit // template inline ostream& operator<< (ostream& s, long long x) { return s << ostream_common::as_int64 (x); } template inline ostream& operator<< (ostream& s, unsigned long long x) { return s << ostream_common::as_uint64 (x); } // Boolean // template inline ostream& operator<< (ostream& s, bool x) { return s << ostream_common::as_bool (x); } // Floating-point // template inline ostream& operator<< (ostream& s, float x) { return s << ostream_common::as_float32 (x); } template inline ostream& operator<< (ostream& s, double x) { return s << ostream_common::as_float64 (x); } } } } #endif // XSD_CXX_TREE_OSTREAM_HXX