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