williamr@2: /* williamr@2: * © Portions copyright (c) 2006-2007 Nokia Corporation. All rights reserved. williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@2: * Copyright (c) 1999 williamr@2: * Boris Fomitchev williamr@2: * williamr@2: * This material is provided "as is", with absolutely no warranty expressed williamr@2: * or implied. Any use is at your own risk. williamr@2: * williamr@2: * Permission to use or copy this software for any purpose is hereby granted williamr@2: * without fee, provided the above notices are retained on all copies. williamr@2: * Permission to modify the code and to distribute modified code is granted, williamr@2: * provided the above notices are retained, and a notice that the code was williamr@2: * modified is included with the above copyright notice. williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: // This header defines classes basic_stringbuf, basic_istringstream, williamr@2: // basic_ostringstream, and basic_stringstream. These classes williamr@2: // represent streamsbufs and streams whose sources or destinations are williamr@2: // C++ strings. williamr@2: williamr@2: #ifndef _STLP_SSTREAM_H williamr@2: #define _STLP_SSTREAM_H williamr@2: williamr@2: #ifndef _STLP_INTERNAL_STREAMBUF williamr@2: # include williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ISTREAM_H williamr@2: # include // Includes , , williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_STRING_H williamr@2: # include williamr@2: #endif williamr@2: williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // This version of basic_stringbuf relies on the internal details of williamr@2: // basic_string. It relies on the fact that, in this implementation, williamr@2: // basic_string's iterators are pointers. It also assumes (as allowed williamr@2: // by the standard) that _CharT is a POD type. williamr@2: williamr@2: // We have a very small buffer for the put area, just so that we don't williamr@2: // have to use append() for every sputc. Conceptually, the buffer williamr@2: // immediately follows the end of the underlying string. We use this williamr@2: // buffer when appending to write-only streambufs, but we don't use it williamr@2: // for read-write streambufs. williamr@2: williamr@2: template williamr@2: #ifdef __SYMBIAN32__ williamr@2: NONSHARABLE_CLASS ( basic_stringbuf ) : public basic_streambuf<_CharT, _Traits> williamr@2: #else williamr@2: class basic_stringbuf : public basic_streambuf<_CharT, _Traits> williamr@2: #endif williamr@2: { williamr@2: public: // Typedefs. williamr@2: typedef _CharT char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_streambuf<_CharT, _Traits> _Base; williamr@2: typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Self; williamr@2: typedef basic_string<_CharT, _Traits, _Alloc> _String; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: _STLP_DECLSPEC explicit basic_stringbuf(ios_base::openmode __mode williamr@2: = ios_base::in | ios_base::out); williamr@2: _STLP_DECLSPEC explicit basic_stringbuf(const _String& __s, ios_base::openmode __mode williamr@2: = ios_base::in | ios_base::out); williamr@2: _STLP_DECLSPEC virtual ~basic_stringbuf(); williamr@2: williamr@2: public: // Get or set the string. williamr@2: _String str() const { williamr@2: if ( _M_mode & ios_base::out ) williamr@2: _M_append_buffer(); williamr@2: return _M_str; williamr@2: } williamr@2: _STLP_DECLSPEC void str(const _String& __s); williamr@2: williamr@2: protected: // Overridden virtual member functions. williamr@2: virtual int_type underflow(); williamr@2: virtual int_type uflow(); williamr@2: virtual int_type pbackfail(int_type __c); williamr@2: virtual int_type overflow(int_type __c); williamr@2: int_type pbackfail() {return pbackfail(_Traits::eof());} williamr@2: int_type overflow() {return overflow(_Traits::eof());} williamr@2: williamr@2: virtual streamsize xsputn(const char_type* __s, streamsize __n); williamr@2: virtual streamsize _M_xsputnc(char_type __c, streamsize __n); williamr@2: williamr@2: virtual _Base* setbuf(_CharT* __buf, streamsize __n); williamr@2: virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir, williamr@2: ios_base::openmode __mode williamr@2: = ios_base::in | ios_base::out); williamr@2: virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode williamr@2: = ios_base::in | ios_base::out); williamr@2: ios_base::openmode _M_mode; williamr@2: williamr@2: private: // Helper functions. williamr@2: // Append the internal buffer to the string if necessary. williamr@2: void _M_append_buffer() const; williamr@2: void _M_set_ptrs(); williamr@2: williamr@2: private: williamr@2: mutable basic_string<_CharT, _Traits, _Alloc> _M_str; williamr@2: williamr@2: enum _JustName { _S_BufSiz = 8 }; williamr@2: _CharT _M_Buf[ 8 /* _S_BufSiz */]; williamr@2: }; williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf, allocator >; williamr@2: # if !defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf, allocator >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_istringstream, an input stream that uses a stringbuf. williamr@2: williamr@2: template williamr@2: #ifdef __SYMBIAN32__ williamr@2: NONSHARABLE_CLASS ( basic_istringstream ) : public basic_istream<_CharT, _Traits> williamr@2: #else williamr@2: class basic_istringstream : public basic_istream<_CharT, _Traits> williamr@2: #endif williamr@2: { williamr@2: public: // Typedefs williamr@2: typedef typename _Traits::char_type char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_istream<_CharT, _Traits> _Base; williamr@2: typedef basic_string<_CharT, _Traits, _Alloc> _String; williamr@2: typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: basic_istringstream(ios_base::openmode __mode = ios_base::in); williamr@2: basic_istringstream(const _String& __str, williamr@2: ios_base::openmode __mode = ios_base::in); williamr@2: ~basic_istringstream(); williamr@2: williamr@2: public: // Member functions williamr@2: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: _String str() const { return _M_buf.str(); } williamr@2: void str(const _String& __s) { _M_buf.str(__s); } williamr@2: williamr@2: private: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf; williamr@2: }; williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_ostringstream, an output stream that uses a stringbuf. williamr@2: williamr@2: template williamr@2: #ifdef __SYMBIAN32__ williamr@2: NONSHARABLE_CLASS ( basic_ostringstream ) : public basic_ostream<_CharT, _Traits> williamr@2: #else williamr@2: class basic_ostringstream : public basic_ostream<_CharT, _Traits> williamr@2: #endif williamr@2: { williamr@2: public: // Typedefs williamr@2: typedef typename _Traits::char_type char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_ostream<_CharT, _Traits> _Base; williamr@2: typedef basic_string<_CharT, _Traits, _Alloc> _String; williamr@2: typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: basic_ostringstream(ios_base::openmode __mode = ios_base::out); williamr@2: basic_ostringstream(const _String& __str, williamr@2: ios_base::openmode __mode = ios_base::out); williamr@2: ~basic_ostringstream(); williamr@2: williamr@2: public: // Member functions. williamr@2: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: _String str() const { return _M_buf.str(); } williamr@2: void str(const _String& __s) { _M_buf.str(__s); } // dwa 02/07/00 - BUG STOMPER DAVE williamr@2: williamr@2: williamr@2: private: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf; williamr@2: }; williamr@2: williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_stringstream, a bidirectional stream that uses a stringbuf. williamr@2: williamr@2: template williamr@2: #ifdef __SYMBIAN32__ williamr@2: NONSHARABLE_CLASS ( basic_stringstream ) : public basic_iostream<_CharT, _Traits> williamr@2: #else williamr@2: class basic_stringstream : public basic_iostream<_CharT, _Traits> williamr@2: #endif williamr@2: { williamr@2: public: // Typedefs williamr@2: typedef typename _Traits::char_type char_type; williamr@2: typedef typename _Traits::int_type int_type; williamr@2: typedef typename _Traits::pos_type pos_type; williamr@2: typedef typename _Traits::off_type off_type; williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: typedef basic_iostream<_CharT, _Traits> _Base; williamr@2: typedef basic_string<_CharT, _Traits, _Alloc> _String; williamr@2: typedef basic_stringbuf<_CharT, _Traits, _Alloc> _Buf; williamr@2: williamr@2: typedef ios_base::openmode openmode; williamr@2: williamr@2: public: // Constructors, destructor. williamr@2: _STLP_DECLSPEC basic_stringstream(openmode __mod = ios_base::in | ios_base::out); williamr@2: _STLP_DECLSPEC basic_stringstream(const _String& __str, williamr@2: openmode __mod = ios_base::in | ios_base::out); williamr@2: ~basic_stringstream(); williamr@2: williamr@2: public: // Member functions. williamr@2: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const williamr@2: { return __CONST_CAST(_Buf*,&_M_buf); } williamr@2: williamr@2: _String str() const { return _M_buf.str(); } williamr@2: void str(const _String& __s) { _M_buf.str(__s); } williamr@2: williamr@2: private: williamr@2: basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf; williamr@2: }; williamr@2: williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_istringstream, allocator >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream, allocator >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_stringstream, allocator >; williamr@2: # if !defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_istringstream, allocator >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream, allocator >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_stringstream, allocator >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@2: # if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@2: # endif williamr@2: williamr@2: #endif /* _STLP_SSTREAM_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: