williamr@2: /* williamr@2: * Copyright (c) 1999 williamr@2: * Silicon Graphics Computer Systems, Inc. williamr@2: * williamr@4: * 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@4: * 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@4: */ williamr@4: #ifndef _STLP_INTERNAL_ISTREAM williamr@4: #define _STLP_INTERNAL_ISTREAM williamr@2: williamr@2: // this block is included by _ostream.h, we include it here to lower #include level williamr@4: #if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_INTERNAL_CWCHAR) williamr@2: # include williamr@4: #endif williamr@2: williamr@4: #ifndef _STLP_INTERNAL_IOS_H williamr@2: # include // For basic_ios<>. Includes . williamr@4: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_OSTREAM_H williamr@4: # include // Needed as a base class of basic_iostream. williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H williamr@4: # include williamr@2: #endif williamr@2: williamr@2: #include // Helper functions that allow char traits williamr@2: // to be used as function objects. williamr@2: _STLP_BEGIN_NAMESPACE williamr@2: williamr@2: #if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: template williamr@2: class _Isentry; williamr@2: #endif williamr@2: williamr@2: struct _No_Skip_WS {}; // Dummy class used by sentry. williamr@2: williamr@2: template williamr@4: bool _M_init_skip(basic_istream<_CharT, _Traits>& __istr); williamr@2: template williamr@4: bool _M_init_noskip(basic_istream<_CharT, _Traits>& __istr); williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class basic_istream, a class that performs formatted input through williamr@2: // a stream buffer. williamr@2: williamr@2: // The second template parameter, _Traits, defaults to char_traits<_CharT>. williamr@2: // The default is declared in header , and it isn't declared here williamr@4: // because C++ language rules do not allow it to be declared twice. williamr@2: williamr@2: template williamr@2: class basic_istream : virtual public basic_ios<_CharT, _Traits> { williamr@4: typedef basic_istream<_CharT, _Traits> _Self; williamr@4: williamr@4: #if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310) williamr@4: //explicitely defined as private to avoid warnings: williamr@4: basic_istream(_Self const&); williamr@4: _Self& operator = (_Self const&); williamr@4: #endif williamr@4: williamr@2: public: williamr@2: // Types 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: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: williamr@2: typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&); williamr@2: typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&); williamr@2: typedef _Self& (_STLP_CALL *__istream_fn)(_Self&); williamr@2: williamr@2: public: // Constructor and destructor. williamr@4: explicit basic_istream(basic_streambuf<_CharT, _Traits>* __buf) : williamr@4: basic_ios<_CharT, _Traits>(), _M_gcount(0) { williamr@4: this->init(__buf); williamr@4: } williamr@4: ~basic_istream() {}; williamr@2: williamr@2: public: // Nested sentry class. williamr@2: williamr@2: public: // Hooks for manipulators. The arguments are williamr@2: // function pointers. williamr@2: _Self& operator>> (__istream_fn __f) { return __f(*this); } williamr@2: _Self& operator>> (__ios_fn __f) { __f(*this); return *this; } williamr@2: _Self& operator>> (__ios_base_fn __f) { __f(*this); return *this; } williamr@2: williamr@2: public: // Formatted input of numbers. williamr@4: _Self& operator>> (short& __val); williamr@4: _Self& operator>> (int& __val); williamr@4: _Self& operator>> (unsigned short& __val); williamr@4: _Self& operator>> (unsigned int& __val); williamr@4: _Self& operator>> (long& __val); williamr@4: _Self& operator>> (unsigned long& __val); williamr@2: #ifdef _STLP_LONG_LONG williamr@4: _Self& operator>> (_STLP_LONG_LONG& __val); williamr@4: _Self& operator>> (unsigned _STLP_LONG_LONG& __val); williamr@4: #endif williamr@4: _Self& operator>> (float& __val); williamr@4: _Self& operator>> (double& __val); williamr@2: # ifndef _STLP_NO_LONG_DOUBLE williamr@4: _Self& operator>> (long double& __val); williamr@2: # endif williamr@2: # ifndef _STLP_NO_BOOL williamr@4: _Self& operator>> (bool& __val); williamr@2: # endif williamr@4: _Self& operator>> (void*& __val); williamr@2: williamr@2: public: // Copying characters into a streambuf. williamr@2: _Self& operator>>(basic_streambuf<_CharT, _Traits>*); williamr@2: williamr@2: public: // Unformatted input. williamr@2: streamsize gcount() const { return _M_gcount; } williamr@2: int_type peek(); williamr@2: williamr@2: public: // get() for single characters williamr@2: int_type get(); williamr@2: _Self& get(char_type& __c); williamr@2: williamr@2: public: // get() for character arrays. williamr@2: _Self& get(char_type* __s, streamsize __n, char_type __delim); williamr@2: _Self& get(char_type* __s, streamsize __n) williamr@2: { return get(__s, __n, this->widen('\n')); } williamr@2: williamr@2: public: // get() for streambufs williamr@2: _Self& get(basic_streambuf<_CharT, _Traits>& __buf, williamr@2: char_type __delim); williamr@2: _Self& get(basic_streambuf<_CharT, _Traits>& __buf) williamr@2: { return get(__buf, this->widen('\n')); } williamr@2: williamr@2: public: // getline() williamr@2: _Self& getline(char_type* __s, streamsize __n, char_type delim); williamr@2: _Self& getline(char_type* __s, streamsize __n) williamr@2: { return getline(__s, __n, this->widen('\n')); } williamr@2: williamr@2: public: // read(), readsome(), ignore() williamr@2: _Self& ignore(); williamr@2: _Self& ignore(streamsize __n); williamr@2: #if (defined (_STLP_MSVC) && _STLP_MSVC < 1200) williamr@2: inline williamr@2: #endif williamr@2: _Self& ignore(streamsize __n, int_type __delim); williamr@2: williamr@2: _Self& read(char_type* __s, streamsize __n); williamr@2: streamsize readsome(char_type* __s, streamsize __n); williamr@2: williamr@2: public: // putback williamr@2: _Self& putback(char_type __c); williamr@2: _Self& unget(); williamr@2: williamr@2: public: // Positioning and buffer control. williamr@2: int sync(); williamr@2: williamr@2: pos_type tellg(); williamr@2: _Self& seekg(pos_type __pos); williamr@2: _Self& seekg(off_type, ios_base::seekdir); williamr@2: williamr@2: public: // Helper functions for non-member extractors. williamr@2: void _M_formatted_get(_CharT& __c); williamr@2: void _M_formatted_get(_CharT* __s); williamr@2: void _M_skip_whitespace(bool __set_failbit); williamr@2: williamr@2: private: // Number of characters extracted by the williamr@2: streamsize _M_gcount; // most recent unformatted input function. williamr@2: williamr@2: public: williamr@2: williamr@2: #if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: // If we are using DLL specs, we have not to use inner classes williamr@2: // end class declaration here williamr@2: typedef _Isentry<_CharT, _Traits> sentry; williamr@2: }; williamr@2: # define sentry _Isentry williamr@2: template williamr@2: class _Isentry { williamr@2: typedef _Isentry<_CharT, _Traits> _Self; williamr@2: # else williamr@2: class sentry { williamr@2: typedef sentry _Self; williamr@2: #endif williamr@4: williamr@2: private: williamr@2: const bool _M_ok; williamr@2: // basic_streambuf<_CharT, _Traits>* _M_buf; williamr@4: williamr@2: public: williamr@2: typedef _Traits traits_type; williamr@4: williamr@4: explicit sentry(basic_istream<_CharT, _Traits>& __istr, williamr@4: bool __noskipws = false) : williamr@4: _M_ok((__noskipws || !(__istr.flags() & ios_base::skipws)) ? _M_init_noskip(__istr) : _M_init_skip(__istr) ) williamr@4: /* , _M_buf(__istr.rdbuf()) */ williamr@2: {} williamr@4: williamr@4: // Calling this constructor is the same as calling the previous one with williamr@2: // __noskipws = true, except that it doesn't require a runtime test. williamr@4: sentry(basic_istream<_CharT, _Traits>& __istr, _No_Skip_WS) : /* _M_buf(__istr.rdbuf()), */ williamr@4: _M_ok(_M_init_noskip(__istr)) {} williamr@4: williamr@2: ~sentry() {} williamr@4: williamr@2: operator bool() const { return _M_ok; } williamr@4: williamr@2: private: // Disable assignment and copy constructor. williamr@4: //Implementation is here only to avoid warning with some compilers. williamr@2: sentry(const _Self&) : _M_ok(false) {} williamr@4: _Self& operator=(const _Self&) { return *this; } williamr@2: }; williamr@4: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: # undef sentry williamr@2: # else williamr@2: // close basic_istream class definition here williamr@2: }; williamr@2: # endif williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS _Isentry >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_istream >; williamr@2: # if ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS _Isentry >; williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_istream >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: // Non-member character and string extractor functions. williamr@2: template williamr@4: inline basic_istream<_CharT, _Traits>& _STLP_CALL williamr@4: operator>>(basic_istream<_CharT, _Traits>& __in_str, _CharT& __c) { williamr@4: __in_str._M_formatted_get(__c); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: template williamr@4: inline basic_istream& _STLP_CALL williamr@4: operator>>(basic_istream& __in_str, unsigned char& __c) { williamr@4: __in_str._M_formatted_get(__REINTERPRET_CAST(char&,__c)); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: template williamr@4: inline basic_istream& _STLP_CALL williamr@4: operator>>(basic_istream& __in_str, signed char& __c) { williamr@4: __in_str._M_formatted_get(__REINTERPRET_CAST(char&,__c)); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: template williamr@4: inline basic_istream<_CharT, _Traits>& _STLP_CALL williamr@4: operator>>(basic_istream<_CharT, _Traits>& __in_str, _CharT* __s) { williamr@4: __in_str._M_formatted_get(__s); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: template williamr@4: inline basic_istream& _STLP_CALL williamr@4: operator>>(basic_istream& __in_str, unsigned char* __s) { williamr@4: __in_str._M_formatted_get(__REINTERPRET_CAST(char*,__s)); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: template williamr@4: inline basic_istream& _STLP_CALL williamr@4: operator>>(basic_istream& __in_str, signed char* __s) { williamr@4: __in_str._M_formatted_get(__REINTERPRET_CAST(char*,__s)); williamr@4: return __in_str; williamr@2: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // istream manipulator. williamr@2: template williamr@2: basic_istream<_CharT, _Traits>& _STLP_CALL williamr@4: ws(basic_istream<_CharT, _Traits>& __istr) { williamr@4: if (!__istr.eof()) { williamr@4: typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry; williamr@4: _Sentry __sentry(__istr, _No_Skip_WS()); // Don't skip whitespace. williamr@4: if (__sentry) williamr@4: __istr._M_skip_whitespace(false); williamr@4: } williamr@4: return __istr; williamr@4: } williamr@4: williamr@4: // Helper functions for istream<>::sentry constructor. williamr@4: template williamr@4: inline bool _M_init_skip(basic_istream<_CharT, _Traits>& __istr) { williamr@4: if (__istr.good()) { williamr@4: if (__istr.tie()) williamr@4: __istr.tie()->flush(); williamr@4: williamr@4: __istr._M_skip_whitespace(true); williamr@4: } williamr@4: williamr@4: if (!__istr.good()) { williamr@4: __istr.setstate(ios_base::failbit); williamr@4: return false; williamr@4: } else williamr@4: return true; williamr@4: } williamr@4: williamr@4: template williamr@4: inline bool _M_init_noskip(basic_istream<_CharT, _Traits>& __istr) { williamr@4: if (__istr.good()) { williamr@4: if (__istr.tie()) williamr@4: __istr.tie()->flush(); williamr@4: williamr@4: if (!__istr.rdbuf()) williamr@4: __istr.setstate(ios_base::badbit); williamr@4: } williamr@4: else williamr@4: __istr.setstate(ios_base::failbit); williamr@4: return __istr.good(); williamr@4: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class iostream. williamr@2: template williamr@2: class basic_iostream williamr@2: : public basic_istream<_CharT, _Traits>, williamr@2: public basic_ostream<_CharT, _Traits> williamr@2: { williamr@2: public: williamr@2: typedef basic_ios<_CharT, _Traits> _Basic_ios; williamr@2: williamr@4: explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf); williamr@4: virtual ~basic_iostream(); williamr@2: }; williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_iostream >; williamr@4: williamr@2: # if ! defined (_STLP_NO_WCHAR_T) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_iostream >; williamr@2: # endif williamr@2: # endif /* _STLP_USE_TEMPLATE_EXPORT */ williamr@2: williamr@2: template williamr@4: basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& __istr) williamr@4: { return __istr.rdbuf(); } williamr@2: williamr@2: _STLP_END_NAMESPACE williamr@2: williamr@4: #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION) williamr@2: # include williamr@4: #endif williamr@2: williamr@4: #endif /* _STLP_INTERNAL_ISTREAM */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: