Home | History | Annotate | Download | only in ustl-1.0
      1 // This file is part of the ustl library, an STL implementation.
      2 //
      3 // Copyright (C) 2005 by Mike Sharov <msharov (at) users.sourceforge.net>
      4 // This file is free software, distributed under the MIT License.
      5 //
      6 // sistream.h
      7 //
      8 
      9 #ifndef SISTREAM_H_0CCA102229A49F5D65EE852E62B27CE2
     10 #define SISTREAM_H_0CCA102229A49F5D65EE852E62B27CE2
     11 
     12 #include "mistream.h"
     13 #include "uassert.h"
     14 #include "ustring.h"
     15 
     16 namespace ustl {
     17 
     18 /// \class istringstream sistream.h ustl.h
     19 /// \ingroup TextStreams
     20 ///
     21 /// \brief A stream that reads textual data from a memory block.
     22 ///
     23 class istringstream : public istream {
     24 public:
     25     static const size_type	c_MaxDelimiters = 16;	///< Maximum number of word delimiters.
     26 public:
     27     				istringstream (void);
     28 				istringstream (const void* p, size_type n);
     29     explicit			istringstream (const cmemlink& source);
     30     void			iread (int8_t& v);
     31     void			iread (int32_t& v);
     32     void			iread (double& v);
     33     void			iread (bool& v);
     34     void			iread (wchar_t& v);
     35     void			iread (string& v);
     36 #ifdef HAVE_INT64_T
     37     void			iread (int64_t& v);
     38 #endif
     39 #if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
     40     void			iread (long long& v);
     41 #endif
     42     inline string		str (void) const	{ string s; s.link (*this); return (s); }
     43     inline void			str (const string& s)	{ link (s); }
     44     int				get (void);
     45     inline void			get (char& c)	{ c = get(); }
     46     void			get (char* p, size_type n, char delim = '\n');
     47     void			get (string& s, char delim = '\n');
     48     void			getline (char* p, size_type n, char delim = '\n');
     49     void			getline (string& s, char delim = '\n');
     50     void			ignore (size_type n, char delim = '\0');
     51     inline char			peek (void)	{ int8_t v; iread (v); ungetc(); return (v); }
     52     inline void			putback (char)	{ ungetc(); }
     53     inline void			unget (void)	{ ungetc(); }
     54     void			set_delimiters (const char* delimiters);
     55     inline void			set_base (short base);
     56     inline void			set_decimal_separator (char)	{ }
     57     inline void			set_thousand_separator (char)	{ }
     58     void			read (void* buffer, size_type size);
     59     void			read (memlink& buf);
     60     inline void			read_strz (string& str);
     61     inline void			sync (void)	{ skip (remaining()); }
     62 protected:
     63     char			skip_delimiters (void);
     64 private:
     65     inline bool			is_delimiter (char c) const;
     66     template <typename T> void	read_number (T& v);
     67 private:
     68     char			m_Delimiters [c_MaxDelimiters];
     69     uint8_t			m_Base;
     70 };
     71 
     72 /// Sets the numeric base used to read numbers.
     73 inline void istringstream::set_base (short base)
     74 {
     75     m_Base = base;
     76 }
     77 
     78 /// Reads a null-terminated character stream. This is not allowed in this class.
     79 inline void istringstream::read_strz (string&)
     80 {
     81     assert (!"Reading nul characters is not allowed from text streams");
     82 }
     83 
     84 /// Reads one type as another.
     85 template <typename RealT, typename CastT>
     86 inline void _cast_read (istringstream& is, RealT& v)
     87 {
     88     CastT cv;
     89     is.iread (cv);
     90     v = RealT (cv);
     91 }
     92 
     93 inline istringstream& operator>> (istringstream& is, int8_t& v)	{ is.iread (v); return (is); }
     94 inline istringstream& operator>> (istringstream& is, int32_t& v){ is.iread (v); return (is); }
     95 inline istringstream& operator>> (istringstream& is, double& v)	{ is.iread (v); return (is); }
     96 inline istringstream& operator>> (istringstream& is, bool& v)	{ is.iread (v); return (is); }
     97 inline istringstream& operator>> (istringstream& is, wchar_t& v){ is.iread (v); return (is); }
     98 inline istringstream& operator>> (istringstream& is, string& v)	{ is.iread (v); return (is); }
     99 #if HAVE_INT64_T
    100 inline istringstream& operator>> (istringstream& is, int64_t& v){ is.iread (v); return (is); }
    101 #endif
    102 #if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
    103 inline istringstream& operator>> (istringstream& is, long long& v) { is.iread (v); return (is); }
    104 #endif
    105 
    106 #define ISTRSTREAM_CAST_OPERATOR(RealT, CastT)			\
    107 inline istringstream& operator>> (istringstream& is, RealT& v)	\
    108 { _cast_read<RealT,CastT>(is, v); return (is); }
    109 
    110 ISTRSTREAM_CAST_OPERATOR (uint8_t,	int8_t)
    111 ISTRSTREAM_CAST_OPERATOR (int16_t,	int32_t)
    112 ISTRSTREAM_CAST_OPERATOR (uint16_t,	int32_t)
    113 ISTRSTREAM_CAST_OPERATOR (uint32_t,	int32_t)
    114 ISTRSTREAM_CAST_OPERATOR (float,	double)
    115 #if HAVE_THREE_CHAR_TYPES
    116 ISTRSTREAM_CAST_OPERATOR (char,		int8_t)
    117 #endif
    118 #if HAVE_INT64_T
    119 ISTRSTREAM_CAST_OPERATOR (uint64_t,	int64_t)
    120 #endif
    121 #if SIZE_OF_LONG == SIZE_OF_INT
    122 ISTRSTREAM_CAST_OPERATOR (long,		int)
    123 ISTRSTREAM_CAST_OPERATOR (unsigned long,int)
    124 #endif
    125 #if HAVE_LONG_LONG && (!HAVE_INT64_T || SIZE_OF_LONG_LONG > 8)
    126 ISTRSTREAM_CAST_OPERATOR (unsigned long long, long long)
    127 #endif
    128 #undef ISTRSTREAM_CAST_OPERATOR
    129 
    130 } // namespace ustl
    131 
    132 #endif
    133 
    134