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: #ifndef _STLP_INTERNAL_ISTREAM_H williamr@2: #define _STLP_INTERNAL_ISTREAM_H williamr@2: williamr@2: // this block is included by _ostream.h, we include it here to lower #include level williamr@2: # if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_CWCHAR_H) williamr@2: # include williamr@2: # endif williamr@2: williamr@2: # ifndef _STLP_INTERNAL_IOS_H williamr@2: # include // For basic_ios<>. Includes . williamr@2: # endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_OSTREAM_H williamr@2: # include // Needed as a base class of basic_iostream. williamr@2: #endif williamr@2: williamr@2: #ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H williamr@2: # 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: template williamr@2: ios_base::iostate _STLP_CALL williamr@2: _M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val); 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@2: bool _M_init_skip(basic_istream<_CharT, _Traits>& __is); williamr@2: template williamr@2: bool _M_init_noskip(basic_istream<_CharT, _Traits>& __is); 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@2: // 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@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: typedef basic_istream<_CharT, _Traits> _Self; 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@2: _STLP_DECLSPEC explicit basic_istream(basic_streambuf<_CharT, _Traits>* __buf); williamr@2: _STLP_DECLSPEC ~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@2: _Self& operator>> (short& __val) { williamr@2: long __lval = __val; williamr@2: unsigned short __uval; williamr@2: _M_get_num(*this, __lval); williamr@2: __val = __STATIC_CAST(short, __lval); williamr@2: __uval = __lval; williamr@2: // check if we lose digits williamr@2: // if ((__val != __lval) && ((unsigned short)__val != __lval)) williamr@2: if ((__val != __lval) && ((long)__uval != __lval)) williamr@2: this->setstate(ios_base::failbit); williamr@2: return *this; williamr@2: } williamr@2: _Self& operator>> (int& __val) { williamr@2: long __lval = __val; williamr@2: unsigned int __uval; williamr@2: _M_get_num(*this, __lval); williamr@2: __val = __lval; williamr@2: __uval = __lval; williamr@2: // check if we lose digits williamr@2: // if ((__val != __lval) && ((unsigned int)__val != __lval)) williamr@2: if ((__val != __lval) && ((long)__uval != __lval)) williamr@2: this->setstate(ios_base::failbit); williamr@2: return *this; williamr@2: } williamr@2: _Self& operator>> (unsigned short& __val) { _M_get_num(*this, __val); return *this; } williamr@2: _Self& operator>> (unsigned int& __val) { _M_get_num(*this, __val); return *this; } williamr@2: _Self& operator>> (long& __val) { _M_get_num(*this, __val); return *this; } williamr@2: _Self& operator>> (unsigned long& __val) { _M_get_num(*this, __val); return *this; } williamr@2: #ifdef _STLP_LONG_LONG williamr@2: _Self& operator>> (_STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; } williamr@2: _Self& operator>> (unsigned _STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; } williamr@2: #endif williamr@2: _Self& operator>> (float& __val) { _M_get_num(*this, __val); return *this; } williamr@2: _Self& operator>> (double& __val) { _M_get_num(*this, __val); return *this; } williamr@2: # ifndef _STLP_NO_LONG_DOUBLE williamr@2: _Self& operator>> (long double& __val) { _M_get_num(*this, __val); return *this; } williamr@2: # endif williamr@2: # ifndef _STLP_NO_BOOL williamr@2: _Self& operator>> (bool& __val) { _M_get_num(*this, __val); return *this; } williamr@2: # endif williamr@2: _Self& operator>> (void*& __val) { _M_get_num(*this, __val); return *this; } 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@2: williamr@2: private: williamr@2: const bool _M_ok; williamr@2: // basic_streambuf<_CharT, _Traits>* _M_buf; williamr@2: williamr@2: public: williamr@2: typedef _Traits traits_type; williamr@2: williamr@2: explicit sentry(basic_istream<_CharT, _Traits>& __is, williamr@2: bool __noskipws = false) : williamr@2: _M_ok((__noskipws || !(__is.flags() & ios_base::skipws)) ? _M_init_noskip(__is) : _M_init_skip(__is) ) williamr@2: /* , _M_buf(__is.rdbuf()) */ williamr@2: {} williamr@2: williamr@2: // 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@2: sentry(basic_istream<_CharT, _Traits>& __is, _No_Skip_WS) : /* _M_buf(__is.rdbuf()), */ williamr@2: _M_ok(_M_init_noskip(__is)) {} williamr@2: williamr@2: ~sentry() {} williamr@2: williamr@2: operator bool() const { return _M_ok; } williamr@2: williamr@2: private: // Disable assignment and copy constructor. williamr@2: sentry(const _Self&) : _M_ok(false) {} williamr@2: void operator=(const _Self&) {} williamr@2: }; williamr@2: 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: williamr@2: template williamr@2: inline basic_istream<_CharT, _Traits>& _STLP_CALL williamr@2: operator>>(basic_istream<_CharT, _Traits>& __stl_in, _CharT& __c) { williamr@2: __stl_in._M_formatted_get(__c); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_istream& _STLP_CALL williamr@2: operator>>(basic_istream& __stl_in, unsigned char& __c) { williamr@2: __stl_in._M_formatted_get(__REINTERPRET_CAST(char&,__c)); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_istream& _STLP_CALL williamr@2: operator>>(basic_istream& __stl_in, signed char& __c) { williamr@2: __stl_in._M_formatted_get(__REINTERPRET_CAST(char&,__c)); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_istream<_CharT, _Traits>& _STLP_CALL williamr@2: operator>>(basic_istream<_CharT, _Traits>& __stl_in, _CharT* __s) { williamr@2: __stl_in._M_formatted_get(__s); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_istream& _STLP_CALL williamr@2: operator>>(basic_istream& __stl_in, unsigned char* __s) { williamr@2: __stl_in._M_formatted_get(__REINTERPRET_CAST(char*,__s)); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: template williamr@2: inline basic_istream& _STLP_CALL williamr@2: operator>>(basic_istream& __stl_in, signed char* __s) { williamr@2: __stl_in._M_formatted_get(__REINTERPRET_CAST(char*,__s)); williamr@2: return __stl_in; williamr@2: } williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // istream manipulator. williamr@2: template williamr@2: basic_istream<_CharT, _Traits>& _STLP_CALL williamr@2: ws(basic_istream<_CharT, _Traits>& __is); williamr@2: williamr@2: //---------------------------------------------------------------------- williamr@2: // Class iostream. williamr@2: 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@2: _STLP_DECLSPEC explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf); williamr@2: _STLP_DECLSPEC virtual ~basic_iostream(); williamr@2: }; williamr@2: williamr@2: # if defined (_STLP_USE_TEMPLATE_EXPORT) williamr@2: _STLP_EXPORT_TEMPLATE_CLASS basic_iostream >; 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@2: basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& __is) williamr@2: { williamr@2: return __is.rdbuf(); williamr@2: } 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_INTERNAL_ISTREAM_H */ williamr@2: williamr@2: // Local Variables: williamr@2: // mode:C++ williamr@2: // End: