williamr@2
|
1 |
/*
|
williamr@2
|
2 |
* Copyright (c) 1999
|
williamr@2
|
3 |
* Silicon Graphics Computer Systems, Inc.
|
williamr@2
|
4 |
*
|
williamr@4
|
5 |
* Copyright (c) 1999
|
williamr@2
|
6 |
* Boris Fomitchev
|
williamr@2
|
7 |
*
|
williamr@2
|
8 |
* This material is provided "as is", with absolutely no warranty expressed
|
williamr@2
|
9 |
* or implied. Any use is at your own risk.
|
williamr@2
|
10 |
*
|
williamr@4
|
11 |
* Permission to use or copy this software for any purpose is hereby granted
|
williamr@2
|
12 |
* without fee, provided the above notices are retained on all copies.
|
williamr@2
|
13 |
* Permission to modify the code and to distribute modified code is granted,
|
williamr@2
|
14 |
* provided the above notices are retained, and a notice that the code was
|
williamr@2
|
15 |
* modified is included with the above copyright notice.
|
williamr@2
|
16 |
*
|
williamr@4
|
17 |
*/
|
williamr@2
|
18 |
|
williamr@2
|
19 |
|
williamr@2
|
20 |
// This header defines classes basic_stringbuf, basic_istringstream,
|
williamr@4
|
21 |
// basic_ostringstream, and basic_stringstream. These classes
|
williamr@2
|
22 |
// represent streamsbufs and streams whose sources or destinations are
|
williamr@2
|
23 |
// C++ strings.
|
williamr@2
|
24 |
|
williamr@4
|
25 |
#ifndef _STLP_INTERNAL_SSTREAM
|
williamr@4
|
26 |
#define _STLP_INTERNAL_SSTREAM
|
williamr@2
|
27 |
|
williamr@2
|
28 |
#ifndef _STLP_INTERNAL_STREAMBUF
|
williamr@4
|
29 |
# include <stl/_streambuf.h>
|
williamr@2
|
30 |
#endif
|
williamr@2
|
31 |
|
williamr@4
|
32 |
#ifndef _STLP_INTERNAL_ISTREAM
|
williamr@4
|
33 |
# include <stl/_istream.h> // Includes <ostream>, <ios>, <iosfwd>
|
williamr@2
|
34 |
#endif
|
williamr@2
|
35 |
|
williamr@4
|
36 |
#ifndef _STLP_INTERNAL_STRING_H
|
williamr@4
|
37 |
# include <stl/_string.h>
|
williamr@2
|
38 |
#endif
|
williamr@2
|
39 |
|
williamr@2
|
40 |
_STLP_BEGIN_NAMESPACE
|
williamr@2
|
41 |
|
williamr@2
|
42 |
//----------------------------------------------------------------------
|
williamr@2
|
43 |
// This version of basic_stringbuf relies on the internal details of
|
williamr@2
|
44 |
// basic_string. It relies on the fact that, in this implementation,
|
williamr@2
|
45 |
// basic_string's iterators are pointers. It also assumes (as allowed
|
williamr@2
|
46 |
// by the standard) that _CharT is a POD type.
|
williamr@2
|
47 |
|
williamr@2
|
48 |
// We have a very small buffer for the put area, just so that we don't
|
williamr@2
|
49 |
// have to use append() for every sputc. Conceptually, the buffer
|
williamr@2
|
50 |
// immediately follows the end of the underlying string. We use this
|
williamr@2
|
51 |
// buffer when appending to write-only streambufs, but we don't use it
|
williamr@2
|
52 |
// for read-write streambufs.
|
williamr@2
|
53 |
|
williamr@2
|
54 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
55 |
class basic_stringbuf : public basic_streambuf<_CharT, _Traits> {
|
williamr@2
|
56 |
public: // Typedefs.
|
williamr@2
|
57 |
typedef _CharT char_type;
|
williamr@2
|
58 |
typedef typename _Traits::int_type int_type;
|
williamr@2
|
59 |
typedef typename _Traits::pos_type pos_type;
|
williamr@2
|
60 |
typedef typename _Traits::off_type off_type;
|
williamr@2
|
61 |
typedef _Traits traits_type;
|
williamr@2
|
62 |
|
williamr@2
|
63 |
typedef basic_streambuf<_CharT, _Traits> _Base;
|
williamr@2
|
64 |
typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Self;
|
williamr@2
|
65 |
typedef basic_string<_CharT, _Traits, _Alloc> _String;
|
williamr@2
|
66 |
|
williamr@2
|
67 |
public: // Constructors, destructor.
|
williamr@4
|
68 |
explicit basic_stringbuf(ios_base::openmode __mode
|
williamr@2
|
69 |
= ios_base::in | ios_base::out);
|
williamr@4
|
70 |
explicit basic_stringbuf(const _String& __s, ios_base::openmode __mode
|
williamr@2
|
71 |
= ios_base::in | ios_base::out);
|
williamr@4
|
72 |
virtual ~basic_stringbuf();
|
williamr@2
|
73 |
|
williamr@2
|
74 |
public: // Get or set the string.
|
williamr@4
|
75 |
_String str() const { _M_append_buffer(); return _M_str; }
|
williamr@4
|
76 |
void str(const _String& __s);
|
williamr@2
|
77 |
|
williamr@2
|
78 |
protected: // Overridden virtual member functions.
|
williamr@2
|
79 |
virtual int_type underflow();
|
williamr@2
|
80 |
virtual int_type uflow();
|
williamr@2
|
81 |
virtual int_type pbackfail(int_type __c);
|
williamr@2
|
82 |
virtual int_type overflow(int_type __c);
|
williamr@2
|
83 |
int_type pbackfail() {return pbackfail(_Traits::eof());}
|
williamr@2
|
84 |
int_type overflow() {return overflow(_Traits::eof());}
|
williamr@2
|
85 |
|
williamr@2
|
86 |
virtual streamsize xsputn(const char_type* __s, streamsize __n);
|
williamr@2
|
87 |
virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
|
williamr@2
|
88 |
|
williamr@2
|
89 |
virtual _Base* setbuf(_CharT* __buf, streamsize __n);
|
williamr@2
|
90 |
virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
|
williamr@4
|
91 |
ios_base::openmode __mode
|
williamr@2
|
92 |
= ios_base::in | ios_base::out);
|
williamr@4
|
93 |
virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode
|
williamr@2
|
94 |
= ios_base::in | ios_base::out);
|
williamr@2
|
95 |
|
williamr@2
|
96 |
private: // Helper functions.
|
williamr@2
|
97 |
// Append the internal buffer to the string if necessary.
|
williamr@2
|
98 |
void _M_append_buffer() const;
|
williamr@2
|
99 |
void _M_set_ptrs();
|
williamr@2
|
100 |
|
williamr@2
|
101 |
private:
|
williamr@4
|
102 |
ios_base::openmode _M_mode;
|
williamr@2
|
103 |
mutable basic_string<_CharT, _Traits, _Alloc> _M_str;
|
williamr@2
|
104 |
|
williamr@2
|
105 |
enum _JustName { _S_BufSiz = 8 };
|
williamr@2
|
106 |
_CharT _M_Buf[ 8 /* _S_BufSiz */];
|
williamr@2
|
107 |
};
|
williamr@2
|
108 |
|
williamr@4
|
109 |
#if defined (_STLP_USE_TEMPLATE_EXPORT)
|
williamr@2
|
110 |
_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<char, char_traits<char>, allocator<char> >;
|
williamr@2
|
111 |
# if !defined (_STLP_NO_WCHAR_T)
|
williamr@2
|
112 |
_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
|
williamr@2
|
113 |
# endif
|
williamr@4
|
114 |
#endif /* _STLP_USE_TEMPLATE_EXPORT */
|
williamr@2
|
115 |
|
williamr@2
|
116 |
//----------------------------------------------------------------------
|
williamr@2
|
117 |
// Class basic_istringstream, an input stream that uses a stringbuf.
|
williamr@2
|
118 |
|
williamr@2
|
119 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
120 |
class basic_istringstream : public basic_istream<_CharT, _Traits> {
|
williamr@2
|
121 |
public: // Typedefs
|
williamr@2
|
122 |
typedef typename _Traits::char_type char_type;
|
williamr@2
|
123 |
typedef typename _Traits::int_type int_type;
|
williamr@2
|
124 |
typedef typename _Traits::pos_type pos_type;
|
williamr@2
|
125 |
typedef typename _Traits::off_type off_type;
|
williamr@2
|
126 |
typedef _Traits traits_type;
|
williamr@2
|
127 |
|
williamr@2
|
128 |
typedef basic_ios<_CharT, _Traits> _Basic_ios;
|
williamr@2
|
129 |
typedef basic_istream<_CharT, _Traits> _Base;
|
williamr@2
|
130 |
typedef basic_string<_CharT, _Traits, _Alloc> _String;
|
williamr@2
|
131 |
typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
|
williamr@2
|
132 |
|
williamr@2
|
133 |
public: // Constructors, destructor.
|
williamr@2
|
134 |
basic_istringstream(ios_base::openmode __mode = ios_base::in);
|
williamr@2
|
135 |
basic_istringstream(const _String& __str,
|
williamr@2
|
136 |
ios_base::openmode __mode = ios_base::in);
|
williamr@2
|
137 |
~basic_istringstream();
|
williamr@2
|
138 |
|
williamr@2
|
139 |
public: // Member functions
|
williamr@2
|
140 |
|
williamr@2
|
141 |
basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
|
williamr@2
|
142 |
{ return __CONST_CAST(_Buf*,&_M_buf); }
|
williamr@2
|
143 |
|
williamr@2
|
144 |
_String str() const { return _M_buf.str(); }
|
williamr@2
|
145 |
void str(const _String& __s) { _M_buf.str(__s); }
|
williamr@4
|
146 |
|
williamr@2
|
147 |
private:
|
williamr@2
|
148 |
basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
|
williamr@4
|
149 |
|
williamr@4
|
150 |
#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310)
|
williamr@4
|
151 |
typedef basic_istringstream<_CharT, _Traits> _Self;
|
williamr@4
|
152 |
//explicitely defined as private to avoid warnings:
|
williamr@4
|
153 |
basic_istringstream(_Self const&);
|
williamr@4
|
154 |
_Self& operator = (_Self const&);
|
williamr@4
|
155 |
#endif
|
williamr@2
|
156 |
};
|
williamr@2
|
157 |
|
williamr@2
|
158 |
|
williamr@2
|
159 |
//----------------------------------------------------------------------
|
williamr@2
|
160 |
// Class basic_ostringstream, an output stream that uses a stringbuf.
|
williamr@2
|
161 |
|
williamr@2
|
162 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
163 |
class basic_ostringstream : public basic_ostream<_CharT, _Traits> {
|
williamr@2
|
164 |
public: // Typedefs
|
williamr@2
|
165 |
typedef typename _Traits::char_type char_type;
|
williamr@2
|
166 |
typedef typename _Traits::int_type int_type;
|
williamr@2
|
167 |
typedef typename _Traits::pos_type pos_type;
|
williamr@2
|
168 |
typedef typename _Traits::off_type off_type;
|
williamr@2
|
169 |
typedef _Traits traits_type;
|
williamr@2
|
170 |
|
williamr@2
|
171 |
typedef basic_ios<_CharT, _Traits> _Basic_ios;
|
williamr@2
|
172 |
typedef basic_ostream<_CharT, _Traits> _Base;
|
williamr@2
|
173 |
typedef basic_string<_CharT, _Traits, _Alloc> _String;
|
williamr@2
|
174 |
typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
|
williamr@2
|
175 |
|
williamr@2
|
176 |
public: // Constructors, destructor.
|
williamr@2
|
177 |
basic_ostringstream(ios_base::openmode __mode = ios_base::out);
|
williamr@2
|
178 |
basic_ostringstream(const _String& __str,
|
williamr@2
|
179 |
ios_base::openmode __mode = ios_base::out);
|
williamr@2
|
180 |
~basic_ostringstream();
|
williamr@2
|
181 |
|
williamr@2
|
182 |
public: // Member functions.
|
williamr@2
|
183 |
|
williamr@2
|
184 |
basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
|
williamr@2
|
185 |
{ return __CONST_CAST(_Buf*,&_M_buf); }
|
williamr@2
|
186 |
|
williamr@2
|
187 |
_String str() const { return _M_buf.str(); }
|
williamr@2
|
188 |
void str(const _String& __s) { _M_buf.str(__s); } // dwa 02/07/00 - BUG STOMPER DAVE
|
williamr@2
|
189 |
|
williamr@2
|
190 |
|
williamr@2
|
191 |
private:
|
williamr@2
|
192 |
basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
|
williamr@4
|
193 |
|
williamr@4
|
194 |
#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310)
|
williamr@4
|
195 |
typedef basic_ostringstream<_CharT, _Traits> _Self;
|
williamr@4
|
196 |
//explicitely defined as private to avoid warnings:
|
williamr@4
|
197 |
basic_ostringstream(_Self const&);
|
williamr@4
|
198 |
_Self& operator = (_Self const&);
|
williamr@4
|
199 |
#endif
|
williamr@2
|
200 |
};
|
williamr@2
|
201 |
|
williamr@2
|
202 |
|
williamr@2
|
203 |
//----------------------------------------------------------------------
|
williamr@2
|
204 |
// Class basic_stringstream, a bidirectional stream that uses a stringbuf.
|
williamr@2
|
205 |
|
williamr@2
|
206 |
template <class _CharT, class _Traits, class _Alloc>
|
williamr@4
|
207 |
class basic_stringstream : public basic_iostream<_CharT, _Traits> {
|
williamr@2
|
208 |
public: // Typedefs
|
williamr@2
|
209 |
typedef typename _Traits::char_type char_type;
|
williamr@2
|
210 |
typedef typename _Traits::int_type int_type;
|
williamr@2
|
211 |
typedef typename _Traits::pos_type pos_type;
|
williamr@2
|
212 |
typedef typename _Traits::off_type off_type;
|
williamr@2
|
213 |
typedef _Traits traits_type;
|
williamr@2
|
214 |
|
williamr@2
|
215 |
typedef basic_ios<_CharT, _Traits> _Basic_ios;
|
williamr@2
|
216 |
typedef basic_iostream<_CharT, _Traits> _Base;
|
williamr@2
|
217 |
typedef basic_string<_CharT, _Traits, _Alloc> _String;
|
williamr@2
|
218 |
typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf;
|
williamr@4
|
219 |
|
williamr@2
|
220 |
typedef ios_base::openmode openmode;
|
williamr@2
|
221 |
|
williamr@2
|
222 |
public: // Constructors, destructor.
|
williamr@4
|
223 |
basic_stringstream(openmode __mod = ios_base::in | ios_base::out);
|
williamr@4
|
224 |
basic_stringstream(const _String& __str,
|
williamr@2
|
225 |
openmode __mod = ios_base::in | ios_base::out);
|
williamr@2
|
226 |
~basic_stringstream();
|
williamr@2
|
227 |
|
williamr@2
|
228 |
public: // Member functions.
|
williamr@2
|
229 |
|
williamr@2
|
230 |
basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
|
williamr@2
|
231 |
{ return __CONST_CAST(_Buf*,&_M_buf); }
|
williamr@2
|
232 |
|
williamr@2
|
233 |
_String str() const { return _M_buf.str(); }
|
williamr@2
|
234 |
void str(const _String& __s) { _M_buf.str(__s); }
|
williamr@2
|
235 |
|
williamr@2
|
236 |
private:
|
williamr@2
|
237 |
basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
|
williamr@4
|
238 |
|
williamr@4
|
239 |
#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310)
|
williamr@4
|
240 |
typedef basic_stringstream<_CharT, _Traits> _Self;
|
williamr@4
|
241 |
//explicitely defined as private to avoid warnings:
|
williamr@4
|
242 |
basic_stringstream(_Self const&);
|
williamr@4
|
243 |
_Self& operator = (_Self const&);
|
williamr@4
|
244 |
#endif
|
williamr@2
|
245 |
};
|
williamr@2
|
246 |
|
williamr@2
|
247 |
|
williamr@4
|
248 |
#if defined (_STLP_USE_TEMPLATE_EXPORT)
|
williamr@2
|
249 |
_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<char, char_traits<char>, allocator<char> >;
|
williamr@2
|
250 |
_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<char, char_traits<char>, allocator<char> >;
|
williamr@2
|
251 |
_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<char, char_traits<char>, allocator<char> >;
|
williamr@2
|
252 |
# if !defined (_STLP_NO_WCHAR_T)
|
williamr@2
|
253 |
_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
|
williamr@2
|
254 |
_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
|
williamr@2
|
255 |
_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
|
williamr@2
|
256 |
# endif
|
williamr@4
|
257 |
#endif /* _STLP_USE_TEMPLATE_EXPORT */
|
williamr@2
|
258 |
|
williamr@2
|
259 |
_STLP_END_NAMESPACE
|
williamr@2
|
260 |
|
williamr@4
|
261 |
#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
|
williamr@2
|
262 |
# include <stl/_sstream.c>
|
williamr@4
|
263 |
#endif
|
williamr@2
|
264 |
|
williamr@4
|
265 |
#endif /* _STLP_INTERNAL_SSTREAM */
|
williamr@2
|
266 |
|
williamr@2
|
267 |
// Local Variables:
|
williamr@2
|
268 |
// mode:C++
|
williamr@2
|
269 |
// End:
|