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_LIBCPP_BEGIN_NAMESPACE_STD 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 183*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios<_CharT, _Traits> { 1840b57cec5SDimitry Andric streamsize __gc_; 1855f757f3fSDimitry Andric 1865f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI void __inc_gcount() { 1875f757f3fSDimitry Andric if (__gc_ < numeric_limits<streamsize>::max()) 1885f757f3fSDimitry Andric ++__gc_; 1895f757f3fSDimitry Andric } 190*cb14a3feSDimitry Andric 1910b57cec5SDimitry Andricpublic: 1920b57cec5SDimitry Andric // types (inherited from basic_ios (27.5.4)): 1930b57cec5SDimitry Andric typedef _CharT char_type; 1940b57cec5SDimitry Andric typedef _Traits traits_type; 1950b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 1960b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 1970b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric // 27.7.1.1.1 Constructor/destructor: 200*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) 201*cb14a3feSDimitry Andric : __gc_(0) { 202*cb14a3feSDimitry Andric this->init(__sb); 203*cb14a3feSDimitry Andric } 204bdd1243dSDimitry Andric ~basic_istream() override; 205*cb14a3feSDimitry Andric 2060b57cec5SDimitry Andricprotected: 207*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_istream(basic_istream&& __rhs); 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric // 27.7.1.1.2 Assign/swap: 210*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_istream& operator=(basic_istream&& __rhs); 2110b57cec5SDimitry Andric 212*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_istream& __rhs) { 2135f757f3fSDimitry Andric std::swap(__gc_, __rhs.__gc_); 2140b57cec5SDimitry Andric basic_ios<char_type, traits_type>::swap(__rhs); 2150b57cec5SDimitry Andric } 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric basic_istream(const basic_istream& __rhs) = delete; 2180b57cec5SDimitry Andric basic_istream& operator=(const basic_istream& __rhs) = delete; 2190b57cec5SDimitry Andric 220*cb14a3feSDimitry Andricpublic: 2210b57cec5SDimitry Andric // 27.7.1.1.3 Prefix/suffix: 2220b57cec5SDimitry Andric class _LIBCPP_TEMPLATE_VIS sentry; 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric // 27.7.1.2 Formatted input: 225*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) { 226*cb14a3feSDimitry Andric return __pf(*this); 227*cb14a3feSDimitry Andric } 2280b57cec5SDimitry Andric 229*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& 230*cb14a3feSDimitry Andric operator>>(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) { 231*cb14a3feSDimitry Andric __pf(*this); 232*cb14a3feSDimitry Andric return *this; 233*cb14a3feSDimitry Andric } 2340b57cec5SDimitry Andric 235*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) { 236*cb14a3feSDimitry Andric __pf(*this); 237*cb14a3feSDimitry Andric return *this; 238*cb14a3feSDimitry Andric } 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andric basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb); 2410b57cec5SDimitry Andric basic_istream& operator>>(bool& __n); 2420b57cec5SDimitry Andric basic_istream& operator>>(short& __n); 2430b57cec5SDimitry Andric basic_istream& operator>>(unsigned short& __n); 2440b57cec5SDimitry Andric basic_istream& operator>>(int& __n); 2450b57cec5SDimitry Andric basic_istream& operator>>(unsigned int& __n); 2460b57cec5SDimitry Andric basic_istream& operator>>(long& __n); 2470b57cec5SDimitry Andric basic_istream& operator>>(unsigned long& __n); 2480b57cec5SDimitry Andric basic_istream& operator>>(long long& __n); 2490b57cec5SDimitry Andric basic_istream& operator>>(unsigned long long& __n); 2500b57cec5SDimitry Andric basic_istream& operator>>(float& __f); 2510b57cec5SDimitry Andric basic_istream& operator>>(double& __f); 2520b57cec5SDimitry Andric basic_istream& operator>>(long double& __f); 2530b57cec5SDimitry Andric basic_istream& operator>>(void*& __p); 2540b57cec5SDimitry Andric 2550b57cec5SDimitry Andric // 27.7.1.3 Unformatted input: 256*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI streamsize gcount() const { return __gc_; } 2570b57cec5SDimitry Andric int_type get(); 2580b57cec5SDimitry Andric 259*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type& __c) { 2600b57cec5SDimitry Andric int_type __ch = get(); 2610b57cec5SDimitry Andric if (__ch != traits_type::eof()) 2620b57cec5SDimitry Andric __c = traits_type::to_char_type(__ch); 2630b57cec5SDimitry Andric return *this; 2640b57cec5SDimitry Andric } 2650b57cec5SDimitry Andric 266*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type* __s, streamsize __n) { 267*cb14a3feSDimitry Andric return get(__s, __n, this->widen('\n')); 268*cb14a3feSDimitry Andric } 2690b57cec5SDimitry Andric 2700b57cec5SDimitry Andric basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); 2710b57cec5SDimitry Andric 272*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) { 273*cb14a3feSDimitry Andric return get(__sb, this->widen('\n')); 274*cb14a3feSDimitry Andric } 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); 2770b57cec5SDimitry Andric 278*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& getline(char_type* __s, streamsize __n) { 279*cb14a3feSDimitry Andric return getline(__s, __n, this->widen('\n')); 280*cb14a3feSDimitry Andric } 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm); 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof()); 2850b57cec5SDimitry Andric int_type peek(); 2860b57cec5SDimitry Andric basic_istream& read(char_type* __s, streamsize __n); 2870b57cec5SDimitry Andric streamsize readsome(char_type* __s, streamsize __n); 2880b57cec5SDimitry Andric 2890b57cec5SDimitry Andric basic_istream& putback(char_type __c); 2900b57cec5SDimitry Andric basic_istream& unget(); 2910b57cec5SDimitry Andric int sync(); 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andric pos_type tellg(); 2940b57cec5SDimitry Andric basic_istream& seekg(pos_type __pos); 2950b57cec5SDimitry Andric basic_istream& seekg(off_type __off, ios_base::seekdir __dir); 2960b57cec5SDimitry Andric}; 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 299*cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry { 3000b57cec5SDimitry Andric bool __ok_; 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andricpublic: 3030b57cec5SDimitry Andric explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); 3040b57cec5SDimitry Andric // ~sentry() = default; 3050b57cec5SDimitry Andric 306*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; } 3070eae32dcSDimitry Andric 3080eae32dcSDimitry Andric sentry(const sentry&) = delete; 3090eae32dcSDimitry Andric sentry& operator=(const sentry&) = delete; 3100b57cec5SDimitry Andric}; 3110b57cec5SDimitry Andric 3120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 313*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws) : __ok_(false) { 314*cb14a3feSDimitry Andric if (__is.good()) { 3150b57cec5SDimitry Andric if (__is.tie()) 3160b57cec5SDimitry Andric __is.tie()->flush(); 317*cb14a3feSDimitry Andric if (!__noskipws && (__is.flags() & ios_base::skipws)) { 3180b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 319bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 3200b57cec5SDimitry Andric _Ip __i(__is); 3210b57cec5SDimitry Andric _Ip __eof; 3220b57cec5SDimitry Andric for (; __i != __eof; ++__i) 3230b57cec5SDimitry Andric if (!__ct.is(__ct.space, *__i)) 3240b57cec5SDimitry Andric break; 3250b57cec5SDimitry Andric if (__i == __eof) 3260b57cec5SDimitry Andric __is.setstate(ios_base::failbit | ios_base::eofbit); 3270b57cec5SDimitry Andric } 3280b57cec5SDimitry Andric __ok_ = __is.good(); 329*cb14a3feSDimitry Andric } else 3300b57cec5SDimitry Andric __is.setstate(ios_base::failbit); 3310b57cec5SDimitry Andric} 3320b57cec5SDimitry Andric 3330b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 334*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) : __gc_(__rhs.__gc_) { 3350b57cec5SDimitry Andric __rhs.__gc_ = 0; 3360b57cec5SDimitry Andric this->move(__rhs); 3370b57cec5SDimitry Andric} 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 340*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) { 3410b57cec5SDimitry Andric swap(__rhs); 3420b57cec5SDimitry Andric return *this; 3430b57cec5SDimitry Andric} 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 346*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream() {} 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 349*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 3500b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 3510b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 3520b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 353*cb14a3feSDimitry Andric if (__s) { 35406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 355*cb14a3feSDimitry Andric try { 35606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3570b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3580b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 359bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n); 36006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 361*cb14a3feSDimitry Andric } catch (...) { 3620b57cec5SDimitry Andric __state |= ios_base::badbit; 3630b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 364*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 3650b57cec5SDimitry Andric throw; 3660b57cec5SDimitry Andric } 3670b57cec5SDimitry Andric } 3680b57cec5SDimitry Andric#endif 3690b57cec5SDimitry Andric __is.setstate(__state); 3700b57cec5SDimitry Andric } 3710b57cec5SDimitry Andric return __is; 3720b57cec5SDimitry Andric} 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 375*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) { 3765f757f3fSDimitry Andric return std::__input_arithmetic<unsigned short>(*this, __n); 3770b57cec5SDimitry Andric} 3780b57cec5SDimitry Andric 3790b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 380*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) { 3815f757f3fSDimitry Andric return std::__input_arithmetic<unsigned int>(*this, __n); 3820b57cec5SDimitry Andric} 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 385*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long& __n) { 3865f757f3fSDimitry Andric return std::__input_arithmetic<long>(*this, __n); 3870b57cec5SDimitry Andric} 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 390*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) { 3915f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long>(*this, __n); 3920b57cec5SDimitry Andric} 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 395*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long long& __n) { 3965f757f3fSDimitry Andric return std::__input_arithmetic<long long>(*this, __n); 3970b57cec5SDimitry Andric} 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 400*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) { 4015f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long long>(*this, __n); 4020b57cec5SDimitry Andric} 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 405*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(float& __n) { 4065f757f3fSDimitry Andric return std::__input_arithmetic<float>(*this, __n); 4070b57cec5SDimitry Andric} 4080b57cec5SDimitry Andric 4090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 410*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(double& __n) { 4115f757f3fSDimitry Andric return std::__input_arithmetic<double>(*this, __n); 4120b57cec5SDimitry Andric} 4130b57cec5SDimitry Andric 4140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 415*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long double& __n) { 4165f757f3fSDimitry Andric return std::__input_arithmetic<long double>(*this, __n); 4170b57cec5SDimitry Andric} 4180b57cec5SDimitry Andric 4190b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 420*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(bool& __n) { 4215f757f3fSDimitry Andric return std::__input_arithmetic<bool>(*this, __n); 4220b57cec5SDimitry Andric} 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 425*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(void*& __n) { 4265f757f3fSDimitry Andric return std::__input_arithmetic<void*>(*this, __n); 4270b57cec5SDimitry Andric} 4280b57cec5SDimitry Andric 4290b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 430*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 4310b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 4320b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 4330b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 434*cb14a3feSDimitry Andric if (__s) { 43506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 436*cb14a3feSDimitry Andric try { 43706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 4380b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 4390b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 4400b57cec5SDimitry Andric long __temp; 441bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp); 442*cb14a3feSDimitry Andric if (__temp < numeric_limits<_Tp>::min()) { 4430b57cec5SDimitry Andric __state |= ios_base::failbit; 4440b57cec5SDimitry Andric __n = numeric_limits<_Tp>::min(); 445*cb14a3feSDimitry Andric } else if (__temp > numeric_limits<_Tp>::max()) { 4460b57cec5SDimitry Andric __state |= ios_base::failbit; 4470b57cec5SDimitry Andric __n = numeric_limits<_Tp>::max(); 448*cb14a3feSDimitry Andric } else { 4490b57cec5SDimitry Andric __n = static_cast<_Tp>(__temp); 4500b57cec5SDimitry Andric } 45106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 452*cb14a3feSDimitry Andric } catch (...) { 4530b57cec5SDimitry Andric __state |= ios_base::badbit; 4540b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 455*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 4560b57cec5SDimitry Andric throw; 4570b57cec5SDimitry Andric } 4580b57cec5SDimitry Andric } 45906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 4600b57cec5SDimitry Andric __is.setstate(__state); 4610b57cec5SDimitry Andric } 4620b57cec5SDimitry Andric return __is; 4630b57cec5SDimitry Andric} 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 466*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(short& __n) { 4675f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<short>(*this, __n); 4680b57cec5SDimitry Andric} 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 471*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(int& __n) { 4725f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<int>(*this, __n); 4730b57cec5SDimitry Andric} 4740b57cec5SDimitry Andric 4750b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 476*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 477*cb14a3feSDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) { 4780b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 4790b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 480*cb14a3feSDimitry Andric if (__sen) { 48106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 482*cb14a3feSDimitry Andric try { 4830b57cec5SDimitry Andric#endif 4840b57cec5SDimitry Andric _CharT* __s = __p; 485bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 486*cb14a3feSDimitry Andric while (__s != __p + (__n - 1)) { 4870b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 488*cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 4890b57cec5SDimitry Andric __state |= ios_base::eofbit; 4900b57cec5SDimitry Andric break; 4910b57cec5SDimitry Andric } 4920b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 4930b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 4940b57cec5SDimitry Andric break; 4950b57cec5SDimitry Andric *__s++ = __ch; 4960b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 4970b57cec5SDimitry Andric } 4980b57cec5SDimitry Andric *__s = _CharT(); 4990b57cec5SDimitry Andric __is.width(0); 5000b57cec5SDimitry Andric if (__s == __p) 5010b57cec5SDimitry Andric __state |= ios_base::failbit; 50206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 503*cb14a3feSDimitry Andric } catch (...) { 5040b57cec5SDimitry Andric __state |= ios_base::badbit; 5050b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 506*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 5070b57cec5SDimitry Andric throw; 5080b57cec5SDimitry Andric } 5090b57cec5SDimitry Andric } 5100b57cec5SDimitry Andric#endif 5110b57cec5SDimitry Andric __is.setstate(__state); 5120b57cec5SDimitry Andric } 5130b57cec5SDimitry Andric return __is; 5140b57cec5SDimitry Andric} 5150b57cec5SDimitry Andric 51606c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20 5170b57cec5SDimitry Andric 5180b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Np> 519*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 520*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) { 5210b57cec5SDimitry Andric size_t __n = _Np; 5220b57cec5SDimitry Andric if (__is.width() > 0) 5235f757f3fSDimitry Andric __n = std::min(size_t(__is.width()), _Np); 5245f757f3fSDimitry Andric return std::__input_c_string(__is, __buf, __n); 5250b57cec5SDimitry Andric} 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np> 528*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 529*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) { 5300b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 5310b57cec5SDimitry Andric} 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np> 534*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 535*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) { 5360b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 5370b57cec5SDimitry Andric} 5380b57cec5SDimitry Andric 5390b57cec5SDimitry Andric#else 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 542*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 543*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) { 5440b57cec5SDimitry Andric streamsize __n = __is.width(); 5450b57cec5SDimitry Andric if (__n <= 0) 5460b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1; 5475f757f3fSDimitry Andric return std::__input_c_string(__is, __s, size_t(__n)); 5480b57cec5SDimitry Andric} 5490b57cec5SDimitry Andric 5500b57cec5SDimitry Andrictemplate <class _Traits> 551*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 552*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) { 5530b57cec5SDimitry Andric return __is >> (char*)__s; 5540b57cec5SDimitry Andric} 5550b57cec5SDimitry Andric 5560b57cec5SDimitry Andrictemplate <class _Traits> 557*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 558*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) { 5590b57cec5SDimitry Andric return __is >> (char*)__s; 5600b57cec5SDimitry Andric} 5610b57cec5SDimitry Andric 56206c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20 5630b57cec5SDimitry Andric 5640b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 565*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) { 5660b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 5670b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 568*cb14a3feSDimitry Andric if (__sen) { 56906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 570*cb14a3feSDimitry Andric try { 5710b57cec5SDimitry Andric#endif 5720b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 5730b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 5740b57cec5SDimitry Andric __state |= ios_base::eofbit | ios_base::failbit; 5750b57cec5SDimitry Andric else 5760b57cec5SDimitry Andric __c = _Traits::to_char_type(__i); 57706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 578*cb14a3feSDimitry Andric } catch (...) { 5790b57cec5SDimitry Andric __state |= ios_base::badbit; 5800b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 581*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 5820b57cec5SDimitry Andric throw; 5830b57cec5SDimitry Andric } 5840b57cec5SDimitry Andric } 5850b57cec5SDimitry Andric#endif 5860b57cec5SDimitry Andric __is.setstate(__state); 5870b57cec5SDimitry Andric } 5880b57cec5SDimitry Andric return __is; 5890b57cec5SDimitry Andric} 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andrictemplate <class _Traits> 592*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 593*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) { 5940b57cec5SDimitry Andric return __is >> (char&)__c; 5950b57cec5SDimitry Andric} 5960b57cec5SDimitry Andric 5970b57cec5SDimitry Andrictemplate <class _Traits> 598*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 599*cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) { 6000b57cec5SDimitry Andric return __is >> (char&)__c; 6010b57cec5SDimitry Andric} 6020b57cec5SDimitry Andric 6030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 6040b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 605*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) { 6060b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6070b57cec5SDimitry Andric __gc_ = 0; 6080b57cec5SDimitry Andric sentry __s(*this, true); 609*cb14a3feSDimitry Andric if (__s) { 610*cb14a3feSDimitry Andric if (__sb) { 61106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 612*cb14a3feSDimitry Andric try { 61306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 614*cb14a3feSDimitry Andric while (true) { 6150b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 616*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, _Traits::eof())) { 6170b57cec5SDimitry Andric __state |= ios_base::eofbit; 6180b57cec5SDimitry Andric break; 6190b57cec5SDimitry Andric } 620*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__sb->sputc(traits_type::to_char_type(__i)), traits_type::eof())) 6210b57cec5SDimitry Andric break; 6225f757f3fSDimitry Andric __inc_gcount(); 6230b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 6240b57cec5SDimitry Andric } 6250b57cec5SDimitry Andric if (__gc_ == 0) 6260b57cec5SDimitry Andric __state |= ios_base::failbit; 62706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 628*cb14a3feSDimitry Andric } catch (...) { 6290b57cec5SDimitry Andric __state |= ios_base::badbit; 6300b57cec5SDimitry Andric if (__gc_ == 0) 6310b57cec5SDimitry Andric __state |= ios_base::failbit; 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric this->__setstate_nothrow(__state); 634*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) { 6350b57cec5SDimitry Andric throw; 6360b57cec5SDimitry Andric } 6370b57cec5SDimitry Andric } 63806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 639*cb14a3feSDimitry Andric } else { 6400b57cec5SDimitry Andric __state |= ios_base::failbit; 6410b57cec5SDimitry Andric } 6420b57cec5SDimitry Andric this->setstate(__state); 6430b57cec5SDimitry Andric } 6440b57cec5SDimitry Andric return *this; 6450b57cec5SDimitry Andric} 6460b57cec5SDimitry Andric 6470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 648*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::get() { 6490b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6500b57cec5SDimitry Andric __gc_ = 0; 6510b57cec5SDimitry Andric int_type __r = traits_type::eof(); 6520b57cec5SDimitry Andric sentry __s(*this, true); 653*cb14a3feSDimitry Andric if (__s) { 65406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 655*cb14a3feSDimitry Andric try { 6560b57cec5SDimitry Andric#endif 6570b57cec5SDimitry Andric __r = this->rdbuf()->sbumpc(); 6580b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 6590b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 6600b57cec5SDimitry Andric else 6610b57cec5SDimitry Andric __gc_ = 1; 66206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 663*cb14a3feSDimitry Andric } catch (...) { 6640b57cec5SDimitry Andric this->__setstate_nothrow(this->rdstate() | ios_base::badbit); 665*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 6660b57cec5SDimitry Andric throw; 6670b57cec5SDimitry Andric } 6680b57cec5SDimitry Andric } 6690b57cec5SDimitry Andric#endif 6700b57cec5SDimitry Andric this->setstate(__state); 6710b57cec5SDimitry Andric } 6720b57cec5SDimitry Andric return __r; 6730b57cec5SDimitry Andric} 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 676*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) { 6770b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6780b57cec5SDimitry Andric __gc_ = 0; 6790b57cec5SDimitry Andric sentry __sen(*this, true); 680*cb14a3feSDimitry Andric if (__sen) { 681*cb14a3feSDimitry Andric if (__n > 0) { 68206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 683*cb14a3feSDimitry Andric try { 6840b57cec5SDimitry Andric#endif 685*cb14a3feSDimitry Andric while (__gc_ < __n - 1) { 6860b57cec5SDimitry Andric int_type __i = this->rdbuf()->sgetc(); 687*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 6880b57cec5SDimitry Andric __state |= ios_base::eofbit; 6890b57cec5SDimitry Andric break; 6900b57cec5SDimitry Andric } 6910b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 6920b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 6930b57cec5SDimitry Andric break; 6940b57cec5SDimitry Andric *__s++ = __ch; 6955f757f3fSDimitry Andric __inc_gcount(); 6960b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 6970b57cec5SDimitry Andric } 6980b57cec5SDimitry Andric if (__gc_ == 0) 6990b57cec5SDimitry Andric __state |= ios_base::failbit; 70006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 701*cb14a3feSDimitry Andric } catch (...) { 7020b57cec5SDimitry Andric __state |= ios_base::badbit; 7030b57cec5SDimitry Andric this->__setstate_nothrow(__state); 704*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 7050b57cec5SDimitry Andric if (__n > 0) 7060b57cec5SDimitry Andric *__s = char_type(); 7070b57cec5SDimitry Andric throw; 7080b57cec5SDimitry Andric } 7090b57cec5SDimitry Andric } 7100b57cec5SDimitry Andric#endif 711*cb14a3feSDimitry Andric } else { 7120b57cec5SDimitry Andric __state |= ios_base::failbit; 7130b57cec5SDimitry Andric } 7140b57cec5SDimitry Andric 7150b57cec5SDimitry Andric if (__n > 0) 7160b57cec5SDimitry Andric *__s = char_type(); 7170b57cec5SDimitry Andric this->setstate(__state); 7180b57cec5SDimitry Andric } 7190b57cec5SDimitry Andric if (__n > 0) 7200b57cec5SDimitry Andric *__s = char_type(); 7210b57cec5SDimitry Andric return *this; 7220b57cec5SDimitry Andric} 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 7250b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 726*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm) { 7270b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7280b57cec5SDimitry Andric __gc_ = 0; 7290b57cec5SDimitry Andric sentry __sen(*this, true); 730*cb14a3feSDimitry Andric if (__sen) { 73106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 732*cb14a3feSDimitry Andric try { 73306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 734*cb14a3feSDimitry Andric while (true) { 7350b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 736*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 7370b57cec5SDimitry Andric __state |= ios_base::eofbit; 7380b57cec5SDimitry Andric break; 7390b57cec5SDimitry Andric } 7400b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 7410b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 7420b57cec5SDimitry Andric break; 7430b57cec5SDimitry Andric if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof())) 7440b57cec5SDimitry Andric break; 7455f757f3fSDimitry Andric __inc_gcount(); 7460b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7470b57cec5SDimitry Andric } 74806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 749*cb14a3feSDimitry Andric } catch (...) { 7500b57cec5SDimitry Andric __state |= ios_base::badbit; 7510b57cec5SDimitry Andric // according to the spec, exceptions here are caught but not rethrown 7520b57cec5SDimitry Andric } 75306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 7540b57cec5SDimitry Andric if (__gc_ == 0) 7550b57cec5SDimitry Andric __state |= ios_base::failbit; 7560b57cec5SDimitry Andric this->setstate(__state); 7570b57cec5SDimitry Andric } 7580b57cec5SDimitry Andric return *this; 7590b57cec5SDimitry Andric} 7600b57cec5SDimitry Andric 7610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 7620b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 763*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) { 7640b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7650b57cec5SDimitry Andric __gc_ = 0; 7660b57cec5SDimitry Andric sentry __sen(*this, true); 767*cb14a3feSDimitry Andric if (__sen) { 76806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 769*cb14a3feSDimitry Andric try { 77006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 771*cb14a3feSDimitry Andric while (true) { 7720b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 773*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 7740b57cec5SDimitry Andric __state |= ios_base::eofbit; 7750b57cec5SDimitry Andric break; 7760b57cec5SDimitry Andric } 7770b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 778*cb14a3feSDimitry Andric if (traits_type::eq(__ch, __dlm)) { 7790b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7805f757f3fSDimitry Andric __inc_gcount(); 7810b57cec5SDimitry Andric break; 7820b57cec5SDimitry Andric } 783*cb14a3feSDimitry Andric if (__gc_ >= __n - 1) { 7840b57cec5SDimitry Andric __state |= ios_base::failbit; 7850b57cec5SDimitry Andric break; 7860b57cec5SDimitry Andric } 7870b57cec5SDimitry Andric *__s++ = __ch; 7880b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7895f757f3fSDimitry Andric __inc_gcount(); 7900b57cec5SDimitry Andric } 79106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 792*cb14a3feSDimitry Andric } catch (...) { 7930b57cec5SDimitry Andric __state |= ios_base::badbit; 7940b57cec5SDimitry Andric this->__setstate_nothrow(__state); 795*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 7960b57cec5SDimitry Andric if (__n > 0) 7970b57cec5SDimitry Andric *__s = char_type(); 7980b57cec5SDimitry Andric if (__gc_ == 0) 7990b57cec5SDimitry Andric __state |= ios_base::failbit; 8000b57cec5SDimitry Andric throw; 8010b57cec5SDimitry Andric } 8020b57cec5SDimitry Andric } 80306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8040b57cec5SDimitry Andric } 8050b57cec5SDimitry Andric if (__n > 0) 8060b57cec5SDimitry Andric *__s = char_type(); 8070b57cec5SDimitry Andric if (__gc_ == 0) 8080b57cec5SDimitry Andric __state |= ios_base::failbit; 8090b57cec5SDimitry Andric this->setstate(__state); 8100b57cec5SDimitry Andric return *this; 8110b57cec5SDimitry Andric} 8120b57cec5SDimitry Andric 8130b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 814*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) { 8150b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8160b57cec5SDimitry Andric __gc_ = 0; 8170b57cec5SDimitry Andric sentry __sen(*this, true); 818*cb14a3feSDimitry Andric if (__sen) { 81906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 820*cb14a3feSDimitry Andric try { 82106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 822*cb14a3feSDimitry Andric if (__n == numeric_limits<streamsize>::max()) { 823*cb14a3feSDimitry Andric while (true) { 8240b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 825*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 8260b57cec5SDimitry Andric __state |= ios_base::eofbit; 8270b57cec5SDimitry Andric break; 8280b57cec5SDimitry Andric } 8295f757f3fSDimitry Andric __inc_gcount(); 8300b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 8310b57cec5SDimitry Andric break; 8320b57cec5SDimitry Andric } 833*cb14a3feSDimitry Andric } else { 834*cb14a3feSDimitry Andric while (__gc_ < __n) { 8350b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 836*cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 8370b57cec5SDimitry Andric __state |= ios_base::eofbit; 8380b57cec5SDimitry Andric break; 8390b57cec5SDimitry Andric } 8405f757f3fSDimitry Andric __inc_gcount(); 8410b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 8420b57cec5SDimitry Andric break; 8430b57cec5SDimitry Andric } 8440b57cec5SDimitry Andric } 84506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 846*cb14a3feSDimitry Andric } catch (...) { 8470b57cec5SDimitry Andric __state |= ios_base::badbit; 8480b57cec5SDimitry Andric this->__setstate_nothrow(__state); 849*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 8500b57cec5SDimitry Andric throw; 8510b57cec5SDimitry Andric } 8520b57cec5SDimitry Andric } 85306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8540b57cec5SDimitry Andric this->setstate(__state); 8550b57cec5SDimitry Andric } 8560b57cec5SDimitry Andric return *this; 8570b57cec5SDimitry Andric} 8580b57cec5SDimitry Andric 8590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 860*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::peek() { 8610b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8620b57cec5SDimitry Andric __gc_ = 0; 8630b57cec5SDimitry Andric int_type __r = traits_type::eof(); 8640b57cec5SDimitry Andric sentry __sen(*this, true); 865*cb14a3feSDimitry Andric if (__sen) { 86606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 867*cb14a3feSDimitry Andric try { 86806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8690b57cec5SDimitry Andric __r = this->rdbuf()->sgetc(); 8700b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 8710b57cec5SDimitry Andric __state |= ios_base::eofbit; 87206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 873*cb14a3feSDimitry Andric } catch (...) { 8740b57cec5SDimitry Andric __state |= ios_base::badbit; 8750b57cec5SDimitry Andric this->__setstate_nothrow(__state); 876*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 8770b57cec5SDimitry Andric throw; 8780b57cec5SDimitry Andric } 8790b57cec5SDimitry Andric } 88006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8810b57cec5SDimitry Andric this->setstate(__state); 8820b57cec5SDimitry Andric } 8830b57cec5SDimitry Andric return __r; 8840b57cec5SDimitry Andric} 8850b57cec5SDimitry Andric 8860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 887*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) { 8880b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8890b57cec5SDimitry Andric __gc_ = 0; 8900b57cec5SDimitry Andric sentry __sen(*this, true); 891*cb14a3feSDimitry Andric if (__sen) { 89206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 893*cb14a3feSDimitry Andric try { 89406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8950b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 8960b57cec5SDimitry Andric if (__gc_ != __n) 8970b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 89806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 899*cb14a3feSDimitry Andric } catch (...) { 9000b57cec5SDimitry Andric __state |= ios_base::badbit; 9010b57cec5SDimitry Andric this->__setstate_nothrow(__state); 902*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9030b57cec5SDimitry Andric throw; 9040b57cec5SDimitry Andric } 9050b57cec5SDimitry Andric } 90606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 907*cb14a3feSDimitry Andric } else { 9080b57cec5SDimitry Andric __state |= ios_base::failbit; 9090b57cec5SDimitry Andric } 9100b57cec5SDimitry Andric this->setstate(__state); 9110b57cec5SDimitry Andric return *this; 9120b57cec5SDimitry Andric} 9130b57cec5SDimitry Andric 9140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 915*cb14a3feSDimitry Andricstreamsize basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) { 9160b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 9170b57cec5SDimitry Andric __gc_ = 0; 9180b57cec5SDimitry Andric sentry __sen(*this, true); 919*cb14a3feSDimitry Andric if (__sen) { 92006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 921*cb14a3feSDimitry Andric try { 92206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 9230b57cec5SDimitry Andric streamsize __c = this->rdbuf()->in_avail(); 924*cb14a3feSDimitry Andric switch (__c) { 9250b57cec5SDimitry Andric case -1: 9260b57cec5SDimitry Andric __state |= ios_base::eofbit; 9270b57cec5SDimitry Andric break; 9280b57cec5SDimitry Andric case 0: 9290b57cec5SDimitry Andric break; 9300b57cec5SDimitry Andric default: 9315f757f3fSDimitry Andric __n = std::min(__c, __n); 9320b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 9330b57cec5SDimitry Andric if (__gc_ != __n) 9340b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 9350b57cec5SDimitry Andric break; 9360b57cec5SDimitry Andric } 93706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 938*cb14a3feSDimitry Andric } catch (...) { 9390b57cec5SDimitry Andric __state |= ios_base::badbit; 9400b57cec5SDimitry Andric this->__setstate_nothrow(__state); 941*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9420b57cec5SDimitry Andric throw; 9430b57cec5SDimitry Andric } 9440b57cec5SDimitry Andric } 94506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 946*cb14a3feSDimitry Andric } else { 9470b57cec5SDimitry Andric __state |= ios_base::failbit; 9480b57cec5SDimitry Andric } 9490b57cec5SDimitry Andric this->setstate(__state); 9500b57cec5SDimitry Andric return __gc_; 9510b57cec5SDimitry Andric} 9520b57cec5SDimitry Andric 9530b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 954*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::putback(char_type __c) { 9550b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 9560b57cec5SDimitry Andric __gc_ = 0; 9570b57cec5SDimitry Andric this->clear(__state); 9580b57cec5SDimitry Andric sentry __sen(*this, true); 959*cb14a3feSDimitry Andric if (__sen) { 96006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 961*cb14a3feSDimitry Andric try { 96206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 963e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof()) 9640b57cec5SDimitry Andric __state |= ios_base::badbit; 96506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 966*cb14a3feSDimitry Andric } catch (...) { 9670b57cec5SDimitry Andric __state |= ios_base::badbit; 9680b57cec5SDimitry Andric this->__setstate_nothrow(__state); 969*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9700b57cec5SDimitry Andric throw; 9710b57cec5SDimitry Andric } 9720b57cec5SDimitry Andric } 97306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 974*cb14a3feSDimitry Andric } else { 9750b57cec5SDimitry Andric __state |= ios_base::failbit; 9760b57cec5SDimitry Andric } 9770b57cec5SDimitry Andric this->setstate(__state); 9780b57cec5SDimitry Andric return *this; 9790b57cec5SDimitry Andric} 9800b57cec5SDimitry Andric 9810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 982*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() { 9830b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 9840b57cec5SDimitry Andric __gc_ = 0; 9850b57cec5SDimitry Andric this->clear(__state); 9860b57cec5SDimitry Andric sentry __sen(*this, true); 987*cb14a3feSDimitry Andric if (__sen) { 98806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 989*cb14a3feSDimitry Andric try { 99006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 991e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof()) 9920b57cec5SDimitry Andric __state |= ios_base::badbit; 99306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 994*cb14a3feSDimitry Andric } catch (...) { 9950b57cec5SDimitry Andric __state |= ios_base::badbit; 9960b57cec5SDimitry Andric this->__setstate_nothrow(__state); 997*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9980b57cec5SDimitry Andric throw; 9990b57cec5SDimitry Andric } 10000b57cec5SDimitry Andric } 100106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1002*cb14a3feSDimitry Andric } else { 10030b57cec5SDimitry Andric __state |= ios_base::failbit; 10040b57cec5SDimitry Andric } 10050b57cec5SDimitry Andric this->setstate(__state); 10060b57cec5SDimitry Andric return *this; 10070b57cec5SDimitry Andric} 10080b57cec5SDimitry Andric 10090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1010*cb14a3feSDimitry Andricint basic_istream<_CharT, _Traits>::sync() { 10110b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10120b57cec5SDimitry Andric int __r = 0; 10130b57cec5SDimitry Andric sentry __sen(*this, true); 1014*cb14a3feSDimitry Andric if (__sen) { 101506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1016*cb14a3feSDimitry Andric try { 101706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1018e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr) 10190b57cec5SDimitry Andric return -1; 1020*cb14a3feSDimitry Andric if (this->rdbuf()->pubsync() == -1) { 10210b57cec5SDimitry Andric __state |= ios_base::badbit; 10220b57cec5SDimitry Andric return -1; 10230b57cec5SDimitry Andric } 102406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1025*cb14a3feSDimitry Andric } catch (...) { 10260b57cec5SDimitry Andric __state |= ios_base::badbit; 10270b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1028*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10290b57cec5SDimitry Andric throw; 10300b57cec5SDimitry Andric } 10310b57cec5SDimitry Andric } 103206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10330b57cec5SDimitry Andric this->setstate(__state); 10340b57cec5SDimitry Andric } 10350b57cec5SDimitry Andric return __r; 10360b57cec5SDimitry Andric} 10370b57cec5SDimitry Andric 10380b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1039*cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>::tellg() { 10400b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10410b57cec5SDimitry Andric pos_type __r(-1); 10420b57cec5SDimitry Andric sentry __sen(*this, true); 1043*cb14a3feSDimitry Andric if (__sen) { 104406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1045*cb14a3feSDimitry Andric try { 104606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10470b57cec5SDimitry Andric __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); 104806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1049*cb14a3feSDimitry Andric } catch (...) { 10500b57cec5SDimitry Andric __state |= ios_base::badbit; 10510b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1052*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10530b57cec5SDimitry Andric throw; 10540b57cec5SDimitry Andric } 10550b57cec5SDimitry Andric } 105606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10570b57cec5SDimitry Andric this->setstate(__state); 10580b57cec5SDimitry Andric } 10590b57cec5SDimitry Andric return __r; 10600b57cec5SDimitry Andric} 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1063*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(pos_type __pos) { 10640b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 10650b57cec5SDimitry Andric this->clear(__state); 10660b57cec5SDimitry Andric sentry __sen(*this, true); 1067*cb14a3feSDimitry Andric if (__sen) { 106806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1069*cb14a3feSDimitry Andric try { 107006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10710b57cec5SDimitry Andric if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1)) 10720b57cec5SDimitry Andric __state |= ios_base::failbit; 107306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1074*cb14a3feSDimitry Andric } catch (...) { 10750b57cec5SDimitry Andric __state |= ios_base::badbit; 10760b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1077*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10780b57cec5SDimitry Andric throw; 10790b57cec5SDimitry Andric } 10800b57cec5SDimitry Andric } 108106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10820b57cec5SDimitry Andric this->setstate(__state); 10830b57cec5SDimitry Andric } 10840b57cec5SDimitry Andric return *this; 10850b57cec5SDimitry Andric} 10860b57cec5SDimitry Andric 10870b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1088*cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) { 10890b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 10900b57cec5SDimitry Andric this->clear(__state); 10910b57cec5SDimitry Andric sentry __sen(*this, true); 1092*cb14a3feSDimitry Andric if (__sen) { 109306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1094*cb14a3feSDimitry Andric try { 109506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10960b57cec5SDimitry Andric if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1)) 10970b57cec5SDimitry Andric __state |= ios_base::failbit; 109806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1099*cb14a3feSDimitry Andric } catch (...) { 11000b57cec5SDimitry Andric __state |= ios_base::badbit; 11010b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1102*cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 11030b57cec5SDimitry Andric throw; 11040b57cec5SDimitry Andric } 11050b57cec5SDimitry Andric } 110606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11070b57cec5SDimitry Andric this->setstate(__state); 11080b57cec5SDimitry Andric } 11090b57cec5SDimitry Andric return *this; 11100b57cec5SDimitry Andric} 11110b57cec5SDimitry Andric 11120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1113*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& ws(basic_istream<_CharT, _Traits>& __is) { 11140b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 11150b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 1116*cb14a3feSDimitry Andric if (__sen) { 111706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1118*cb14a3feSDimitry Andric try { 111906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1120bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 1121*cb14a3feSDimitry Andric while (true) { 11220b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1123*cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 11240b57cec5SDimitry Andric __state |= ios_base::eofbit; 11250b57cec5SDimitry Andric break; 11260b57cec5SDimitry Andric } 11270b57cec5SDimitry Andric if (!__ct.is(__ct.space, _Traits::to_char_type(__i))) 11280b57cec5SDimitry Andric break; 11290b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 11300b57cec5SDimitry Andric } 113106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1132*cb14a3feSDimitry Andric } catch (...) { 11330b57cec5SDimitry Andric __state |= ios_base::badbit; 11340b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1135*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 11360b57cec5SDimitry Andric throw; 11370b57cec5SDimitry Andric } 11380b57cec5SDimitry Andric } 113906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11400b57cec5SDimitry Andric __is.setstate(__state); 11410b57cec5SDimitry Andric } 11420b57cec5SDimitry Andric return __is; 11430b57cec5SDimitry Andric} 11440b57cec5SDimitry Andric 1145e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void> 1146e8d8bef9SDimitry Andricstruct __is_istreamable : false_type {}; 1147e8d8bef9SDimitry Andric 1148e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp> 1149*cb14a3feSDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype(std::declval<_Stream>() >> std::declval<_Tp>(), void())> : true_type {}; 1150e8d8bef9SDimitry Andric 1151*cb14a3feSDimitry Andrictemplate <class _Stream, 1152*cb14a3feSDimitry Andric class _Tp, 1153*cb14a3feSDimitry Andric __enable_if_t< _And<is_base_of<ios_base, _Stream>, __is_istreamable<_Stream&, _Tp&&> >::value, int> = 0> 1154*cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Stream&& operator>>(_Stream&& __is, _Tp&& __x) { 11555f757f3fSDimitry Andric __is >> std::forward<_Tp>(__x); 11565f757f3fSDimitry Andric return std::move(__is); 11570b57cec5SDimitry Andric} 11580b57cec5SDimitry Andric 11590b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 11600b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream 11610b57cec5SDimitry Andric : public basic_istream<_CharT, _Traits>, 1162*cb14a3feSDimitry Andric public basic_ostream<_CharT, _Traits> { 11630b57cec5SDimitry Andricpublic: 11640b57cec5SDimitry Andric // types: 11650b57cec5SDimitry Andric typedef _CharT char_type; 11660b57cec5SDimitry Andric typedef _Traits traits_type; 11670b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 11680b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 11690b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 11700b57cec5SDimitry Andric 11710b57cec5SDimitry Andric // constructor/destructor 1172*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb) 1173*cb14a3feSDimitry Andric : basic_istream<_CharT, _Traits>(__sb) {} 11740b57cec5SDimitry Andric 1175bdd1243dSDimitry Andric ~basic_iostream() override; 1176*cb14a3feSDimitry Andric 11770b57cec5SDimitry Andricprotected: 1178*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_iostream(basic_iostream&& __rhs); 11790b57cec5SDimitry Andric 11800b57cec5SDimitry Andric // assign/swap 1181*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_iostream& operator=(basic_iostream&& __rhs); 1182fe6060f1SDimitry Andric 1183*cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_iostream& __rhs) { 1184*cb14a3feSDimitry Andric basic_istream<char_type, traits_type>::swap(__rhs); 1185*cb14a3feSDimitry Andric } 11860b57cec5SDimitry Andric}; 11870b57cec5SDimitry Andric 11880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 11890b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs) 1190*cb14a3feSDimitry Andric : basic_istream<_CharT, _Traits>(std::move(__rhs)) {} 11910b57cec5SDimitry Andric 11920b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1193*cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>& basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) { 11940b57cec5SDimitry Andric swap(__rhs); 11950b57cec5SDimitry Andric return *this; 11960b57cec5SDimitry Andric} 11970b57cec5SDimitry Andric 11980b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1199*cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream() {} 12000b57cec5SDimitry Andric 12010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1202bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1203*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 12040b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12050b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 1206*cb14a3feSDimitry Andric if (__sen) { 120706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1208*cb14a3feSDimitry Andric try { 12090b57cec5SDimitry Andric#endif 12100b57cec5SDimitry Andric __str.clear(); 12110b57cec5SDimitry Andric streamsize __n = __is.width(); 12120b57cec5SDimitry Andric if (__n <= 0) 12130b57cec5SDimitry Andric __n = __str.max_size(); 12140b57cec5SDimitry Andric if (__n <= 0) 12150b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max(); 12160b57cec5SDimitry Andric streamsize __c = 0; 1217bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 1218*cb14a3feSDimitry Andric while (__c < __n) { 12190b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1220*cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 12210b57cec5SDimitry Andric __state |= ios_base::eofbit; 12220b57cec5SDimitry Andric break; 12230b57cec5SDimitry Andric } 12240b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 12250b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 12260b57cec5SDimitry Andric break; 12270b57cec5SDimitry Andric __str.push_back(__ch); 12280b57cec5SDimitry Andric ++__c; 12290b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 12300b57cec5SDimitry Andric } 12310b57cec5SDimitry Andric __is.width(0); 12320b57cec5SDimitry Andric if (__c == 0) 12330b57cec5SDimitry Andric __state |= ios_base::failbit; 123406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1235*cb14a3feSDimitry Andric } catch (...) { 12360b57cec5SDimitry Andric __state |= ios_base::badbit; 12370b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1238*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 12390b57cec5SDimitry Andric throw; 12400b57cec5SDimitry Andric } 12410b57cec5SDimitry Andric } 12420b57cec5SDimitry Andric#endif 12430b57cec5SDimitry Andric __is.setstate(__state); 12440b57cec5SDimitry Andric } 12450b57cec5SDimitry Andric return __is; 12460b57cec5SDimitry Andric} 12470b57cec5SDimitry Andric 12480b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1249bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1250*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) { 12510b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12520b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 1253*cb14a3feSDimitry Andric if (__sen) { 125406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1255*cb14a3feSDimitry Andric try { 12560b57cec5SDimitry Andric#endif 12570b57cec5SDimitry Andric __str.clear(); 12580b57cec5SDimitry Andric streamsize __extr = 0; 1259*cb14a3feSDimitry Andric while (true) { 12600b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 1261*cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 12620b57cec5SDimitry Andric __state |= ios_base::eofbit; 12630b57cec5SDimitry Andric break; 12640b57cec5SDimitry Andric } 12650b57cec5SDimitry Andric ++__extr; 12660b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 12670b57cec5SDimitry Andric if (_Traits::eq(__ch, __dlm)) 12680b57cec5SDimitry Andric break; 12690b57cec5SDimitry Andric __str.push_back(__ch); 1270*cb14a3feSDimitry Andric if (__str.size() == __str.max_size()) { 12710b57cec5SDimitry Andric __state |= ios_base::failbit; 12720b57cec5SDimitry Andric break; 12730b57cec5SDimitry Andric } 12740b57cec5SDimitry Andric } 12750b57cec5SDimitry Andric if (__extr == 0) 12760b57cec5SDimitry Andric __state |= ios_base::failbit; 127706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1278*cb14a3feSDimitry Andric } catch (...) { 12790b57cec5SDimitry Andric __state |= ios_base::badbit; 12800b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1281*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 12820b57cec5SDimitry Andric throw; 12830b57cec5SDimitry Andric } 12840b57cec5SDimitry Andric } 12850b57cec5SDimitry Andric#endif 12860b57cec5SDimitry Andric __is.setstate(__state); 12870b57cec5SDimitry Andric } 12880b57cec5SDimitry Andric return __is; 12890b57cec5SDimitry Andric} 12900b57cec5SDimitry Andric 12910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1292*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1293*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 1294bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 12950b57cec5SDimitry Andric} 12960b57cec5SDimitry Andric 12970b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1298*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1299*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) { 1300bdd1243dSDimitry Andric return std::getline(__is, __str, __dlm); 13010b57cec5SDimitry Andric} 13020b57cec5SDimitry Andric 13030b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1304*cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1305*cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 1306bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 13070b57cec5SDimitry Andric} 13080b57cec5SDimitry Andric 13090b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size> 1310bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1311*cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) { 13120b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 13130b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 1314*cb14a3feSDimitry Andric if (__sen) { 131506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1316*cb14a3feSDimitry Andric try { 13170b57cec5SDimitry Andric#endif 13180b57cec5SDimitry Andric basic_string<_CharT, _Traits> __str; 1319bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 13200b57cec5SDimitry Andric size_t __c = 0; 13210b57cec5SDimitry Andric _CharT __zero = __ct.widen('0'); 13220b57cec5SDimitry Andric _CharT __one = __ct.widen('1'); 1323*cb14a3feSDimitry Andric while (__c != _Size) { 13240b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1325*cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 13260b57cec5SDimitry Andric __state |= ios_base::eofbit; 13270b57cec5SDimitry Andric break; 13280b57cec5SDimitry Andric } 13290b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 13300b57cec5SDimitry Andric if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one)) 13310b57cec5SDimitry Andric break; 13320b57cec5SDimitry Andric __str.push_back(__ch); 13330b57cec5SDimitry Andric ++__c; 13340b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 13350b57cec5SDimitry Andric } 13360b57cec5SDimitry Andric __x = bitset<_Size>(__str); 1337e40139ffSDimitry Andric if (_Size > 0 && __c == 0) 13380b57cec5SDimitry Andric __state |= ios_base::failbit; 133906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1340*cb14a3feSDimitry Andric } catch (...) { 13410b57cec5SDimitry Andric __state |= ios_base::badbit; 13420b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1343*cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 13440b57cec5SDimitry Andric throw; 13450b57cec5SDimitry Andric } 13460b57cec5SDimitry Andric } 13470b57cec5SDimitry Andric#endif 13480b57cec5SDimitry Andric __is.setstate(__state); 13490b57cec5SDimitry Andric } 13500b57cec5SDimitry Andric return __is; 13510b57cec5SDimitry Andric} 13520b57cec5SDimitry Andric 135381ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>; 1354349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 135581ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>; 1356349cc55cSDimitry Andric#endif 135781ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>; 13580b57cec5SDimitry Andric 13590b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 13600b57cec5SDimitry Andric 1361bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 1362bdd1243dSDimitry Andric# include <concepts> 13635f757f3fSDimitry Andric# include <iosfwd> 1364bdd1243dSDimitry Andric# include <type_traits> 1365bdd1243dSDimitry Andric#endif 1366bdd1243dSDimitry Andric 13670b57cec5SDimitry Andric_LIBCPP_POP_MACROS 13680b57cec5SDimitry Andric 13690b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM 1370