// file : xsd/cxx/tree/istream.hxx // copyright : Copyright (c) 2005-2014 Code Synthesis Tools CC // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef XSD_CXX_TREE_ISTREAM_HXX #define XSD_CXX_TREE_ISTREAM_HXX #include #include #include // std::auto_ptr/unique_ptr #include // std::size_t #include // XSD_AUTO_PTR #include namespace xsd { namespace cxx { namespace tree { class istream_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 istream: public istream_common { public: explicit istream (S& s) : s_ (s) { } S& impl () { return s_; } // Add string to the pool. The application should add every // potentially pooled string to correctly re-create the pool // constructed during insertion. // template void pool_add (const std::basic_string& s) { typedef pool_impl pool_type; if (pool_.get () == 0) pool_.reset (new pool_type); pool_type& p (*static_cast (pool_.get ())); p.push_back (s); } // Get string from pool id. We return the result via an argument // instead of as a return type to avoid difficulties some compilers // (e.g., GCC) experience with calls like istream::pool_string. // template void pool_string (std::size_t id, std::basic_string& out) { typedef pool_impl pool_type; pool_type& p (*static_cast (pool_.get ())); out = p[id - 1]; } public: // 8-bit // signed char read_char (); unsigned char read_uchar (); // 16-bit // unsigned short read_short (); unsigned short read_ushort (); // 32-bit // unsigned int read_int (); unsigned int read_uint (); // 64-bit // unsigned long long read_ulonglong (); unsigned long long read_longlong (); // Boolean // bool read_bool (); // Floating-point // float read_float (); double read_double (); private: istream (const istream&); istream& operator= (const istream&); private: struct pool { virtual ~pool () {} }; template struct pool_impl: pool, std::vector > { }; S& s_; std::size_t seq_; XSD_AUTO_PTR pool_; }; // 8-bit // template inline istream& operator>> (istream& s, signed char& x) { istream_common::as_int8 as_int8 (x); return s >> as_int8; } template inline istream& operator>> (istream& s, unsigned char& x) { istream_common::as_uint8 as_uint8 (x); return s >> as_uint8; } // 16-bit // template inline istream& operator>> (istream& s, short& x) { istream_common::as_int16 as_int16 (x); return s >> as_int16; } template inline istream& operator>> (istream& s, unsigned short& x) { istream_common::as_uint16 as_uint16 (x); return s >> as_uint16; } // 32-bit // template inline istream& operator>> (istream& s, int& x) { istream_common::as_int32 as_int32 (x); return s >> as_int32; } template inline istream& operator>> (istream& s, unsigned int& x) { istream_common::as_uint32 as_uint32 (x); return s >> as_uint32; } // 64-bit // template inline istream& operator>> (istream& s, long long& x) { istream_common::as_int64 as_int64 (x); return s >> as_int64; } template inline istream& operator>> (istream& s, unsigned long long& x) { istream_common::as_uint64 as_uint64 (x); return s >> as_uint64; } // Boolean // template inline istream& operator>> (istream& s, bool& x) { istream_common::as_bool as_bool (x); return s >> as_bool; } // Floating-point // template inline istream& operator>> (istream& s, float& x) { istream_common::as_float32 as_float32 (x); return s >> as_float32; } template inline istream& operator>> (istream& s, double& x) { istream_common::as_float64 as_float64 (x); return s >> as_float64; } // // read_* functions. // template inline signed char istream:: read_char () { signed char r; *this >> r; return r; } template inline unsigned char istream:: read_uchar () { unsigned char r; *this >> r; return r; } template inline unsigned short istream:: read_short () { short r; *this >> r; return r; } template inline unsigned short istream:: read_ushort () { unsigned short r; *this >> r; return r; } template inline unsigned int istream:: read_int () { int r; *this >> r; return r; } template inline unsigned int istream:: read_uint () { unsigned int r; *this >> r; return r; } template inline unsigned long long istream:: read_ulonglong () { long long r; *this >> r; return r; } template inline unsigned long long istream:: read_longlong () { unsigned long long r; *this >> r; return r; } template inline bool istream:: read_bool () { bool r; *this >> r; return r; } template inline float istream:: read_float () { float r; *this >> r; return r; } template inline double istream:: read_double () { double r; *this >> r; return r; } } } } #endif // XSD_CXX_TREE_ISTREAM_HXX