10b57cec5SDimitry Andric// -*- C++ -*- 2349cc55cSDimitry Andric//===----------------------------------------------------------------------===// 30b57cec5SDimitry Andric// 40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric// 80b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric#ifndef _LIBCPP_ISTREAM 110b57cec5SDimitry Andric#define _LIBCPP_ISTREAM 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric/* 140b57cec5SDimitry Andric istream synopsis 150b57cec5SDimitry Andric 160b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> > 170b57cec5SDimitry Andricclass basic_istream 180b57cec5SDimitry Andric : virtual public basic_ios<charT,traits> 190b57cec5SDimitry Andric{ 200b57cec5SDimitry Andricpublic: 210b57cec5SDimitry Andric // types (inherited from basic_ios (27.5.4)): 220b57cec5SDimitry Andric typedef charT char_type; 230b57cec5SDimitry Andric typedef traits traits_type; 240b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 250b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 260b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric // 27.7.1.1.1 Constructor/destructor: 290b57cec5SDimitry Andric explicit basic_istream(basic_streambuf<char_type, traits_type>* sb); 300b57cec5SDimitry Andric basic_istream(basic_istream&& rhs); 310b57cec5SDimitry Andric virtual ~basic_istream(); 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric // 27.7.1.1.2 Assign/swap: 340b57cec5SDimitry Andric basic_istream& operator=(basic_istream&& rhs); 350b57cec5SDimitry Andric void swap(basic_istream& rhs); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric // 27.7.1.1.3 Prefix/suffix: 380b57cec5SDimitry Andric class sentry; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric // 27.7.1.2 Formatted input: 410b57cec5SDimitry Andric basic_istream& operator>>(basic_istream& (*pf)(basic_istream&)); 420b57cec5SDimitry Andric basic_istream& operator>>(basic_ios<char_type, traits_type>& 430b57cec5SDimitry Andric (*pf)(basic_ios<char_type, traits_type>&)); 440b57cec5SDimitry Andric basic_istream& operator>>(ios_base& (*pf)(ios_base&)); 450b57cec5SDimitry Andric basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb); 460b57cec5SDimitry Andric basic_istream& operator>>(bool& n); 470b57cec5SDimitry Andric basic_istream& operator>>(short& n); 480b57cec5SDimitry Andric basic_istream& operator>>(unsigned short& n); 490b57cec5SDimitry Andric basic_istream& operator>>(int& n); 500b57cec5SDimitry Andric basic_istream& operator>>(unsigned int& n); 510b57cec5SDimitry Andric basic_istream& operator>>(long& n); 520b57cec5SDimitry Andric basic_istream& operator>>(unsigned long& n); 530b57cec5SDimitry Andric basic_istream& operator>>(long long& n); 540b57cec5SDimitry Andric basic_istream& operator>>(unsigned long long& n); 550b57cec5SDimitry Andric basic_istream& operator>>(float& f); 560b57cec5SDimitry Andric basic_istream& operator>>(double& f); 570b57cec5SDimitry Andric basic_istream& operator>>(long double& f); 580b57cec5SDimitry Andric basic_istream& operator>>(void*& p); 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric // 27.7.1.3 Unformatted input: 610b57cec5SDimitry Andric streamsize gcount() const; 620b57cec5SDimitry Andric int_type get(); 630b57cec5SDimitry Andric basic_istream& get(char_type& c); 640b57cec5SDimitry Andric basic_istream& get(char_type* s, streamsize n); 650b57cec5SDimitry Andric basic_istream& get(char_type* s, streamsize n, char_type delim); 660b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type,traits_type>& sb); 670b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim); 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric basic_istream& getline(char_type* s, streamsize n); 700b57cec5SDimitry Andric basic_istream& getline(char_type* s, streamsize n, char_type delim); 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof()); 730b57cec5SDimitry Andric int_type peek(); 740b57cec5SDimitry Andric basic_istream& read (char_type* s, streamsize n); 750b57cec5SDimitry Andric streamsize readsome(char_type* s, streamsize n); 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric basic_istream& putback(char_type c); 780b57cec5SDimitry Andric basic_istream& unget(); 790b57cec5SDimitry Andric int sync(); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric pos_type tellg(); 820b57cec5SDimitry Andric basic_istream& seekg(pos_type); 830b57cec5SDimitry Andric basic_istream& seekg(off_type, ios_base::seekdir); 840b57cec5SDimitry Andricprotected: 850b57cec5SDimitry Andric basic_istream(const basic_istream& rhs) = delete; 860b57cec5SDimitry Andric basic_istream(basic_istream&& rhs); 870b57cec5SDimitry Andric // 27.7.2.1.2 Assign/swap: 880b57cec5SDimitry Andric basic_istream& operator=(const basic_istream& rhs) = delete; 890b57cec5SDimitry Andric basic_istream& operator=(basic_istream&& rhs); 900b57cec5SDimitry Andric void swap(basic_istream& rhs); 910b57cec5SDimitry Andric}; 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric// 27.7.1.2.3 character extraction templates: 940b57cec5SDimitry Andrictemplate<class charT, class traits> 950b57cec5SDimitry Andric basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&); 960b57cec5SDimitry Andric 970b57cec5SDimitry Andrictemplate<class traits> 980b57cec5SDimitry Andric basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&); 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andrictemplate<class traits> 1010b57cec5SDimitry Andric basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&); 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andrictemplate<class charT, class traits> 1040b57cec5SDimitry Andric basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*); 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andrictemplate<class traits> 1070b57cec5SDimitry Andric basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*); 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andrictemplate<class traits> 1100b57cec5SDimitry Andric basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*); 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andrictemplate <class charT, class traits> 1130b57cec5SDimitry Andric void 1140b57cec5SDimitry Andric swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y); 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andrictypedef basic_istream<char> istream; 1170b57cec5SDimitry Andrictypedef basic_istream<wchar_t> wistream; 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andrictemplate <class charT, class traits = char_traits<charT> > 1200b57cec5SDimitry Andricclass basic_iostream : 1210b57cec5SDimitry Andric public basic_istream<charT,traits>, 1220b57cec5SDimitry Andric public basic_ostream<charT,traits> 1230b57cec5SDimitry Andric{ 1240b57cec5SDimitry Andricpublic: 1250b57cec5SDimitry Andric // types: 1260b57cec5SDimitry Andric typedef charT char_type; 1270b57cec5SDimitry Andric typedef traits traits_type; 1280b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1290b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1300b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric // constructor/destructor 1330b57cec5SDimitry Andric explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb); 1340b57cec5SDimitry Andric basic_iostream(basic_iostream&& rhs); 1350b57cec5SDimitry Andric virtual ~basic_iostream(); 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric // assign/swap 1380b57cec5SDimitry Andric basic_iostream& operator=(basic_iostream&& rhs); 1390b57cec5SDimitry Andric void swap(basic_iostream& rhs); 1400b57cec5SDimitry Andric}; 1410b57cec5SDimitry Andric 1420b57cec5SDimitry Andrictemplate <class charT, class traits> 1430b57cec5SDimitry Andric void 1440b57cec5SDimitry Andric swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y); 1450b57cec5SDimitry Andric 1460b57cec5SDimitry Andrictypedef basic_iostream<char> iostream; 1470b57cec5SDimitry Andrictypedef basic_iostream<wchar_t> wiostream; 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andrictemplate <class charT, class traits> 1500b57cec5SDimitry Andric basic_istream<charT,traits>& 1510b57cec5SDimitry Andric ws(basic_istream<charT,traits>& is); 1520b57cec5SDimitry Andric 153e8d8bef9SDimitry Andric// rvalue stream extraction 154e8d8bef9SDimitry Andrictemplate <class Stream, class T> 155e8d8bef9SDimitry Andric Stream&& operator>>(Stream&& is, T&& x); 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric} // std 1580b57cec5SDimitry Andric 1590b57cec5SDimitry Andric*/ 1600b57cec5SDimitry Andric 16181ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler 1620b57cec5SDimitry Andric#include <__config> 16306c3fb27SDimitry Andric#include <__fwd/istream.h> 16481ad6265SDimitry Andric#include <__iterator/istreambuf_iterator.h> 16506c3fb27SDimitry Andric#include <__type_traits/conjunction.h> 16606c3fb27SDimitry Andric#include <__type_traits/enable_if.h> 16706c3fb27SDimitry Andric#include <__type_traits/is_base_of.h> 16806c3fb27SDimitry Andric#include <__utility/declval.h> 169fe6060f1SDimitry Andric#include <__utility/forward.h> 1700b57cec5SDimitry Andric#include <ostream> 171fe6060f1SDimitry Andric#include <version> 1720b57cec5SDimitry Andric 1730b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1740b57cec5SDimitry Andric# pragma GCC system_header 1750b57cec5SDimitry Andric#endif 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1780b57cec5SDimitry Andric#include <__undef_macros> 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1840b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream 1850b57cec5SDimitry Andric : virtual public basic_ios<_CharT, _Traits> 1860b57cec5SDimitry Andric{ 1870b57cec5SDimitry Andric streamsize __gc_; 188*5f757f3fSDimitry Andric 189*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI void __inc_gcount() { 190*5f757f3fSDimitry Andric if (__gc_ < numeric_limits<streamsize>::max()) 191*5f757f3fSDimitry Andric ++__gc_; 192*5f757f3fSDimitry Andric } 1930b57cec5SDimitry Andricpublic: 1940b57cec5SDimitry Andric // types (inherited from basic_ios (27.5.4)): 1950b57cec5SDimitry Andric typedef _CharT char_type; 1960b57cec5SDimitry Andric typedef _Traits traits_type; 1970b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1980b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1990b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric // 27.7.1.1.1 Constructor/destructor: 2020b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2030b57cec5SDimitry Andric explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) : __gc_(0) 2040b57cec5SDimitry Andric { this->init(__sb); } 205bdd1243dSDimitry Andric ~basic_istream() override; 2060b57cec5SDimitry Andricprotected: 207*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 2080b57cec5SDimitry Andric basic_istream(basic_istream&& __rhs); 2090b57cec5SDimitry Andric 2100b57cec5SDimitry Andric // 27.7.1.1.2 Assign/swap: 211*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 2120b57cec5SDimitry Andric basic_istream& operator=(basic_istream&& __rhs); 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2150b57cec5SDimitry Andric void swap(basic_istream& __rhs) { 216*5f757f3fSDimitry Andric std::swap(__gc_, __rhs.__gc_); 2170b57cec5SDimitry Andric basic_ios<char_type, traits_type>::swap(__rhs); 2180b57cec5SDimitry Andric } 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andric basic_istream (const basic_istream& __rhs) = delete; 2210b57cec5SDimitry Andric basic_istream& operator=(const basic_istream& __rhs) = delete; 2220b57cec5SDimitry Andricpublic: 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric // 27.7.1.1.3 Prefix/suffix: 2250b57cec5SDimitry Andric class _LIBCPP_TEMPLATE_VIS sentry; 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric // 27.7.1.2 Formatted input: 2280b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2290b57cec5SDimitry Andric basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) 2300b57cec5SDimitry Andric { return __pf(*this); } 2310b57cec5SDimitry Andric 2320b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2330b57cec5SDimitry Andric basic_istream& operator>>(basic_ios<char_type, traits_type>& 2340b57cec5SDimitry Andric (*__pf)(basic_ios<char_type, traits_type>&)) 2350b57cec5SDimitry Andric { __pf(*this); return *this; } 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2380b57cec5SDimitry Andric basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) 2390b57cec5SDimitry Andric { __pf(*this); return *this; } 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andric basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb); 2420b57cec5SDimitry Andric basic_istream& operator>>(bool& __n); 2430b57cec5SDimitry Andric basic_istream& operator>>(short& __n); 2440b57cec5SDimitry Andric basic_istream& operator>>(unsigned short& __n); 2450b57cec5SDimitry Andric basic_istream& operator>>(int& __n); 2460b57cec5SDimitry Andric basic_istream& operator>>(unsigned int& __n); 2470b57cec5SDimitry Andric basic_istream& operator>>(long& __n); 2480b57cec5SDimitry Andric basic_istream& operator>>(unsigned long& __n); 2490b57cec5SDimitry Andric basic_istream& operator>>(long long& __n); 2500b57cec5SDimitry Andric basic_istream& operator>>(unsigned long long& __n); 2510b57cec5SDimitry Andric basic_istream& operator>>(float& __f); 2520b57cec5SDimitry Andric basic_istream& operator>>(double& __f); 2530b57cec5SDimitry Andric basic_istream& operator>>(long double& __f); 2540b57cec5SDimitry Andric basic_istream& operator>>(void*& __p); 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric // 27.7.1.3 Unformatted input: 257*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 2580b57cec5SDimitry Andric streamsize gcount() const {return __gc_;} 2590b57cec5SDimitry Andric int_type get(); 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2620b57cec5SDimitry Andric basic_istream& get(char_type& __c) { 2630b57cec5SDimitry Andric int_type __ch = get(); 2640b57cec5SDimitry Andric if (__ch != traits_type::eof()) 2650b57cec5SDimitry Andric __c = traits_type::to_char_type(__ch); 2660b57cec5SDimitry Andric return *this; 2670b57cec5SDimitry Andric } 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2700b57cec5SDimitry Andric basic_istream& get(char_type* __s, streamsize __n) 2710b57cec5SDimitry Andric { return get(__s, __n, this->widen('\n')); } 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); 2740b57cec5SDimitry Andric 2750b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2760b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) 2770b57cec5SDimitry Andric { return get(__sb, this->widen('\n')); } 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); 2800b57cec5SDimitry Andric 2810b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 2820b57cec5SDimitry Andric basic_istream& getline(char_type* __s, streamsize __n) 2830b57cec5SDimitry Andric { return getline(__s, __n, this->widen('\n')); } 2840b57cec5SDimitry Andric 2850b57cec5SDimitry Andric basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm); 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof()); 2880b57cec5SDimitry Andric int_type peek(); 2890b57cec5SDimitry Andric basic_istream& read (char_type* __s, streamsize __n); 2900b57cec5SDimitry Andric streamsize readsome(char_type* __s, streamsize __n); 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric basic_istream& putback(char_type __c); 2930b57cec5SDimitry Andric basic_istream& unget(); 2940b57cec5SDimitry Andric int sync(); 2950b57cec5SDimitry Andric 2960b57cec5SDimitry Andric pos_type tellg(); 2970b57cec5SDimitry Andric basic_istream& seekg(pos_type __pos); 2980b57cec5SDimitry Andric basic_istream& seekg(off_type __off, ios_base::seekdir __dir); 2990b57cec5SDimitry Andric}; 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3020b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry 3030b57cec5SDimitry Andric{ 3040b57cec5SDimitry Andric bool __ok_; 3050b57cec5SDimitry Andric 3060b57cec5SDimitry Andricpublic: 3070b57cec5SDimitry Andric explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); 3080b57cec5SDimitry Andric// ~sentry() = default; 3090b57cec5SDimitry Andric 310*5f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI 311fe6060f1SDimitry Andric explicit operator bool() const {return __ok_;} 3120eae32dcSDimitry Andric 3130eae32dcSDimitry Andric sentry(const sentry&) = delete; 3140eae32dcSDimitry Andric sentry& operator=(const sentry&) = delete; 3150b57cec5SDimitry Andric}; 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3180b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, 3190b57cec5SDimitry Andric bool __noskipws) 3200b57cec5SDimitry Andric : __ok_(false) 3210b57cec5SDimitry Andric{ 3220b57cec5SDimitry Andric if (__is.good()) 3230b57cec5SDimitry Andric { 3240b57cec5SDimitry Andric if (__is.tie()) 3250b57cec5SDimitry Andric __is.tie()->flush(); 3260b57cec5SDimitry Andric if (!__noskipws && (__is.flags() & ios_base::skipws)) 3270b57cec5SDimitry Andric { 3280b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 329bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 3300b57cec5SDimitry Andric _Ip __i(__is); 3310b57cec5SDimitry Andric _Ip __eof; 3320b57cec5SDimitry Andric for (; __i != __eof; ++__i) 3330b57cec5SDimitry Andric if (!__ct.is(__ct.space, *__i)) 3340b57cec5SDimitry Andric break; 3350b57cec5SDimitry Andric if (__i == __eof) 3360b57cec5SDimitry Andric __is.setstate(ios_base::failbit | ios_base::eofbit); 3370b57cec5SDimitry Andric } 3380b57cec5SDimitry Andric __ok_ = __is.good(); 3390b57cec5SDimitry Andric } 3400b57cec5SDimitry Andric else 3410b57cec5SDimitry Andric __is.setstate(ios_base::failbit); 3420b57cec5SDimitry Andric} 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3450b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) 3460b57cec5SDimitry Andric : __gc_(__rhs.__gc_) 3470b57cec5SDimitry Andric{ 3480b57cec5SDimitry Andric __rhs.__gc_ = 0; 3490b57cec5SDimitry Andric this->move(__rhs); 3500b57cec5SDimitry Andric} 3510b57cec5SDimitry Andric 3520b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3530b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 3540b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) 3550b57cec5SDimitry Andric{ 3560b57cec5SDimitry Andric swap(__rhs); 3570b57cec5SDimitry Andric return *this; 3580b57cec5SDimitry Andric} 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3610b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream() 3620b57cec5SDimitry Andric{ 3630b57cec5SDimitry Andric} 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 366*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 3670b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 3680b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 3690b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 3700b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 3710b57cec5SDimitry Andric if (__s) 3720b57cec5SDimitry Andric { 37306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 3740b57cec5SDimitry Andric try 3750b57cec5SDimitry Andric { 37606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3770b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3780b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 379bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n); 38006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 3810b57cec5SDimitry Andric } 3820b57cec5SDimitry Andric catch (...) 3830b57cec5SDimitry Andric { 3840b57cec5SDimitry Andric __state |= ios_base::badbit; 3850b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 3860b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 3870b57cec5SDimitry Andric { 3880b57cec5SDimitry Andric throw; 3890b57cec5SDimitry Andric } 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric#endif 3920b57cec5SDimitry Andric __is.setstate(__state); 3930b57cec5SDimitry Andric } 3940b57cec5SDimitry Andric return __is; 3950b57cec5SDimitry Andric} 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 3980b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 3990b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) 4000b57cec5SDimitry Andric{ 401*5f757f3fSDimitry Andric return std::__input_arithmetic<unsigned short>(*this, __n); 4020b57cec5SDimitry Andric} 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4050b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4060b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) 4070b57cec5SDimitry Andric{ 408*5f757f3fSDimitry Andric return std::__input_arithmetic<unsigned int>(*this, __n); 4090b57cec5SDimitry Andric} 4100b57cec5SDimitry Andric 4110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4120b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4130b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long& __n) 4140b57cec5SDimitry Andric{ 415*5f757f3fSDimitry Andric return std::__input_arithmetic<long>(*this, __n); 4160b57cec5SDimitry Andric} 4170b57cec5SDimitry Andric 4180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4190b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4200b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) 4210b57cec5SDimitry Andric{ 422*5f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long>(*this, __n); 4230b57cec5SDimitry Andric} 4240b57cec5SDimitry Andric 4250b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4260b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4270b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long long& __n) 4280b57cec5SDimitry Andric{ 429*5f757f3fSDimitry Andric return std::__input_arithmetic<long long>(*this, __n); 4300b57cec5SDimitry Andric} 4310b57cec5SDimitry Andric 4320b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4330b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4340b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) 4350b57cec5SDimitry Andric{ 436*5f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long long>(*this, __n); 4370b57cec5SDimitry Andric} 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4400b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4410b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(float& __n) 4420b57cec5SDimitry Andric{ 443*5f757f3fSDimitry Andric return std::__input_arithmetic<float>(*this, __n); 4440b57cec5SDimitry Andric} 4450b57cec5SDimitry Andric 4460b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4470b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4480b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(double& __n) 4490b57cec5SDimitry Andric{ 450*5f757f3fSDimitry Andric return std::__input_arithmetic<double>(*this, __n); 4510b57cec5SDimitry Andric} 4520b57cec5SDimitry Andric 4530b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4540b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4550b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(long double& __n) 4560b57cec5SDimitry Andric{ 457*5f757f3fSDimitry Andric return std::__input_arithmetic<long double>(*this, __n); 4580b57cec5SDimitry Andric} 4590b57cec5SDimitry Andric 4600b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4610b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4620b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(bool& __n) 4630b57cec5SDimitry Andric{ 464*5f757f3fSDimitry Andric return std::__input_arithmetic<bool>(*this, __n); 4650b57cec5SDimitry Andric} 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 4680b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4690b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(void*& __n) 4700b57cec5SDimitry Andric{ 471*5f757f3fSDimitry Andric return std::__input_arithmetic<void*>(*this, __n); 4720b57cec5SDimitry Andric} 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 475*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 4760b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 4770b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 4780b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 4790b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 4800b57cec5SDimitry Andric if (__s) 4810b57cec5SDimitry Andric { 48206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 4830b57cec5SDimitry Andric try 4840b57cec5SDimitry Andric { 48506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 4860b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 4870b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 4880b57cec5SDimitry Andric long __temp; 489bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp); 4900b57cec5SDimitry Andric if (__temp < numeric_limits<_Tp>::min()) 4910b57cec5SDimitry Andric { 4920b57cec5SDimitry Andric __state |= ios_base::failbit; 4930b57cec5SDimitry Andric __n = numeric_limits<_Tp>::min(); 4940b57cec5SDimitry Andric } 4950b57cec5SDimitry Andric else if (__temp > numeric_limits<_Tp>::max()) 4960b57cec5SDimitry Andric { 4970b57cec5SDimitry Andric __state |= ios_base::failbit; 4980b57cec5SDimitry Andric __n = numeric_limits<_Tp>::max(); 4990b57cec5SDimitry Andric } 5000b57cec5SDimitry Andric else 5010b57cec5SDimitry Andric { 5020b57cec5SDimitry Andric __n = static_cast<_Tp>(__temp); 5030b57cec5SDimitry Andric } 50406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 5050b57cec5SDimitry Andric } 5060b57cec5SDimitry Andric catch (...) 5070b57cec5SDimitry Andric { 5080b57cec5SDimitry Andric __state |= ios_base::badbit; 5090b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 5100b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 5110b57cec5SDimitry Andric { 5120b57cec5SDimitry Andric throw; 5130b57cec5SDimitry Andric } 5140b57cec5SDimitry Andric } 51506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 5160b57cec5SDimitry Andric __is.setstate(__state); 5170b57cec5SDimitry Andric } 5180b57cec5SDimitry Andric return __is; 5190b57cec5SDimitry Andric} 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 5220b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 5230b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(short& __n) 5240b57cec5SDimitry Andric{ 525*5f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<short>(*this, __n); 5260b57cec5SDimitry Andric} 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 5290b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 5300b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(int& __n) 5310b57cec5SDimitry Andric{ 532*5f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<int>(*this, __n); 5330b57cec5SDimitry Andric} 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 536*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 5370b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 5380b57cec5SDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) 5390b57cec5SDimitry Andric{ 5400b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 5410b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 5420b57cec5SDimitry Andric if (__sen) 5430b57cec5SDimitry Andric { 54406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 5450b57cec5SDimitry Andric try 5460b57cec5SDimitry Andric { 5470b57cec5SDimitry Andric#endif 5480b57cec5SDimitry Andric _CharT* __s = __p; 549bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 5500b57cec5SDimitry Andric while (__s != __p + (__n-1)) 5510b57cec5SDimitry Andric { 5520b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 5530b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 5540b57cec5SDimitry Andric { 5550b57cec5SDimitry Andric __state |= ios_base::eofbit; 5560b57cec5SDimitry Andric break; 5570b57cec5SDimitry Andric } 5580b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 5590b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 5600b57cec5SDimitry Andric break; 5610b57cec5SDimitry Andric *__s++ = __ch; 5620b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 5630b57cec5SDimitry Andric } 5640b57cec5SDimitry Andric *__s = _CharT(); 5650b57cec5SDimitry Andric __is.width(0); 5660b57cec5SDimitry Andric if (__s == __p) 5670b57cec5SDimitry Andric __state |= ios_base::failbit; 56806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 5690b57cec5SDimitry Andric } 5700b57cec5SDimitry Andric catch (...) 5710b57cec5SDimitry Andric { 5720b57cec5SDimitry Andric __state |= ios_base::badbit; 5730b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 5740b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 5750b57cec5SDimitry Andric { 5760b57cec5SDimitry Andric throw; 5770b57cec5SDimitry Andric } 5780b57cec5SDimitry Andric } 5790b57cec5SDimitry Andric#endif 5800b57cec5SDimitry Andric __is.setstate(__state); 5810b57cec5SDimitry Andric } 5820b57cec5SDimitry Andric return __is; 5830b57cec5SDimitry Andric} 5840b57cec5SDimitry Andric 58506c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20 5860b57cec5SDimitry Andric 5870b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, size_t _Np> 588*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 5890b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 5900b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) 5910b57cec5SDimitry Andric{ 5920b57cec5SDimitry Andric size_t __n = _Np; 5930b57cec5SDimitry Andric if (__is.width() > 0) 594*5f757f3fSDimitry Andric __n = std::min(size_t(__is.width()), _Np); 595*5f757f3fSDimitry Andric return std::__input_c_string(__is, __buf, __n); 5960b57cec5SDimitry Andric} 5970b57cec5SDimitry Andric 5980b57cec5SDimitry Andrictemplate<class _Traits, size_t _Np> 599*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6000b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6010b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) 6020b57cec5SDimitry Andric{ 6030b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 6040b57cec5SDimitry Andric} 6050b57cec5SDimitry Andric 6060b57cec5SDimitry Andrictemplate<class _Traits, size_t _Np> 607*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6080b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6090b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) 6100b57cec5SDimitry Andric{ 6110b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 6120b57cec5SDimitry Andric} 6130b57cec5SDimitry Andric 6140b57cec5SDimitry Andric#else 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 617*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6180b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 6190b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) 6200b57cec5SDimitry Andric{ 6210b57cec5SDimitry Andric streamsize __n = __is.width(); 6220b57cec5SDimitry Andric if (__n <= 0) 6230b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1; 624*5f757f3fSDimitry Andric return std::__input_c_string(__is, __s, size_t(__n)); 6250b57cec5SDimitry Andric} 6260b57cec5SDimitry Andric 6270b57cec5SDimitry Andrictemplate<class _Traits> 628*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6290b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6300b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) 6310b57cec5SDimitry Andric{ 6320b57cec5SDimitry Andric return __is >> (char*)__s; 6330b57cec5SDimitry Andric} 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andrictemplate<class _Traits> 636*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6370b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6380b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) 6390b57cec5SDimitry Andric{ 6400b57cec5SDimitry Andric return __is >> (char*)__s; 6410b57cec5SDimitry Andric} 6420b57cec5SDimitry Andric 64306c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 646bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 6470b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) 6480b57cec5SDimitry Andric{ 6490b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6500b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 6510b57cec5SDimitry Andric if (__sen) 6520b57cec5SDimitry Andric { 65306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 6540b57cec5SDimitry Andric try 6550b57cec5SDimitry Andric { 6560b57cec5SDimitry Andric#endif 6570b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 6580b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 6590b57cec5SDimitry Andric __state |= ios_base::eofbit | ios_base::failbit; 6600b57cec5SDimitry Andric else 6610b57cec5SDimitry Andric __c = _Traits::to_char_type(__i); 66206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 6630b57cec5SDimitry Andric } 6640b57cec5SDimitry Andric catch (...) 6650b57cec5SDimitry Andric { 6660b57cec5SDimitry Andric __state |= ios_base::badbit; 6670b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 6680b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 6690b57cec5SDimitry Andric { 6700b57cec5SDimitry Andric throw; 6710b57cec5SDimitry Andric } 6720b57cec5SDimitry Andric } 6730b57cec5SDimitry Andric#endif 6740b57cec5SDimitry Andric __is.setstate(__state); 6750b57cec5SDimitry Andric } 6760b57cec5SDimitry Andric return __is; 6770b57cec5SDimitry Andric} 6780b57cec5SDimitry Andric 6790b57cec5SDimitry Andrictemplate<class _Traits> 680*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6810b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6820b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) 6830b57cec5SDimitry Andric{ 6840b57cec5SDimitry Andric return __is >> (char&)__c; 6850b57cec5SDimitry Andric} 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andrictemplate<class _Traits> 688*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 6890b57cec5SDimitry Andricbasic_istream<char, _Traits>& 6900b57cec5SDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) 6910b57cec5SDimitry Andric{ 6920b57cec5SDimitry Andric return __is >> (char&)__c; 6930b57cec5SDimitry Andric} 6940b57cec5SDimitry Andric 6950b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 6960b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 6970b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) 6980b57cec5SDimitry Andric{ 6990b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7000b57cec5SDimitry Andric __gc_ = 0; 7010b57cec5SDimitry Andric sentry __s(*this, true); 7020b57cec5SDimitry Andric if (__s) 7030b57cec5SDimitry Andric { 7040b57cec5SDimitry Andric if (__sb) 7050b57cec5SDimitry Andric { 70606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 7070b57cec5SDimitry Andric try 7080b57cec5SDimitry Andric { 70906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 7100b57cec5SDimitry Andric while (true) 7110b57cec5SDimitry Andric { 7120b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 7130b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, _Traits::eof())) 7140b57cec5SDimitry Andric { 7150b57cec5SDimitry Andric __state |= ios_base::eofbit; 7160b57cec5SDimitry Andric break; 7170b57cec5SDimitry Andric } 7180b57cec5SDimitry Andric if (traits_type::eq_int_type( 7190b57cec5SDimitry Andric __sb->sputc(traits_type::to_char_type(__i)), 7200b57cec5SDimitry Andric traits_type::eof())) 7210b57cec5SDimitry Andric break; 722*5f757f3fSDimitry Andric __inc_gcount(); 7230b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7240b57cec5SDimitry Andric } 7250b57cec5SDimitry Andric if (__gc_ == 0) 7260b57cec5SDimitry Andric __state |= ios_base::failbit; 72706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 7280b57cec5SDimitry Andric } 7290b57cec5SDimitry Andric catch (...) 7300b57cec5SDimitry Andric { 7310b57cec5SDimitry Andric __state |= ios_base::badbit; 7320b57cec5SDimitry Andric if (__gc_ == 0) 7330b57cec5SDimitry Andric __state |= ios_base::failbit; 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric this->__setstate_nothrow(__state); 7360b57cec5SDimitry Andric if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) 7370b57cec5SDimitry Andric { 7380b57cec5SDimitry Andric throw; 7390b57cec5SDimitry Andric } 7400b57cec5SDimitry Andric } 74106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 7420b57cec5SDimitry Andric } 7430b57cec5SDimitry Andric else 7440b57cec5SDimitry Andric { 7450b57cec5SDimitry Andric __state |= ios_base::failbit; 7460b57cec5SDimitry Andric } 7470b57cec5SDimitry Andric this->setstate(__state); 7480b57cec5SDimitry Andric } 7490b57cec5SDimitry Andric return *this; 7500b57cec5SDimitry Andric} 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 7530b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type 7540b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get() 7550b57cec5SDimitry Andric{ 7560b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7570b57cec5SDimitry Andric __gc_ = 0; 7580b57cec5SDimitry Andric int_type __r = traits_type::eof(); 7590b57cec5SDimitry Andric sentry __s(*this, true); 7600b57cec5SDimitry Andric if (__s) 7610b57cec5SDimitry Andric { 76206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 7630b57cec5SDimitry Andric try 7640b57cec5SDimitry Andric { 7650b57cec5SDimitry Andric#endif 7660b57cec5SDimitry Andric __r = this->rdbuf()->sbumpc(); 7670b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 7680b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 7690b57cec5SDimitry Andric else 7700b57cec5SDimitry Andric __gc_ = 1; 77106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 7720b57cec5SDimitry Andric } 7730b57cec5SDimitry Andric catch (...) 7740b57cec5SDimitry Andric { 7750b57cec5SDimitry Andric this->__setstate_nothrow(this->rdstate() | ios_base::badbit); 7760b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 7770b57cec5SDimitry Andric { 7780b57cec5SDimitry Andric throw; 7790b57cec5SDimitry Andric } 7800b57cec5SDimitry Andric } 7810b57cec5SDimitry Andric#endif 7820b57cec5SDimitry Andric this->setstate(__state); 7830b57cec5SDimitry Andric } 7840b57cec5SDimitry Andric return __r; 7850b57cec5SDimitry Andric} 7860b57cec5SDimitry Andric 7870b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 7880b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 7890b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) 7900b57cec5SDimitry Andric{ 7910b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7920b57cec5SDimitry Andric __gc_ = 0; 7930b57cec5SDimitry Andric sentry __sen(*this, true); 7940b57cec5SDimitry Andric if (__sen) 7950b57cec5SDimitry Andric { 7960b57cec5SDimitry Andric if (__n > 0) 7970b57cec5SDimitry Andric { 79806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 7990b57cec5SDimitry Andric try 8000b57cec5SDimitry Andric { 8010b57cec5SDimitry Andric#endif 8020b57cec5SDimitry Andric while (__gc_ < __n-1) 8030b57cec5SDimitry Andric { 8040b57cec5SDimitry Andric int_type __i = this->rdbuf()->sgetc(); 8050b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) 8060b57cec5SDimitry Andric { 8070b57cec5SDimitry Andric __state |= ios_base::eofbit; 8080b57cec5SDimitry Andric break; 8090b57cec5SDimitry Andric } 8100b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 8110b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 8120b57cec5SDimitry Andric break; 8130b57cec5SDimitry Andric *__s++ = __ch; 814*5f757f3fSDimitry Andric __inc_gcount(); 8150b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 8160b57cec5SDimitry Andric } 8170b57cec5SDimitry Andric if (__gc_ == 0) 8180b57cec5SDimitry Andric __state |= ios_base::failbit; 81906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 8200b57cec5SDimitry Andric } 8210b57cec5SDimitry Andric catch (...) 8220b57cec5SDimitry Andric { 8230b57cec5SDimitry Andric __state |= ios_base::badbit; 8240b57cec5SDimitry Andric this->__setstate_nothrow(__state); 8250b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 8260b57cec5SDimitry Andric { 8270b57cec5SDimitry Andric if (__n > 0) 8280b57cec5SDimitry Andric *__s = char_type(); 8290b57cec5SDimitry Andric throw; 8300b57cec5SDimitry Andric } 8310b57cec5SDimitry Andric } 8320b57cec5SDimitry Andric#endif 8330b57cec5SDimitry Andric } 8340b57cec5SDimitry Andric else 8350b57cec5SDimitry Andric { 8360b57cec5SDimitry Andric __state |= ios_base::failbit; 8370b57cec5SDimitry Andric } 8380b57cec5SDimitry Andric 8390b57cec5SDimitry Andric if (__n > 0) 8400b57cec5SDimitry Andric *__s = char_type(); 8410b57cec5SDimitry Andric this->setstate(__state); 8420b57cec5SDimitry Andric } 8430b57cec5SDimitry Andric if (__n > 0) 8440b57cec5SDimitry Andric *__s = char_type(); 8450b57cec5SDimitry Andric return *this; 8460b57cec5SDimitry Andric} 8470b57cec5SDimitry Andric 8480b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 8490b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 8500b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, 8510b57cec5SDimitry Andric char_type __dlm) 8520b57cec5SDimitry Andric{ 8530b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8540b57cec5SDimitry Andric __gc_ = 0; 8550b57cec5SDimitry Andric sentry __sen(*this, true); 8560b57cec5SDimitry Andric if (__sen) 8570b57cec5SDimitry Andric { 85806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 8590b57cec5SDimitry Andric try 8600b57cec5SDimitry Andric { 86106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8620b57cec5SDimitry Andric while (true) 8630b57cec5SDimitry Andric { 8640b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 8650b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) 8660b57cec5SDimitry Andric { 8670b57cec5SDimitry Andric __state |= ios_base::eofbit; 8680b57cec5SDimitry Andric break; 8690b57cec5SDimitry Andric } 8700b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 8710b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 8720b57cec5SDimitry Andric break; 8730b57cec5SDimitry Andric if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof())) 8740b57cec5SDimitry Andric break; 875*5f757f3fSDimitry Andric __inc_gcount(); 8760b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 8770b57cec5SDimitry Andric } 87806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 8790b57cec5SDimitry Andric } 8800b57cec5SDimitry Andric catch (...) 8810b57cec5SDimitry Andric { 8820b57cec5SDimitry Andric __state |= ios_base::badbit; 8830b57cec5SDimitry Andric // according to the spec, exceptions here are caught but not rethrown 8840b57cec5SDimitry Andric } 88506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8860b57cec5SDimitry Andric if (__gc_ == 0) 8870b57cec5SDimitry Andric __state |= ios_base::failbit; 8880b57cec5SDimitry Andric this->setstate(__state); 8890b57cec5SDimitry Andric } 8900b57cec5SDimitry Andric return *this; 8910b57cec5SDimitry Andric} 8920b57cec5SDimitry Andric 8930b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 8940b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 8950b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) 8960b57cec5SDimitry Andric{ 8970b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8980b57cec5SDimitry Andric __gc_ = 0; 8990b57cec5SDimitry Andric sentry __sen(*this, true); 9000b57cec5SDimitry Andric if (__sen) 9010b57cec5SDimitry Andric { 90206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 9030b57cec5SDimitry Andric try 9040b57cec5SDimitry Andric { 90506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 9060b57cec5SDimitry Andric while (true) 9070b57cec5SDimitry Andric { 9080b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 9090b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) 9100b57cec5SDimitry Andric { 9110b57cec5SDimitry Andric __state |= ios_base::eofbit; 9120b57cec5SDimitry Andric break; 9130b57cec5SDimitry Andric } 9140b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 9150b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 9160b57cec5SDimitry Andric { 9170b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 918*5f757f3fSDimitry Andric __inc_gcount(); 9190b57cec5SDimitry Andric break; 9200b57cec5SDimitry Andric } 9210b57cec5SDimitry Andric if (__gc_ >= __n-1) 9220b57cec5SDimitry Andric { 9230b57cec5SDimitry Andric __state |= ios_base::failbit; 9240b57cec5SDimitry Andric break; 9250b57cec5SDimitry Andric } 9260b57cec5SDimitry Andric *__s++ = __ch; 9270b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 928*5f757f3fSDimitry Andric __inc_gcount(); 9290b57cec5SDimitry Andric } 93006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 9310b57cec5SDimitry Andric } 9320b57cec5SDimitry Andric catch (...) 9330b57cec5SDimitry Andric { 9340b57cec5SDimitry Andric __state |= ios_base::badbit; 9350b57cec5SDimitry Andric this->__setstate_nothrow(__state); 9360b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 9370b57cec5SDimitry Andric { 9380b57cec5SDimitry Andric if (__n > 0) 9390b57cec5SDimitry Andric *__s = char_type(); 9400b57cec5SDimitry Andric if (__gc_ == 0) 9410b57cec5SDimitry Andric __state |= ios_base::failbit; 9420b57cec5SDimitry Andric throw; 9430b57cec5SDimitry Andric } 9440b57cec5SDimitry Andric } 94506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 9460b57cec5SDimitry Andric } 9470b57cec5SDimitry Andric if (__n > 0) 9480b57cec5SDimitry Andric *__s = char_type(); 9490b57cec5SDimitry Andric if (__gc_ == 0) 9500b57cec5SDimitry Andric __state |= ios_base::failbit; 9510b57cec5SDimitry Andric this->setstate(__state); 9520b57cec5SDimitry Andric return *this; 9530b57cec5SDimitry Andric} 9540b57cec5SDimitry Andric 9550b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 9560b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 9570b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) 9580b57cec5SDimitry Andric{ 9590b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 9600b57cec5SDimitry Andric __gc_ = 0; 9610b57cec5SDimitry Andric sentry __sen(*this, true); 9620b57cec5SDimitry Andric if (__sen) 9630b57cec5SDimitry Andric { 96406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 9650b57cec5SDimitry Andric try 9660b57cec5SDimitry Andric { 96706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 9680b57cec5SDimitry Andric if (__n == numeric_limits<streamsize>::max()) 9690b57cec5SDimitry Andric { 9700b57cec5SDimitry Andric while (true) 9710b57cec5SDimitry Andric { 9720b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 9730b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) 9740b57cec5SDimitry Andric { 9750b57cec5SDimitry Andric __state |= ios_base::eofbit; 9760b57cec5SDimitry Andric break; 9770b57cec5SDimitry Andric } 978*5f757f3fSDimitry Andric __inc_gcount(); 9790b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 9800b57cec5SDimitry Andric break; 9810b57cec5SDimitry Andric } 9820b57cec5SDimitry Andric } 9830b57cec5SDimitry Andric else 9840b57cec5SDimitry Andric { 9850b57cec5SDimitry Andric while (__gc_ < __n) 9860b57cec5SDimitry Andric { 9870b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 9880b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) 9890b57cec5SDimitry Andric { 9900b57cec5SDimitry Andric __state |= ios_base::eofbit; 9910b57cec5SDimitry Andric break; 9920b57cec5SDimitry Andric } 993*5f757f3fSDimitry Andric __inc_gcount(); 9940b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 9950b57cec5SDimitry Andric break; 9960b57cec5SDimitry Andric } 9970b57cec5SDimitry Andric } 99806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 9990b57cec5SDimitry Andric } 10000b57cec5SDimitry Andric catch (...) 10010b57cec5SDimitry Andric { 10020b57cec5SDimitry Andric __state |= ios_base::badbit; 10030b57cec5SDimitry Andric this->__setstate_nothrow(__state); 10040b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 10050b57cec5SDimitry Andric { 10060b57cec5SDimitry Andric throw; 10070b57cec5SDimitry Andric } 10080b57cec5SDimitry Andric } 100906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10100b57cec5SDimitry Andric this->setstate(__state); 10110b57cec5SDimitry Andric } 10120b57cec5SDimitry Andric return *this; 10130b57cec5SDimitry Andric} 10140b57cec5SDimitry Andric 10150b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 10160b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type 10170b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::peek() 10180b57cec5SDimitry Andric{ 10190b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10200b57cec5SDimitry Andric __gc_ = 0; 10210b57cec5SDimitry Andric int_type __r = traits_type::eof(); 10220b57cec5SDimitry Andric sentry __sen(*this, true); 10230b57cec5SDimitry Andric if (__sen) 10240b57cec5SDimitry Andric { 102506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 10260b57cec5SDimitry Andric try 10270b57cec5SDimitry Andric { 102806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10290b57cec5SDimitry Andric __r = this->rdbuf()->sgetc(); 10300b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 10310b57cec5SDimitry Andric __state |= ios_base::eofbit; 103206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 10330b57cec5SDimitry Andric } 10340b57cec5SDimitry Andric catch (...) 10350b57cec5SDimitry Andric { 10360b57cec5SDimitry Andric __state |= ios_base::badbit; 10370b57cec5SDimitry Andric this->__setstate_nothrow(__state); 10380b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 10390b57cec5SDimitry Andric { 10400b57cec5SDimitry Andric throw; 10410b57cec5SDimitry Andric } 10420b57cec5SDimitry Andric } 104306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10440b57cec5SDimitry Andric this->setstate(__state); 10450b57cec5SDimitry Andric } 10460b57cec5SDimitry Andric return __r; 10470b57cec5SDimitry Andric} 10480b57cec5SDimitry Andric 10490b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 10500b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 10510b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) 10520b57cec5SDimitry Andric{ 10530b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10540b57cec5SDimitry Andric __gc_ = 0; 10550b57cec5SDimitry Andric sentry __sen(*this, true); 10560b57cec5SDimitry Andric if (__sen) 10570b57cec5SDimitry Andric { 105806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 10590b57cec5SDimitry Andric try 10600b57cec5SDimitry Andric { 106106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10620b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 10630b57cec5SDimitry Andric if (__gc_ != __n) 10640b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 106506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 10660b57cec5SDimitry Andric } 10670b57cec5SDimitry Andric catch (...) 10680b57cec5SDimitry Andric { 10690b57cec5SDimitry Andric __state |= ios_base::badbit; 10700b57cec5SDimitry Andric this->__setstate_nothrow(__state); 10710b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 10720b57cec5SDimitry Andric { 10730b57cec5SDimitry Andric throw; 10740b57cec5SDimitry Andric } 10750b57cec5SDimitry Andric } 107606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10770b57cec5SDimitry Andric } 10780b57cec5SDimitry Andric else 10790b57cec5SDimitry Andric { 10800b57cec5SDimitry Andric __state |= ios_base::failbit; 10810b57cec5SDimitry Andric } 10820b57cec5SDimitry Andric this->setstate(__state); 10830b57cec5SDimitry Andric return *this; 10840b57cec5SDimitry Andric} 10850b57cec5SDimitry Andric 10860b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 10870b57cec5SDimitry Andricstreamsize 10880b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) 10890b57cec5SDimitry Andric{ 10900b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10910b57cec5SDimitry Andric __gc_ = 0; 10920b57cec5SDimitry Andric sentry __sen(*this, true); 10930b57cec5SDimitry Andric if (__sen) 10940b57cec5SDimitry Andric { 109506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 10960b57cec5SDimitry Andric try 10970b57cec5SDimitry Andric { 109806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10990b57cec5SDimitry Andric streamsize __c = this->rdbuf()->in_avail(); 11000b57cec5SDimitry Andric switch (__c) 11010b57cec5SDimitry Andric { 11020b57cec5SDimitry Andric case -1: 11030b57cec5SDimitry Andric __state |= ios_base::eofbit; 11040b57cec5SDimitry Andric break; 11050b57cec5SDimitry Andric case 0: 11060b57cec5SDimitry Andric break; 11070b57cec5SDimitry Andric default: 1108*5f757f3fSDimitry Andric __n = std::min(__c, __n); 11090b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 11100b57cec5SDimitry Andric if (__gc_ != __n) 11110b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 11120b57cec5SDimitry Andric break; 11130b57cec5SDimitry Andric } 111406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 11150b57cec5SDimitry Andric } 11160b57cec5SDimitry Andric catch (...) 11170b57cec5SDimitry Andric { 11180b57cec5SDimitry Andric __state |= ios_base::badbit; 11190b57cec5SDimitry Andric this->__setstate_nothrow(__state); 11200b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 11210b57cec5SDimitry Andric { 11220b57cec5SDimitry Andric throw; 11230b57cec5SDimitry Andric } 11240b57cec5SDimitry Andric } 112506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11260b57cec5SDimitry Andric } 11270b57cec5SDimitry Andric else 11280b57cec5SDimitry Andric { 11290b57cec5SDimitry Andric __state |= ios_base::failbit; 11300b57cec5SDimitry Andric } 11310b57cec5SDimitry Andric this->setstate(__state); 11320b57cec5SDimitry Andric return __gc_; 11330b57cec5SDimitry Andric} 11340b57cec5SDimitry Andric 11350b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 11360b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 11370b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::putback(char_type __c) 11380b57cec5SDimitry Andric{ 11390b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 11400b57cec5SDimitry Andric __gc_ = 0; 11410b57cec5SDimitry Andric this->clear(__state); 11420b57cec5SDimitry Andric sentry __sen(*this, true); 11430b57cec5SDimitry Andric if (__sen) 11440b57cec5SDimitry Andric { 114506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 11460b57cec5SDimitry Andric try 11470b57cec5SDimitry Andric { 114806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1149e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof()) 11500b57cec5SDimitry Andric __state |= ios_base::badbit; 115106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 11520b57cec5SDimitry Andric } 11530b57cec5SDimitry Andric catch (...) 11540b57cec5SDimitry Andric { 11550b57cec5SDimitry Andric __state |= ios_base::badbit; 11560b57cec5SDimitry Andric this->__setstate_nothrow(__state); 11570b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 11580b57cec5SDimitry Andric { 11590b57cec5SDimitry Andric throw; 11600b57cec5SDimitry Andric } 11610b57cec5SDimitry Andric } 116206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11630b57cec5SDimitry Andric } 11640b57cec5SDimitry Andric else 11650b57cec5SDimitry Andric { 11660b57cec5SDimitry Andric __state |= ios_base::failbit; 11670b57cec5SDimitry Andric } 11680b57cec5SDimitry Andric this->setstate(__state); 11690b57cec5SDimitry Andric return *this; 11700b57cec5SDimitry Andric} 11710b57cec5SDimitry Andric 11720b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 11730b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 11740b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::unget() 11750b57cec5SDimitry Andric{ 11760b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 11770b57cec5SDimitry Andric __gc_ = 0; 11780b57cec5SDimitry Andric this->clear(__state); 11790b57cec5SDimitry Andric sentry __sen(*this, true); 11800b57cec5SDimitry Andric if (__sen) 11810b57cec5SDimitry Andric { 118206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 11830b57cec5SDimitry Andric try 11840b57cec5SDimitry Andric { 118506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1186e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof()) 11870b57cec5SDimitry Andric __state |= ios_base::badbit; 118806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 11890b57cec5SDimitry Andric } 11900b57cec5SDimitry Andric catch (...) 11910b57cec5SDimitry Andric { 11920b57cec5SDimitry Andric __state |= ios_base::badbit; 11930b57cec5SDimitry Andric this->__setstate_nothrow(__state); 11940b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 11950b57cec5SDimitry Andric { 11960b57cec5SDimitry Andric throw; 11970b57cec5SDimitry Andric } 11980b57cec5SDimitry Andric } 119906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 12000b57cec5SDimitry Andric } 12010b57cec5SDimitry Andric else 12020b57cec5SDimitry Andric { 12030b57cec5SDimitry Andric __state |= ios_base::failbit; 12040b57cec5SDimitry Andric } 12050b57cec5SDimitry Andric this->setstate(__state); 12060b57cec5SDimitry Andric return *this; 12070b57cec5SDimitry Andric} 12080b57cec5SDimitry Andric 12090b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 12100b57cec5SDimitry Andricint 12110b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::sync() 12120b57cec5SDimitry Andric{ 12130b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12140b57cec5SDimitry Andric int __r = 0; 12150b57cec5SDimitry Andric sentry __sen(*this, true); 12160b57cec5SDimitry Andric if (__sen) 12170b57cec5SDimitry Andric { 121806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12190b57cec5SDimitry Andric try 12200b57cec5SDimitry Andric { 122106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1222e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr) 12230b57cec5SDimitry Andric return -1; 12240b57cec5SDimitry Andric if (this->rdbuf()->pubsync() == -1) 12250b57cec5SDimitry Andric { 12260b57cec5SDimitry Andric __state |= ios_base::badbit; 12270b57cec5SDimitry Andric return -1; 12280b57cec5SDimitry Andric } 122906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12300b57cec5SDimitry Andric } 12310b57cec5SDimitry Andric catch (...) 12320b57cec5SDimitry Andric { 12330b57cec5SDimitry Andric __state |= ios_base::badbit; 12340b57cec5SDimitry Andric this->__setstate_nothrow(__state); 12350b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 12360b57cec5SDimitry Andric { 12370b57cec5SDimitry Andric throw; 12380b57cec5SDimitry Andric } 12390b57cec5SDimitry Andric } 124006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 12410b57cec5SDimitry Andric this->setstate(__state); 12420b57cec5SDimitry Andric } 12430b57cec5SDimitry Andric return __r; 12440b57cec5SDimitry Andric} 12450b57cec5SDimitry Andric 12460b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 12470b57cec5SDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type 12480b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::tellg() 12490b57cec5SDimitry Andric{ 12500b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12510b57cec5SDimitry Andric pos_type __r(-1); 12520b57cec5SDimitry Andric sentry __sen(*this, true); 12530b57cec5SDimitry Andric if (__sen) 12540b57cec5SDimitry Andric { 125506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12560b57cec5SDimitry Andric try 12570b57cec5SDimitry Andric { 125806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 12590b57cec5SDimitry Andric __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); 126006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12610b57cec5SDimitry Andric } 12620b57cec5SDimitry Andric catch (...) 12630b57cec5SDimitry Andric { 12640b57cec5SDimitry Andric __state |= ios_base::badbit; 12650b57cec5SDimitry Andric this->__setstate_nothrow(__state); 12660b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 12670b57cec5SDimitry Andric { 12680b57cec5SDimitry Andric throw; 12690b57cec5SDimitry Andric } 12700b57cec5SDimitry Andric } 127106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 12720b57cec5SDimitry Andric this->setstate(__state); 12730b57cec5SDimitry Andric } 12740b57cec5SDimitry Andric return __r; 12750b57cec5SDimitry Andric} 12760b57cec5SDimitry Andric 12770b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 12780b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 12790b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::seekg(pos_type __pos) 12800b57cec5SDimitry Andric{ 12810b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 12820b57cec5SDimitry Andric this->clear(__state); 12830b57cec5SDimitry Andric sentry __sen(*this, true); 12840b57cec5SDimitry Andric if (__sen) 12850b57cec5SDimitry Andric { 128606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12870b57cec5SDimitry Andric try 12880b57cec5SDimitry Andric { 128906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 12900b57cec5SDimitry Andric if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1)) 12910b57cec5SDimitry Andric __state |= ios_base::failbit; 129206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 12930b57cec5SDimitry Andric } 12940b57cec5SDimitry Andric catch (...) 12950b57cec5SDimitry Andric { 12960b57cec5SDimitry Andric __state |= ios_base::badbit; 12970b57cec5SDimitry Andric this->__setstate_nothrow(__state); 12980b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 12990b57cec5SDimitry Andric { 13000b57cec5SDimitry Andric throw; 13010b57cec5SDimitry Andric } 13020b57cec5SDimitry Andric } 130306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 13040b57cec5SDimitry Andric this->setstate(__state); 13050b57cec5SDimitry Andric } 13060b57cec5SDimitry Andric return *this; 13070b57cec5SDimitry Andric} 13080b57cec5SDimitry Andric 13090b57cec5SDimitry Andrictemplate<class _CharT, class _Traits> 13100b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 13110b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) 13120b57cec5SDimitry Andric{ 13130b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 13140b57cec5SDimitry Andric this->clear(__state); 13150b57cec5SDimitry Andric sentry __sen(*this, true); 13160b57cec5SDimitry Andric if (__sen) 13170b57cec5SDimitry Andric { 131806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 13190b57cec5SDimitry Andric try 13200b57cec5SDimitry Andric { 132106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 13220b57cec5SDimitry Andric if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1)) 13230b57cec5SDimitry Andric __state |= ios_base::failbit; 132406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 13250b57cec5SDimitry Andric } 13260b57cec5SDimitry Andric catch (...) 13270b57cec5SDimitry Andric { 13280b57cec5SDimitry Andric __state |= ios_base::badbit; 13290b57cec5SDimitry Andric this->__setstate_nothrow(__state); 13300b57cec5SDimitry Andric if (this->exceptions() & ios_base::badbit) 13310b57cec5SDimitry Andric { 13320b57cec5SDimitry Andric throw; 13330b57cec5SDimitry Andric } 13340b57cec5SDimitry Andric } 133506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 13360b57cec5SDimitry Andric this->setstate(__state); 13370b57cec5SDimitry Andric } 13380b57cec5SDimitry Andric return *this; 13390b57cec5SDimitry Andric} 13400b57cec5SDimitry Andric 13410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1342bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 13430b57cec5SDimitry Andricws(basic_istream<_CharT, _Traits>& __is) 13440b57cec5SDimitry Andric{ 13450b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 13460b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 13470b57cec5SDimitry Andric if (__sen) 13480b57cec5SDimitry Andric { 134906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 13500b57cec5SDimitry Andric try 13510b57cec5SDimitry Andric { 135206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1353bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 13540b57cec5SDimitry Andric while (true) 13550b57cec5SDimitry Andric { 13560b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 13570b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 13580b57cec5SDimitry Andric { 13590b57cec5SDimitry Andric __state |= ios_base::eofbit; 13600b57cec5SDimitry Andric break; 13610b57cec5SDimitry Andric } 13620b57cec5SDimitry Andric if (!__ct.is(__ct.space, _Traits::to_char_type(__i))) 13630b57cec5SDimitry Andric break; 13640b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 13650b57cec5SDimitry Andric } 136606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 13670b57cec5SDimitry Andric } 13680b57cec5SDimitry Andric catch (...) 13690b57cec5SDimitry Andric { 13700b57cec5SDimitry Andric __state |= ios_base::badbit; 13710b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 13720b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 13730b57cec5SDimitry Andric { 13740b57cec5SDimitry Andric throw; 13750b57cec5SDimitry Andric } 13760b57cec5SDimitry Andric } 137706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 13780b57cec5SDimitry Andric __is.setstate(__state); 13790b57cec5SDimitry Andric } 13800b57cec5SDimitry Andric return __is; 13810b57cec5SDimitry Andric} 13820b57cec5SDimitry Andric 1383e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void> 1384e8d8bef9SDimitry Andricstruct __is_istreamable : false_type { }; 1385e8d8bef9SDimitry Andric 1386e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp> 1387e8d8bef9SDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype( 1388bdd1243dSDimitry Andric std::declval<_Stream>() >> std::declval<_Tp>(), void() 1389e8d8bef9SDimitry Andric)> : true_type { }; 1390e8d8bef9SDimitry Andric 1391*5f757f3fSDimitry Andrictemplate <class _Stream, class _Tp, __enable_if_t< 1392*5f757f3fSDimitry Andric _And<is_base_of<ios_base, _Stream>, __is_istreamable<_Stream&, _Tp&&> >::value, int> = 0> 1393*5f757f3fSDimitry Andric_LIBCPP_HIDE_FROM_ABI 1394e8d8bef9SDimitry Andric_Stream&& operator>>(_Stream&& __is, _Tp&& __x) 13950b57cec5SDimitry Andric{ 1396*5f757f3fSDimitry Andric __is >> std::forward<_Tp>(__x); 1397*5f757f3fSDimitry Andric return std::move(__is); 13980b57cec5SDimitry Andric} 13990b57cec5SDimitry Andric 14000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 14010b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream 14020b57cec5SDimitry Andric : public basic_istream<_CharT, _Traits>, 14030b57cec5SDimitry Andric public basic_ostream<_CharT, _Traits> 14040b57cec5SDimitry Andric{ 14050b57cec5SDimitry Andricpublic: 14060b57cec5SDimitry Andric // types: 14070b57cec5SDimitry Andric typedef _CharT char_type; 14080b57cec5SDimitry Andric typedef _Traits traits_type; 14090b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 14100b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 14110b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 14120b57cec5SDimitry Andric 14130b57cec5SDimitry Andric // constructor/destructor 14140b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 14150b57cec5SDimitry Andric explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb) 14160b57cec5SDimitry Andric : basic_istream<_CharT, _Traits>(__sb) 14170b57cec5SDimitry Andric {} 14180b57cec5SDimitry Andric 1419bdd1243dSDimitry Andric ~basic_iostream() override; 14200b57cec5SDimitry Andricprotected: 1421*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 14220b57cec5SDimitry Andric basic_iostream(basic_iostream&& __rhs); 14230b57cec5SDimitry Andric 14240b57cec5SDimitry Andric // assign/swap 1425*5f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI 14260b57cec5SDimitry Andric basic_iostream& operator=(basic_iostream&& __rhs); 1427fe6060f1SDimitry Andric 14280b57cec5SDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 14290b57cec5SDimitry Andric void swap(basic_iostream& __rhs) 14300b57cec5SDimitry Andric { basic_istream<char_type, traits_type>::swap(__rhs); } 14310b57cec5SDimitry Andric}; 14320b57cec5SDimitry Andric 14330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 14340b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs) 1435*5f757f3fSDimitry Andric : basic_istream<_CharT, _Traits>(std::move(__rhs)) 14360b57cec5SDimitry Andric{ 14370b57cec5SDimitry Andric} 14380b57cec5SDimitry Andric 14390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 14400b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>& 14410b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) 14420b57cec5SDimitry Andric{ 14430b57cec5SDimitry Andric swap(__rhs); 14440b57cec5SDimitry Andric return *this; 14450b57cec5SDimitry Andric} 14460b57cec5SDimitry Andric 14470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 14480b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream() 14490b57cec5SDimitry Andric{ 14500b57cec5SDimitry Andric} 14510b57cec5SDimitry Andric 14520b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 1453bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 14540b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, 14550b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str) 14560b57cec5SDimitry Andric{ 14570b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 14580b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 14590b57cec5SDimitry Andric if (__sen) 14600b57cec5SDimitry Andric { 146106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 14620b57cec5SDimitry Andric try 14630b57cec5SDimitry Andric { 14640b57cec5SDimitry Andric#endif 14650b57cec5SDimitry Andric __str.clear(); 14660b57cec5SDimitry Andric streamsize __n = __is.width(); 14670b57cec5SDimitry Andric if (__n <= 0) 14680b57cec5SDimitry Andric __n = __str.max_size(); 14690b57cec5SDimitry Andric if (__n <= 0) 14700b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max(); 14710b57cec5SDimitry Andric streamsize __c = 0; 1472bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 14730b57cec5SDimitry Andric while (__c < __n) 14740b57cec5SDimitry Andric { 14750b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 14760b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 14770b57cec5SDimitry Andric { 14780b57cec5SDimitry Andric __state |= ios_base::eofbit; 14790b57cec5SDimitry Andric break; 14800b57cec5SDimitry Andric } 14810b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 14820b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 14830b57cec5SDimitry Andric break; 14840b57cec5SDimitry Andric __str.push_back(__ch); 14850b57cec5SDimitry Andric ++__c; 14860b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 14870b57cec5SDimitry Andric } 14880b57cec5SDimitry Andric __is.width(0); 14890b57cec5SDimitry Andric if (__c == 0) 14900b57cec5SDimitry Andric __state |= ios_base::failbit; 149106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 14920b57cec5SDimitry Andric } 14930b57cec5SDimitry Andric catch (...) 14940b57cec5SDimitry Andric { 14950b57cec5SDimitry Andric __state |= ios_base::badbit; 14960b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 14970b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 14980b57cec5SDimitry Andric { 14990b57cec5SDimitry Andric throw; 15000b57cec5SDimitry Andric } 15010b57cec5SDimitry Andric } 15020b57cec5SDimitry Andric#endif 15030b57cec5SDimitry Andric __is.setstate(__state); 15040b57cec5SDimitry Andric } 15050b57cec5SDimitry Andric return __is; 15060b57cec5SDimitry Andric} 15070b57cec5SDimitry Andric 15080b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 1509bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 15100b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, 15110b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) 15120b57cec5SDimitry Andric{ 15130b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 15140b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 15150b57cec5SDimitry Andric if (__sen) 15160b57cec5SDimitry Andric { 151706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 15180b57cec5SDimitry Andric try 15190b57cec5SDimitry Andric { 15200b57cec5SDimitry Andric#endif 15210b57cec5SDimitry Andric __str.clear(); 15220b57cec5SDimitry Andric streamsize __extr = 0; 15230b57cec5SDimitry Andric while (true) 15240b57cec5SDimitry Andric { 15250b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 15260b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 15270b57cec5SDimitry Andric { 15280b57cec5SDimitry Andric __state |= ios_base::eofbit; 15290b57cec5SDimitry Andric break; 15300b57cec5SDimitry Andric } 15310b57cec5SDimitry Andric ++__extr; 15320b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 15330b57cec5SDimitry Andric if (_Traits::eq(__ch, __dlm)) 15340b57cec5SDimitry Andric break; 15350b57cec5SDimitry Andric __str.push_back(__ch); 15360b57cec5SDimitry Andric if (__str.size() == __str.max_size()) 15370b57cec5SDimitry Andric { 15380b57cec5SDimitry Andric __state |= ios_base::failbit; 15390b57cec5SDimitry Andric break; 15400b57cec5SDimitry Andric } 15410b57cec5SDimitry Andric } 15420b57cec5SDimitry Andric if (__extr == 0) 15430b57cec5SDimitry Andric __state |= ios_base::failbit; 154406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 15450b57cec5SDimitry Andric } 15460b57cec5SDimitry Andric catch (...) 15470b57cec5SDimitry Andric { 15480b57cec5SDimitry Andric __state |= ios_base::badbit; 15490b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 15500b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 15510b57cec5SDimitry Andric { 15520b57cec5SDimitry Andric throw; 15530b57cec5SDimitry Andric } 15540b57cec5SDimitry Andric } 15550b57cec5SDimitry Andric#endif 15560b57cec5SDimitry Andric __is.setstate(__state); 15570b57cec5SDimitry Andric } 15580b57cec5SDimitry Andric return __is; 15590b57cec5SDimitry Andric} 15600b57cec5SDimitry Andric 15610b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 1562*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 15630b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 15640b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, 15650b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str) 15660b57cec5SDimitry Andric{ 1567bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 15680b57cec5SDimitry Andric} 15690b57cec5SDimitry Andric 15700b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 1571*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 15720b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 15730b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, 15740b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) 15750b57cec5SDimitry Andric{ 1576bdd1243dSDimitry Andric return std::getline(__is, __str, __dlm); 15770b57cec5SDimitry Andric} 15780b57cec5SDimitry Andric 15790b57cec5SDimitry Andrictemplate<class _CharT, class _Traits, class _Allocator> 1580*5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI 15810b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 15820b57cec5SDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, 15830b57cec5SDimitry Andric basic_string<_CharT, _Traits, _Allocator>& __str) 15840b57cec5SDimitry Andric{ 1585bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 15860b57cec5SDimitry Andric} 15870b57cec5SDimitry Andric 15880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size> 1589bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 15900b57cec5SDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) 15910b57cec5SDimitry Andric{ 15920b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 15930b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 15940b57cec5SDimitry Andric if (__sen) 15950b57cec5SDimitry Andric { 159606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 15970b57cec5SDimitry Andric try 15980b57cec5SDimitry Andric { 15990b57cec5SDimitry Andric#endif 16000b57cec5SDimitry Andric basic_string<_CharT, _Traits> __str; 1601bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 16020b57cec5SDimitry Andric size_t __c = 0; 16030b57cec5SDimitry Andric _CharT __zero = __ct.widen('0'); 16040b57cec5SDimitry Andric _CharT __one = __ct.widen('1'); 160581ad6265SDimitry Andric while (__c != _Size) 16060b57cec5SDimitry Andric { 16070b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 16080b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 16090b57cec5SDimitry Andric { 16100b57cec5SDimitry Andric __state |= ios_base::eofbit; 16110b57cec5SDimitry Andric break; 16120b57cec5SDimitry Andric } 16130b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 16140b57cec5SDimitry Andric if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one)) 16150b57cec5SDimitry Andric break; 16160b57cec5SDimitry Andric __str.push_back(__ch); 16170b57cec5SDimitry Andric ++__c; 16180b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 16190b57cec5SDimitry Andric } 16200b57cec5SDimitry Andric __x = bitset<_Size>(__str); 1621e40139ffSDimitry Andric if (_Size > 0 && __c == 0) 16220b57cec5SDimitry Andric __state |= ios_base::failbit; 162306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 16240b57cec5SDimitry Andric } 16250b57cec5SDimitry Andric catch (...) 16260b57cec5SDimitry Andric { 16270b57cec5SDimitry Andric __state |= ios_base::badbit; 16280b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 16290b57cec5SDimitry Andric if (__is.exceptions() & ios_base::badbit) 16300b57cec5SDimitry Andric { 16310b57cec5SDimitry Andric throw; 16320b57cec5SDimitry Andric } 16330b57cec5SDimitry Andric } 16340b57cec5SDimitry Andric#endif 16350b57cec5SDimitry Andric __is.setstate(__state); 16360b57cec5SDimitry Andric } 16370b57cec5SDimitry Andric return __is; 16380b57cec5SDimitry Andric} 16390b57cec5SDimitry Andric 164081ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>; 1641349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 164281ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>; 1643349cc55cSDimitry Andric#endif 164481ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>; 16450b57cec5SDimitry Andric 16460b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 16470b57cec5SDimitry Andric 1648bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 1649bdd1243dSDimitry Andric# include <concepts> 1650*5f757f3fSDimitry Andric# include <iosfwd> 1651bdd1243dSDimitry Andric# include <type_traits> 1652bdd1243dSDimitry Andric#endif 1653bdd1243dSDimitry Andric 16540b57cec5SDimitry Andric_LIBCPP_POP_MACROS 16550b57cec5SDimitry Andric 16560b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM 1657