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 1610b57cec5SDimitry Andric#include <__config> 16206c3fb27SDimitry Andric#include <__fwd/istream.h> 16381ad6265SDimitry Andric#include <__iterator/istreambuf_iterator.h> 164*0fca6ea1SDimitry Andric#include <__ostream/basic_ostream.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> 170*0fca6ea1SDimitry Andric#include <bitset> 171*0fca6ea1SDimitry Andric#include <ios> 172*0fca6ea1SDimitry Andric#include <locale> 173fe6060f1SDimitry Andric#include <version> 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1760b57cec5SDimitry Andric# pragma GCC system_header 1770b57cec5SDimitry Andric#endif 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS 1800b57cec5SDimitry Andric#include <__undef_macros> 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 185cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream : virtual public basic_ios<_CharT, _Traits> { 1860b57cec5SDimitry Andric streamsize __gc_; 1875f757f3fSDimitry Andric 1885f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI void __inc_gcount() { 1895f757f3fSDimitry Andric if (__gc_ < numeric_limits<streamsize>::max()) 1905f757f3fSDimitry Andric ++__gc_; 1915f757f3fSDimitry Andric } 192cb14a3feSDimitry 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: 202cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb) 203cb14a3feSDimitry Andric : __gc_(0) { 204cb14a3feSDimitry Andric this->init(__sb); 205cb14a3feSDimitry Andric } 206bdd1243dSDimitry Andric ~basic_istream() override; 207cb14a3feSDimitry Andric 2080b57cec5SDimitry Andricprotected: 209cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_istream(basic_istream&& __rhs); 2100b57cec5SDimitry Andric 2110b57cec5SDimitry Andric // 27.7.1.1.2 Assign/swap: 212cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_istream& operator=(basic_istream&& __rhs); 2130b57cec5SDimitry Andric 214cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_istream& __rhs) { 2155f757f3fSDimitry Andric std::swap(__gc_, __rhs.__gc_); 2160b57cec5SDimitry Andric basic_ios<char_type, traits_type>::swap(__rhs); 2170b57cec5SDimitry Andric } 2180b57cec5SDimitry Andric 219*0fca6ea1SDimitry Andricpublic: 2200b57cec5SDimitry Andric basic_istream(const basic_istream& __rhs) = delete; 2210b57cec5SDimitry Andric basic_istream& operator=(const basic_istream& __rhs) = delete; 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric // 27.7.1.1.3 Prefix/suffix: 2240b57cec5SDimitry Andric class _LIBCPP_TEMPLATE_VIS sentry; 2250b57cec5SDimitry Andric 2260b57cec5SDimitry Andric // 27.7.1.2 Formatted input: 227cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&)) { 228cb14a3feSDimitry Andric return __pf(*this); 229cb14a3feSDimitry Andric } 2300b57cec5SDimitry Andric 231cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& 232cb14a3feSDimitry Andric operator>>(basic_ios<char_type, traits_type>& (*__pf)(basic_ios<char_type, traits_type>&)) { 233cb14a3feSDimitry Andric __pf(*this); 234cb14a3feSDimitry Andric return *this; 235cb14a3feSDimitry Andric } 2360b57cec5SDimitry Andric 237cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& operator>>(ios_base& (*__pf)(ios_base&)) { 238cb14a3feSDimitry Andric __pf(*this); 239cb14a3feSDimitry Andric return *this; 240cb14a3feSDimitry Andric } 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb); 2430b57cec5SDimitry Andric basic_istream& operator>>(bool& __n); 2440b57cec5SDimitry Andric basic_istream& operator>>(short& __n); 2450b57cec5SDimitry Andric basic_istream& operator>>(unsigned short& __n); 2460b57cec5SDimitry Andric basic_istream& operator>>(int& __n); 2470b57cec5SDimitry Andric basic_istream& operator>>(unsigned int& __n); 2480b57cec5SDimitry Andric basic_istream& operator>>(long& __n); 2490b57cec5SDimitry Andric basic_istream& operator>>(unsigned long& __n); 2500b57cec5SDimitry Andric basic_istream& operator>>(long long& __n); 2510b57cec5SDimitry Andric basic_istream& operator>>(unsigned long long& __n); 2520b57cec5SDimitry Andric basic_istream& operator>>(float& __f); 2530b57cec5SDimitry Andric basic_istream& operator>>(double& __f); 2540b57cec5SDimitry Andric basic_istream& operator>>(long double& __f); 2550b57cec5SDimitry Andric basic_istream& operator>>(void*& __p); 2560b57cec5SDimitry Andric 2570b57cec5SDimitry Andric // 27.7.1.3 Unformatted input: 258cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI streamsize gcount() const { return __gc_; } 2590b57cec5SDimitry Andric int_type get(); 2600b57cec5SDimitry Andric 261cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type& __c) { 2620b57cec5SDimitry Andric int_type __ch = get(); 2630b57cec5SDimitry Andric if (__ch != traits_type::eof()) 2640b57cec5SDimitry Andric __c = traits_type::to_char_type(__ch); 2650b57cec5SDimitry Andric return *this; 2660b57cec5SDimitry Andric } 2670b57cec5SDimitry Andric 268cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(char_type* __s, streamsize __n) { 269cb14a3feSDimitry Andric return get(__s, __n, this->widen('\n')); 270cb14a3feSDimitry Andric } 2710b57cec5SDimitry Andric 2720b57cec5SDimitry Andric basic_istream& get(char_type* __s, streamsize __n, char_type __dlm); 2730b57cec5SDimitry Andric 274cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& get(basic_streambuf<char_type, traits_type>& __sb) { 275cb14a3feSDimitry Andric return get(__sb, this->widen('\n')); 276cb14a3feSDimitry Andric } 2770b57cec5SDimitry Andric 2780b57cec5SDimitry Andric basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm); 2790b57cec5SDimitry Andric 280cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 basic_istream& getline(char_type* __s, streamsize __n) { 281cb14a3feSDimitry Andric return getline(__s, __n, this->widen('\n')); 282cb14a3feSDimitry Andric } 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm); 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof()); 2870b57cec5SDimitry Andric int_type peek(); 2880b57cec5SDimitry Andric basic_istream& read(char_type* __s, streamsize __n); 2890b57cec5SDimitry Andric streamsize readsome(char_type* __s, streamsize __n); 2900b57cec5SDimitry Andric 2910b57cec5SDimitry Andric basic_istream& putback(char_type __c); 2920b57cec5SDimitry Andric basic_istream& unget(); 2930b57cec5SDimitry Andric int sync(); 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric pos_type tellg(); 2960b57cec5SDimitry Andric basic_istream& seekg(pos_type __pos); 2970b57cec5SDimitry Andric basic_istream& seekg(off_type __off, ios_base::seekdir __dir); 2980b57cec5SDimitry Andric}; 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 301cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_istream<_CharT, _Traits>::sentry { 3020b57cec5SDimitry Andric bool __ok_; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andricpublic: 3050b57cec5SDimitry Andric explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false); 3060b57cec5SDimitry Andric // ~sentry() = default; 3070b57cec5SDimitry Andric 308cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit operator bool() const { return __ok_; } 3090eae32dcSDimitry Andric 3100eae32dcSDimitry Andric sentry(const sentry&) = delete; 3110eae32dcSDimitry Andric sentry& operator=(const sentry&) = delete; 3120b57cec5SDimitry Andric}; 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 315cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws) : __ok_(false) { 316cb14a3feSDimitry Andric if (__is.good()) { 3170b57cec5SDimitry Andric if (__is.tie()) 3180b57cec5SDimitry Andric __is.tie()->flush(); 319cb14a3feSDimitry Andric if (!__noskipws && (__is.flags() & ios_base::skipws)) { 3200b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 321bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 3220b57cec5SDimitry Andric _Ip __i(__is); 3230b57cec5SDimitry Andric _Ip __eof; 3240b57cec5SDimitry Andric for (; __i != __eof; ++__i) 3250b57cec5SDimitry Andric if (!__ct.is(__ct.space, *__i)) 3260b57cec5SDimitry Andric break; 3270b57cec5SDimitry Andric if (__i == __eof) 3280b57cec5SDimitry Andric __is.setstate(ios_base::failbit | ios_base::eofbit); 3290b57cec5SDimitry Andric } 3300b57cec5SDimitry Andric __ok_ = __is.good(); 331cb14a3feSDimitry Andric } else 3320b57cec5SDimitry Andric __is.setstate(ios_base::failbit); 3330b57cec5SDimitry Andric} 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 336cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs) : __gc_(__rhs.__gc_) { 3370b57cec5SDimitry Andric __rhs.__gc_ = 0; 3380b57cec5SDimitry Andric this->move(__rhs); 3390b57cec5SDimitry Andric} 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 342cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs) { 3430b57cec5SDimitry Andric swap(__rhs); 3440b57cec5SDimitry Andric return *this; 3450b57cec5SDimitry Andric} 3460b57cec5SDimitry Andric 3470b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 348cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::~basic_istream() {} 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 351cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 3520b57cec5SDimitry Andric__input_arithmetic(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 3530b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 3540b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 355cb14a3feSDimitry Andric if (__s) { 35606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 357cb14a3feSDimitry Andric try { 35806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 3590b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 3600b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 361bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __n); 36206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 363cb14a3feSDimitry Andric } catch (...) { 3640b57cec5SDimitry Andric __state |= ios_base::badbit; 3650b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 366cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 3670b57cec5SDimitry Andric throw; 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric } 3700b57cec5SDimitry Andric#endif 3710b57cec5SDimitry Andric __is.setstate(__state); 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric return __is; 3740b57cec5SDimitry Andric} 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 377cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n) { 3785f757f3fSDimitry Andric return std::__input_arithmetic<unsigned short>(*this, __n); 3790b57cec5SDimitry Andric} 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 382cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n) { 3835f757f3fSDimitry Andric return std::__input_arithmetic<unsigned int>(*this, __n); 3840b57cec5SDimitry Andric} 3850b57cec5SDimitry Andric 3860b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 387cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long& __n) { 3885f757f3fSDimitry Andric return std::__input_arithmetic<long>(*this, __n); 3890b57cec5SDimitry Andric} 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 392cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n) { 3935f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long>(*this, __n); 3940b57cec5SDimitry Andric} 3950b57cec5SDimitry Andric 3960b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 397cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long long& __n) { 3985f757f3fSDimitry Andric return std::__input_arithmetic<long long>(*this, __n); 3990b57cec5SDimitry Andric} 4000b57cec5SDimitry Andric 4010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 402cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n) { 4035f757f3fSDimitry Andric return std::__input_arithmetic<unsigned long long>(*this, __n); 4040b57cec5SDimitry Andric} 4050b57cec5SDimitry Andric 4060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 407cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(float& __n) { 4085f757f3fSDimitry Andric return std::__input_arithmetic<float>(*this, __n); 4090b57cec5SDimitry Andric} 4100b57cec5SDimitry Andric 4110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 412cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(double& __n) { 4135f757f3fSDimitry Andric return std::__input_arithmetic<double>(*this, __n); 4140b57cec5SDimitry Andric} 4150b57cec5SDimitry Andric 4160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 417cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(long double& __n) { 4185f757f3fSDimitry Andric return std::__input_arithmetic<long double>(*this, __n); 4190b57cec5SDimitry Andric} 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 422cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(bool& __n) { 4235f757f3fSDimitry Andric return std::__input_arithmetic<bool>(*this, __n); 4240b57cec5SDimitry Andric} 4250b57cec5SDimitry Andric 4260b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 427cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(void*& __n) { 4285f757f3fSDimitry Andric return std::__input_arithmetic<void*>(*this, __n); 4290b57cec5SDimitry Andric} 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andrictemplate <class _Tp, class _CharT, class _Traits> 432cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 4330b57cec5SDimitry Andric__input_arithmetic_with_numeric_limits(basic_istream<_CharT, _Traits>& __is, _Tp& __n) { 4340b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 4350b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __s(__is); 436cb14a3feSDimitry Andric if (__s) { 43706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 438cb14a3feSDimitry Andric try { 43906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 4400b57cec5SDimitry Andric typedef istreambuf_iterator<_CharT, _Traits> _Ip; 4410b57cec5SDimitry Andric typedef num_get<_CharT, _Ip> _Fp; 4420b57cec5SDimitry Andric long __temp; 443bdd1243dSDimitry Andric std::use_facet<_Fp>(__is.getloc()).get(_Ip(__is), _Ip(), __is, __state, __temp); 444cb14a3feSDimitry Andric if (__temp < numeric_limits<_Tp>::min()) { 4450b57cec5SDimitry Andric __state |= ios_base::failbit; 4460b57cec5SDimitry Andric __n = numeric_limits<_Tp>::min(); 447cb14a3feSDimitry Andric } else if (__temp > numeric_limits<_Tp>::max()) { 4480b57cec5SDimitry Andric __state |= ios_base::failbit; 4490b57cec5SDimitry Andric __n = numeric_limits<_Tp>::max(); 450cb14a3feSDimitry Andric } else { 4510b57cec5SDimitry Andric __n = static_cast<_Tp>(__temp); 4520b57cec5SDimitry Andric } 45306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 454cb14a3feSDimitry Andric } catch (...) { 4550b57cec5SDimitry Andric __state |= ios_base::badbit; 4560b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 457cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 4580b57cec5SDimitry Andric throw; 4590b57cec5SDimitry Andric } 4600b57cec5SDimitry Andric } 46106c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 4620b57cec5SDimitry Andric __is.setstate(__state); 4630b57cec5SDimitry Andric } 4640b57cec5SDimitry Andric return __is; 4650b57cec5SDimitry Andric} 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 468cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(short& __n) { 4695f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<short>(*this, __n); 4700b57cec5SDimitry Andric} 4710b57cec5SDimitry Andric 4720b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 473cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::operator>>(int& __n) { 4745f757f3fSDimitry Andric return std::__input_arithmetic_with_numeric_limits<int>(*this, __n); 4750b57cec5SDimitry Andric} 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 478cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 479cb14a3feSDimitry Andric__input_c_string(basic_istream<_CharT, _Traits>& __is, _CharT* __p, size_t __n) { 4800b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 4810b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 482cb14a3feSDimitry Andric if (__sen) { 48306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 484cb14a3feSDimitry Andric try { 4850b57cec5SDimitry Andric#endif 4860b57cec5SDimitry Andric _CharT* __s = __p; 487bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 488cb14a3feSDimitry Andric while (__s != __p + (__n - 1)) { 4890b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 490cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 4910b57cec5SDimitry Andric __state |= ios_base::eofbit; 4920b57cec5SDimitry Andric break; 4930b57cec5SDimitry Andric } 4940b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 4950b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 4960b57cec5SDimitry Andric break; 4970b57cec5SDimitry Andric *__s++ = __ch; 4980b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 4990b57cec5SDimitry Andric } 5000b57cec5SDimitry Andric *__s = _CharT(); 5010b57cec5SDimitry Andric __is.width(0); 5020b57cec5SDimitry Andric if (__s == __p) 5030b57cec5SDimitry Andric __state |= ios_base::failbit; 50406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 505cb14a3feSDimitry Andric } catch (...) { 5060b57cec5SDimitry Andric __state |= ios_base::badbit; 5070b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 508cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 5090b57cec5SDimitry Andric throw; 5100b57cec5SDimitry Andric } 5110b57cec5SDimitry Andric } 5120b57cec5SDimitry Andric#endif 5130b57cec5SDimitry Andric __is.setstate(__state); 5140b57cec5SDimitry Andric } 5150b57cec5SDimitry Andric return __is; 5160b57cec5SDimitry Andric} 5170b57cec5SDimitry Andric 51806c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20 5190b57cec5SDimitry Andric 5200b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Np> 521cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 522cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT (&__buf)[_Np]) { 5230b57cec5SDimitry Andric size_t __n = _Np; 5240b57cec5SDimitry Andric if (__is.width() > 0) 5255f757f3fSDimitry Andric __n = std::min(size_t(__is.width()), _Np); 5265f757f3fSDimitry Andric return std::__input_c_string(__is, __buf, __n); 5270b57cec5SDimitry Andric} 5280b57cec5SDimitry Andric 5290b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np> 530cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 531cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char (&__buf)[_Np]) { 5320b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 5330b57cec5SDimitry Andric} 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andrictemplate <class _Traits, size_t _Np> 536cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 537cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char (&__buf)[_Np]) { 5380b57cec5SDimitry Andric return __is >> (char(&)[_Np])__buf; 5390b57cec5SDimitry Andric} 5400b57cec5SDimitry Andric 5410b57cec5SDimitry Andric#else 5420b57cec5SDimitry Andric 5430b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 544cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 545cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s) { 5460b57cec5SDimitry Andric streamsize __n = __is.width(); 5470b57cec5SDimitry Andric if (__n <= 0) 5480b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1; 5495f757f3fSDimitry Andric return std::__input_c_string(__is, __s, size_t(__n)); 5500b57cec5SDimitry Andric} 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andrictemplate <class _Traits> 553cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 554cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char* __s) { 5550b57cec5SDimitry Andric return __is >> (char*)__s; 5560b57cec5SDimitry Andric} 5570b57cec5SDimitry Andric 5580b57cec5SDimitry Andrictemplate <class _Traits> 559cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 560cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char* __s) { 5610b57cec5SDimitry Andric return __is >> (char*)__s; 5620b57cec5SDimitry Andric} 5630b57cec5SDimitry Andric 56406c3fb27SDimitry Andric#endif // _LIBCPP_STD_VER >= 20 5650b57cec5SDimitry Andric 5660b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 567cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c) { 5680b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 5690b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 570cb14a3feSDimitry Andric if (__sen) { 57106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 572cb14a3feSDimitry Andric try { 5730b57cec5SDimitry Andric#endif 5740b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 5750b57cec5SDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) 5760b57cec5SDimitry Andric __state |= ios_base::eofbit | ios_base::failbit; 5770b57cec5SDimitry Andric else 5780b57cec5SDimitry Andric __c = _Traits::to_char_type(__i); 57906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 580cb14a3feSDimitry Andric } catch (...) { 5810b57cec5SDimitry Andric __state |= ios_base::badbit; 5820b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 583cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 5840b57cec5SDimitry Andric throw; 5850b57cec5SDimitry Andric } 5860b57cec5SDimitry Andric } 5870b57cec5SDimitry Andric#endif 5880b57cec5SDimitry Andric __is.setstate(__state); 5890b57cec5SDimitry Andric } 5900b57cec5SDimitry Andric return __is; 5910b57cec5SDimitry Andric} 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andrictemplate <class _Traits> 594cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 595cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, unsigned char& __c) { 5960b57cec5SDimitry Andric return __is >> (char&)__c; 5970b57cec5SDimitry Andric} 5980b57cec5SDimitry Andric 5990b57cec5SDimitry Andrictemplate <class _Traits> 600cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<char, _Traits>& 601cb14a3feSDimitry Andricoperator>>(basic_istream<char, _Traits>& __is, signed char& __c) { 6020b57cec5SDimitry Andric return __is >> (char&)__c; 6030b57cec5SDimitry Andric} 6040b57cec5SDimitry Andric 6050b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 6060b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 607cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb) { 6080b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6090b57cec5SDimitry Andric __gc_ = 0; 6100b57cec5SDimitry Andric sentry __s(*this, true); 611cb14a3feSDimitry Andric if (__s) { 612cb14a3feSDimitry Andric if (__sb) { 61306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 614cb14a3feSDimitry Andric try { 61506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 616cb14a3feSDimitry Andric while (true) { 6170b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 618cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, _Traits::eof())) { 6190b57cec5SDimitry Andric __state |= ios_base::eofbit; 6200b57cec5SDimitry Andric break; 6210b57cec5SDimitry Andric } 622cb14a3feSDimitry Andric if (traits_type::eq_int_type(__sb->sputc(traits_type::to_char_type(__i)), traits_type::eof())) 6230b57cec5SDimitry Andric break; 6245f757f3fSDimitry Andric __inc_gcount(); 6250b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 6260b57cec5SDimitry Andric } 6270b57cec5SDimitry Andric if (__gc_ == 0) 6280b57cec5SDimitry Andric __state |= ios_base::failbit; 62906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 630cb14a3feSDimitry Andric } catch (...) { 6310b57cec5SDimitry Andric __state |= ios_base::badbit; 6320b57cec5SDimitry Andric if (__gc_ == 0) 6330b57cec5SDimitry Andric __state |= ios_base::failbit; 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andric this->__setstate_nothrow(__state); 636cb14a3feSDimitry Andric if (this->exceptions() & ios_base::failbit || this->exceptions() & ios_base::badbit) { 6370b57cec5SDimitry Andric throw; 6380b57cec5SDimitry Andric } 6390b57cec5SDimitry Andric } 64006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 641cb14a3feSDimitry Andric } else { 6420b57cec5SDimitry Andric __state |= ios_base::failbit; 6430b57cec5SDimitry Andric } 6440b57cec5SDimitry Andric this->setstate(__state); 6450b57cec5SDimitry Andric } 6460b57cec5SDimitry Andric return *this; 6470b57cec5SDimitry Andric} 6480b57cec5SDimitry Andric 6490b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 650cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::get() { 6510b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6520b57cec5SDimitry Andric __gc_ = 0; 6530b57cec5SDimitry Andric int_type __r = traits_type::eof(); 6540b57cec5SDimitry Andric sentry __s(*this, true); 655cb14a3feSDimitry Andric if (__s) { 65606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 657cb14a3feSDimitry Andric try { 6580b57cec5SDimitry Andric#endif 6590b57cec5SDimitry Andric __r = this->rdbuf()->sbumpc(); 6600b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 6610b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 6620b57cec5SDimitry Andric else 6630b57cec5SDimitry Andric __gc_ = 1; 66406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 665cb14a3feSDimitry Andric } catch (...) { 6660b57cec5SDimitry Andric this->__setstate_nothrow(this->rdstate() | ios_base::badbit); 667cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 6680b57cec5SDimitry Andric throw; 6690b57cec5SDimitry Andric } 6700b57cec5SDimitry Andric } 6710b57cec5SDimitry Andric#endif 6720b57cec5SDimitry Andric this->setstate(__state); 6730b57cec5SDimitry Andric } 6740b57cec5SDimitry Andric return __r; 6750b57cec5SDimitry Andric} 6760b57cec5SDimitry Andric 6770b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 678cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm) { 6790b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 6800b57cec5SDimitry Andric __gc_ = 0; 6810b57cec5SDimitry Andric sentry __sen(*this, true); 682cb14a3feSDimitry Andric if (__sen) { 683cb14a3feSDimitry Andric if (__n > 0) { 68406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 685cb14a3feSDimitry Andric try { 6860b57cec5SDimitry Andric#endif 687cb14a3feSDimitry Andric while (__gc_ < __n - 1) { 6880b57cec5SDimitry Andric int_type __i = this->rdbuf()->sgetc(); 689cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 6900b57cec5SDimitry Andric __state |= ios_base::eofbit; 6910b57cec5SDimitry Andric break; 6920b57cec5SDimitry Andric } 6930b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 6940b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 6950b57cec5SDimitry Andric break; 6960b57cec5SDimitry Andric *__s++ = __ch; 6975f757f3fSDimitry Andric __inc_gcount(); 6980b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 6990b57cec5SDimitry Andric } 7000b57cec5SDimitry Andric if (__gc_ == 0) 7010b57cec5SDimitry Andric __state |= ios_base::failbit; 70206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 703cb14a3feSDimitry Andric } catch (...) { 7040b57cec5SDimitry Andric __state |= ios_base::badbit; 7050b57cec5SDimitry Andric this->__setstate_nothrow(__state); 706cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 7070b57cec5SDimitry Andric if (__n > 0) 7080b57cec5SDimitry Andric *__s = char_type(); 7090b57cec5SDimitry Andric throw; 7100b57cec5SDimitry Andric } 7110b57cec5SDimitry Andric } 7120b57cec5SDimitry Andric#endif 713cb14a3feSDimitry Andric } else { 7140b57cec5SDimitry Andric __state |= ios_base::failbit; 7150b57cec5SDimitry Andric } 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric if (__n > 0) 7180b57cec5SDimitry Andric *__s = char_type(); 7190b57cec5SDimitry Andric this->setstate(__state); 7200b57cec5SDimitry Andric } 7210b57cec5SDimitry Andric if (__n > 0) 7220b57cec5SDimitry Andric *__s = char_type(); 7230b57cec5SDimitry Andric return *this; 7240b57cec5SDimitry Andric} 7250b57cec5SDimitry Andric 7260b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 7270b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 728cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm) { 7290b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7300b57cec5SDimitry Andric __gc_ = 0; 7310b57cec5SDimitry Andric sentry __sen(*this, true); 732cb14a3feSDimitry Andric if (__sen) { 73306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 734cb14a3feSDimitry Andric try { 73506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 736cb14a3feSDimitry Andric while (true) { 7370b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 738cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 7390b57cec5SDimitry Andric __state |= ios_base::eofbit; 7400b57cec5SDimitry Andric break; 7410b57cec5SDimitry Andric } 7420b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 7430b57cec5SDimitry Andric if (traits_type::eq(__ch, __dlm)) 7440b57cec5SDimitry Andric break; 7450b57cec5SDimitry Andric if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof())) 7460b57cec5SDimitry Andric break; 7475f757f3fSDimitry Andric __inc_gcount(); 7480b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7490b57cec5SDimitry Andric } 75006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 751cb14a3feSDimitry Andric } catch (...) { 7520b57cec5SDimitry Andric __state |= ios_base::badbit; 7530b57cec5SDimitry Andric // according to the spec, exceptions here are caught but not rethrown 7540b57cec5SDimitry Andric } 75506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 7560b57cec5SDimitry Andric if (__gc_ == 0) 7570b57cec5SDimitry Andric __state |= ios_base::failbit; 7580b57cec5SDimitry Andric this->setstate(__state); 7590b57cec5SDimitry Andric } 7600b57cec5SDimitry Andric return *this; 7610b57cec5SDimitry Andric} 7620b57cec5SDimitry Andric 7630b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 7640b57cec5SDimitry Andricbasic_istream<_CharT, _Traits>& 765cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm) { 7660b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 7670b57cec5SDimitry Andric __gc_ = 0; 7680b57cec5SDimitry Andric sentry __sen(*this, true); 769cb14a3feSDimitry Andric if (__sen) { 77006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 771cb14a3feSDimitry Andric try { 77206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 773cb14a3feSDimitry Andric while (true) { 7740b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sgetc(); 775cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 7760b57cec5SDimitry Andric __state |= ios_base::eofbit; 7770b57cec5SDimitry Andric break; 7780b57cec5SDimitry Andric } 7790b57cec5SDimitry Andric char_type __ch = traits_type::to_char_type(__i); 780cb14a3feSDimitry Andric if (traits_type::eq(__ch, __dlm)) { 7810b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7825f757f3fSDimitry Andric __inc_gcount(); 7830b57cec5SDimitry Andric break; 7840b57cec5SDimitry Andric } 785cb14a3feSDimitry Andric if (__gc_ >= __n - 1) { 7860b57cec5SDimitry Andric __state |= ios_base::failbit; 7870b57cec5SDimitry Andric break; 7880b57cec5SDimitry Andric } 7890b57cec5SDimitry Andric *__s++ = __ch; 7900b57cec5SDimitry Andric this->rdbuf()->sbumpc(); 7915f757f3fSDimitry Andric __inc_gcount(); 7920b57cec5SDimitry Andric } 79306c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 794cb14a3feSDimitry Andric } catch (...) { 7950b57cec5SDimitry Andric __state |= ios_base::badbit; 7960b57cec5SDimitry Andric this->__setstate_nothrow(__state); 797cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 7980b57cec5SDimitry Andric if (__n > 0) 7990b57cec5SDimitry Andric *__s = char_type(); 8000b57cec5SDimitry Andric if (__gc_ == 0) 8010b57cec5SDimitry Andric __state |= ios_base::failbit; 8020b57cec5SDimitry Andric throw; 8030b57cec5SDimitry Andric } 8040b57cec5SDimitry Andric } 80506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8060b57cec5SDimitry Andric } 8070b57cec5SDimitry Andric if (__n > 0) 8080b57cec5SDimitry Andric *__s = char_type(); 8090b57cec5SDimitry Andric if (__gc_ == 0) 8100b57cec5SDimitry Andric __state |= ios_base::failbit; 8110b57cec5SDimitry Andric this->setstate(__state); 8120b57cec5SDimitry Andric return *this; 8130b57cec5SDimitry Andric} 8140b57cec5SDimitry Andric 8150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 816cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm) { 8170b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8180b57cec5SDimitry Andric __gc_ = 0; 8190b57cec5SDimitry Andric sentry __sen(*this, true); 820cb14a3feSDimitry Andric if (__sen) { 82106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 822cb14a3feSDimitry Andric try { 82306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 824cb14a3feSDimitry Andric if (__n == numeric_limits<streamsize>::max()) { 825cb14a3feSDimitry Andric while (true) { 8260b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 827cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 8280b57cec5SDimitry Andric __state |= ios_base::eofbit; 8290b57cec5SDimitry Andric break; 8300b57cec5SDimitry Andric } 8315f757f3fSDimitry Andric __inc_gcount(); 8320b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 8330b57cec5SDimitry Andric break; 8340b57cec5SDimitry Andric } 835cb14a3feSDimitry Andric } else { 836cb14a3feSDimitry Andric while (__gc_ < __n) { 8370b57cec5SDimitry Andric typename traits_type::int_type __i = this->rdbuf()->sbumpc(); 838cb14a3feSDimitry Andric if (traits_type::eq_int_type(__i, traits_type::eof())) { 8390b57cec5SDimitry Andric __state |= ios_base::eofbit; 8400b57cec5SDimitry Andric break; 8410b57cec5SDimitry Andric } 8425f757f3fSDimitry Andric __inc_gcount(); 8430b57cec5SDimitry Andric if (traits_type::eq_int_type(__i, __dlm)) 8440b57cec5SDimitry Andric break; 8450b57cec5SDimitry Andric } 8460b57cec5SDimitry Andric } 84706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 848cb14a3feSDimitry Andric } catch (...) { 8490b57cec5SDimitry Andric __state |= ios_base::badbit; 8500b57cec5SDimitry Andric this->__setstate_nothrow(__state); 851cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 8520b57cec5SDimitry Andric throw; 8530b57cec5SDimitry Andric } 8540b57cec5SDimitry Andric } 85506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8560b57cec5SDimitry Andric this->setstate(__state); 8570b57cec5SDimitry Andric } 8580b57cec5SDimitry Andric return *this; 8590b57cec5SDimitry Andric} 8600b57cec5SDimitry Andric 8610b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 862cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::int_type basic_istream<_CharT, _Traits>::peek() { 8630b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8640b57cec5SDimitry Andric __gc_ = 0; 8650b57cec5SDimitry Andric int_type __r = traits_type::eof(); 8660b57cec5SDimitry Andric sentry __sen(*this, true); 867cb14a3feSDimitry Andric if (__sen) { 86806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 869cb14a3feSDimitry Andric try { 87006c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8710b57cec5SDimitry Andric __r = this->rdbuf()->sgetc(); 8720b57cec5SDimitry Andric if (traits_type::eq_int_type(__r, traits_type::eof())) 8730b57cec5SDimitry Andric __state |= ios_base::eofbit; 87406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 875cb14a3feSDimitry Andric } catch (...) { 8760b57cec5SDimitry Andric __state |= ios_base::badbit; 8770b57cec5SDimitry Andric this->__setstate_nothrow(__state); 878cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 8790b57cec5SDimitry Andric throw; 8800b57cec5SDimitry Andric } 8810b57cec5SDimitry Andric } 88206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8830b57cec5SDimitry Andric this->setstate(__state); 8840b57cec5SDimitry Andric } 8850b57cec5SDimitry Andric return __r; 8860b57cec5SDimitry Andric} 8870b57cec5SDimitry Andric 8880b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 889cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n) { 8900b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 8910b57cec5SDimitry Andric __gc_ = 0; 8920b57cec5SDimitry Andric sentry __sen(*this, true); 893cb14a3feSDimitry Andric if (__sen) { 89406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 895cb14a3feSDimitry Andric try { 89606c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 8970b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 8980b57cec5SDimitry Andric if (__gc_ != __n) 8990b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 90006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 901cb14a3feSDimitry Andric } catch (...) { 9020b57cec5SDimitry Andric __state |= ios_base::badbit; 9030b57cec5SDimitry Andric this->__setstate_nothrow(__state); 904cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9050b57cec5SDimitry Andric throw; 9060b57cec5SDimitry Andric } 9070b57cec5SDimitry Andric } 90806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 909cb14a3feSDimitry Andric } else { 9100b57cec5SDimitry Andric __state |= ios_base::failbit; 9110b57cec5SDimitry Andric } 9120b57cec5SDimitry Andric this->setstate(__state); 9130b57cec5SDimitry Andric return *this; 9140b57cec5SDimitry Andric} 9150b57cec5SDimitry Andric 9160b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 917cb14a3feSDimitry Andricstreamsize basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n) { 9180b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 9190b57cec5SDimitry Andric __gc_ = 0; 9200b57cec5SDimitry Andric sentry __sen(*this, true); 921cb14a3feSDimitry Andric if (__sen) { 92206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 923cb14a3feSDimitry Andric try { 92406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 9250b57cec5SDimitry Andric streamsize __c = this->rdbuf()->in_avail(); 926cb14a3feSDimitry Andric switch (__c) { 9270b57cec5SDimitry Andric case -1: 9280b57cec5SDimitry Andric __state |= ios_base::eofbit; 9290b57cec5SDimitry Andric break; 9300b57cec5SDimitry Andric case 0: 9310b57cec5SDimitry Andric break; 9320b57cec5SDimitry Andric default: 9335f757f3fSDimitry Andric __n = std::min(__c, __n); 9340b57cec5SDimitry Andric __gc_ = this->rdbuf()->sgetn(__s, __n); 9350b57cec5SDimitry Andric if (__gc_ != __n) 9360b57cec5SDimitry Andric __state |= ios_base::failbit | ios_base::eofbit; 9370b57cec5SDimitry Andric break; 9380b57cec5SDimitry Andric } 93906c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 940cb14a3feSDimitry Andric } catch (...) { 9410b57cec5SDimitry Andric __state |= ios_base::badbit; 9420b57cec5SDimitry Andric this->__setstate_nothrow(__state); 943cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9440b57cec5SDimitry Andric throw; 9450b57cec5SDimitry Andric } 9460b57cec5SDimitry Andric } 94706c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 948cb14a3feSDimitry Andric } else { 9490b57cec5SDimitry Andric __state |= ios_base::failbit; 9500b57cec5SDimitry Andric } 9510b57cec5SDimitry Andric this->setstate(__state); 9520b57cec5SDimitry Andric return __gc_; 9530b57cec5SDimitry Andric} 9540b57cec5SDimitry Andric 9550b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 956cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::putback(char_type __c) { 9570b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 9580b57cec5SDimitry Andric __gc_ = 0; 9590b57cec5SDimitry Andric this->clear(__state); 9600b57cec5SDimitry Andric sentry __sen(*this, true); 961cb14a3feSDimitry Andric if (__sen) { 96206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 963cb14a3feSDimitry Andric try { 96406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 965e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sputbackc(__c) == traits_type::eof()) 9660b57cec5SDimitry Andric __state |= ios_base::badbit; 96706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 968cb14a3feSDimitry Andric } catch (...) { 9690b57cec5SDimitry Andric __state |= ios_base::badbit; 9700b57cec5SDimitry Andric this->__setstate_nothrow(__state); 971cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 9720b57cec5SDimitry Andric throw; 9730b57cec5SDimitry Andric } 9740b57cec5SDimitry Andric } 97506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 976cb14a3feSDimitry Andric } else { 9770b57cec5SDimitry Andric __state |= ios_base::failbit; 9780b57cec5SDimitry Andric } 9790b57cec5SDimitry Andric this->setstate(__state); 9800b57cec5SDimitry Andric return *this; 9810b57cec5SDimitry Andric} 9820b57cec5SDimitry Andric 9830b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 984cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() { 9850b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 9860b57cec5SDimitry Andric __gc_ = 0; 9870b57cec5SDimitry Andric this->clear(__state); 9880b57cec5SDimitry Andric sentry __sen(*this, true); 989cb14a3feSDimitry Andric if (__sen) { 99006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 991cb14a3feSDimitry Andric try { 99206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 993e8d8bef9SDimitry Andric if (this->rdbuf() == nullptr || this->rdbuf()->sungetc() == traits_type::eof()) 9940b57cec5SDimitry Andric __state |= ios_base::badbit; 99506c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 996cb14a3feSDimitry Andric } catch (...) { 9970b57cec5SDimitry Andric __state |= ios_base::badbit; 9980b57cec5SDimitry Andric this->__setstate_nothrow(__state); 999cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10000b57cec5SDimitry Andric throw; 10010b57cec5SDimitry Andric } 10020b57cec5SDimitry Andric } 100306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1004cb14a3feSDimitry Andric } else { 10050b57cec5SDimitry Andric __state |= ios_base::failbit; 10060b57cec5SDimitry Andric } 10070b57cec5SDimitry Andric this->setstate(__state); 10080b57cec5SDimitry Andric return *this; 10090b57cec5SDimitry Andric} 10100b57cec5SDimitry Andric 10110b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1012cb14a3feSDimitry Andricint basic_istream<_CharT, _Traits>::sync() { 10130b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10140b57cec5SDimitry Andric sentry __sen(*this, true); 1015*0fca6ea1SDimitry Andric if (this->rdbuf() == nullptr) 1016*0fca6ea1SDimitry Andric return -1; 1017*0fca6ea1SDimitry Andric 1018*0fca6ea1SDimitry Andric int __r = 0; 1019cb14a3feSDimitry Andric if (__sen) { 102006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1021cb14a3feSDimitry Andric try { 102206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1023cb14a3feSDimitry Andric if (this->rdbuf()->pubsync() == -1) { 10240b57cec5SDimitry Andric __state |= ios_base::badbit; 1025*0fca6ea1SDimitry Andric __r = -1; 10260b57cec5SDimitry Andric } 102706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1028cb14a3feSDimitry Andric } catch (...) { 10290b57cec5SDimitry Andric __state |= ios_base::badbit; 10300b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1031cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10320b57cec5SDimitry Andric throw; 10330b57cec5SDimitry Andric } 10340b57cec5SDimitry Andric } 103506c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10360b57cec5SDimitry Andric this->setstate(__state); 10370b57cec5SDimitry Andric } 10380b57cec5SDimitry Andric return __r; 10390b57cec5SDimitry Andric} 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1042cb14a3feSDimitry Andrictypename basic_istream<_CharT, _Traits>::pos_type basic_istream<_CharT, _Traits>::tellg() { 10430b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 10440b57cec5SDimitry Andric pos_type __r(-1); 10450b57cec5SDimitry Andric sentry __sen(*this, true); 1046cb14a3feSDimitry Andric if (__sen) { 104706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1048cb14a3feSDimitry Andric try { 104906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10500b57cec5SDimitry Andric __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in); 105106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1052cb14a3feSDimitry Andric } catch (...) { 10530b57cec5SDimitry Andric __state |= ios_base::badbit; 10540b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1055cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10560b57cec5SDimitry Andric throw; 10570b57cec5SDimitry Andric } 10580b57cec5SDimitry Andric } 105906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10600b57cec5SDimitry Andric this->setstate(__state); 10610b57cec5SDimitry Andric } 10620b57cec5SDimitry Andric return __r; 10630b57cec5SDimitry Andric} 10640b57cec5SDimitry Andric 10650b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1066cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(pos_type __pos) { 10670b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 10680b57cec5SDimitry Andric this->clear(__state); 10690b57cec5SDimitry Andric sentry __sen(*this, true); 1070cb14a3feSDimitry Andric if (__sen) { 107106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1072cb14a3feSDimitry Andric try { 107306c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10740b57cec5SDimitry Andric if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1)) 10750b57cec5SDimitry Andric __state |= ios_base::failbit; 107606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1077cb14a3feSDimitry Andric } catch (...) { 10780b57cec5SDimitry Andric __state |= ios_base::badbit; 10790b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1080cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 10810b57cec5SDimitry Andric throw; 10820b57cec5SDimitry Andric } 10830b57cec5SDimitry Andric } 108406c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10850b57cec5SDimitry Andric this->setstate(__state); 10860b57cec5SDimitry Andric } 10870b57cec5SDimitry Andric return *this; 10880b57cec5SDimitry Andric} 10890b57cec5SDimitry Andric 10900b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1091cb14a3feSDimitry Andricbasic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir) { 10920b57cec5SDimitry Andric ios_base::iostate __state = this->rdstate() & ~ios_base::eofbit; 10930b57cec5SDimitry Andric this->clear(__state); 10940b57cec5SDimitry Andric sentry __sen(*this, true); 1095cb14a3feSDimitry Andric if (__sen) { 109606c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1097cb14a3feSDimitry Andric try { 109806c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 10990b57cec5SDimitry Andric if (this->rdbuf()->pubseekoff(__off, __dir, ios_base::in) == pos_type(-1)) 11000b57cec5SDimitry Andric __state |= ios_base::failbit; 110106c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1102cb14a3feSDimitry Andric } catch (...) { 11030b57cec5SDimitry Andric __state |= ios_base::badbit; 11040b57cec5SDimitry Andric this->__setstate_nothrow(__state); 1105cb14a3feSDimitry Andric if (this->exceptions() & ios_base::badbit) { 11060b57cec5SDimitry Andric throw; 11070b57cec5SDimitry Andric } 11080b57cec5SDimitry Andric } 110906c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11100b57cec5SDimitry Andric this->setstate(__state); 11110b57cec5SDimitry Andric } 11120b57cec5SDimitry Andric return *this; 11130b57cec5SDimitry Andric} 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1116cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& ws(basic_istream<_CharT, _Traits>& __is) { 11170b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 11180b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 1119cb14a3feSDimitry Andric if (__sen) { 112006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1121cb14a3feSDimitry Andric try { 112206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 1123bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 1124cb14a3feSDimitry Andric while (true) { 11250b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1126cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 11270b57cec5SDimitry Andric __state |= ios_base::eofbit; 11280b57cec5SDimitry Andric break; 11290b57cec5SDimitry Andric } 11300b57cec5SDimitry Andric if (!__ct.is(__ct.space, _Traits::to_char_type(__i))) 11310b57cec5SDimitry Andric break; 11320b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 11330b57cec5SDimitry Andric } 113406c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1135cb14a3feSDimitry Andric } catch (...) { 11360b57cec5SDimitry Andric __state |= ios_base::badbit; 11370b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1138cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 11390b57cec5SDimitry Andric throw; 11400b57cec5SDimitry Andric } 11410b57cec5SDimitry Andric } 114206c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS 11430b57cec5SDimitry Andric __is.setstate(__state); 11440b57cec5SDimitry Andric } 11450b57cec5SDimitry Andric return __is; 11460b57cec5SDimitry Andric} 11470b57cec5SDimitry Andric 1148e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp, class = void> 1149e8d8bef9SDimitry Andricstruct __is_istreamable : false_type {}; 1150e8d8bef9SDimitry Andric 1151e8d8bef9SDimitry Andrictemplate <class _Stream, class _Tp> 1152cb14a3feSDimitry Andricstruct __is_istreamable<_Stream, _Tp, decltype(std::declval<_Stream>() >> std::declval<_Tp>(), void())> : true_type {}; 1153e8d8bef9SDimitry Andric 1154cb14a3feSDimitry Andrictemplate <class _Stream, 1155cb14a3feSDimitry Andric class _Tp, 1156cb14a3feSDimitry Andric __enable_if_t< _And<is_base_of<ios_base, _Stream>, __is_istreamable<_Stream&, _Tp&&> >::value, int> = 0> 1157cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Stream&& operator>>(_Stream&& __is, _Tp&& __x) { 11585f757f3fSDimitry Andric __is >> std::forward<_Tp>(__x); 11595f757f3fSDimitry Andric return std::move(__is); 11600b57cec5SDimitry Andric} 11610b57cec5SDimitry Andric 11620b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 11630b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS basic_iostream 11640b57cec5SDimitry Andric : public basic_istream<_CharT, _Traits>, 1165cb14a3feSDimitry Andric public basic_ostream<_CharT, _Traits> { 11660b57cec5SDimitry Andricpublic: 11670b57cec5SDimitry Andric // types: 11680b57cec5SDimitry Andric typedef _CharT char_type; 11690b57cec5SDimitry Andric typedef _Traits traits_type; 11700b57cec5SDimitry Andric typedef typename traits_type::int_type int_type; 11710b57cec5SDimitry Andric typedef typename traits_type::pos_type pos_type; 11720b57cec5SDimitry Andric typedef typename traits_type::off_type off_type; 11730b57cec5SDimitry Andric 11740b57cec5SDimitry Andric // constructor/destructor 1175cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb) 1176cb14a3feSDimitry Andric : basic_istream<_CharT, _Traits>(__sb) {} 11770b57cec5SDimitry Andric 1178bdd1243dSDimitry Andric ~basic_iostream() override; 1179cb14a3feSDimitry Andric 11800b57cec5SDimitry Andricprotected: 1181cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_iostream(basic_iostream&& __rhs); 11820b57cec5SDimitry Andric 11830b57cec5SDimitry Andric // assign/swap 1184cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI basic_iostream& operator=(basic_iostream&& __rhs); 1185fe6060f1SDimitry Andric 1186cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 void swap(basic_iostream& __rhs) { 1187cb14a3feSDimitry Andric basic_istream<char_type, traits_type>::swap(__rhs); 1188cb14a3feSDimitry Andric } 11890b57cec5SDimitry Andric}; 11900b57cec5SDimitry Andric 11910b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 11920b57cec5SDimitry Andricbasic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs) 1193cb14a3feSDimitry Andric : basic_istream<_CharT, _Traits>(std::move(__rhs)) {} 11940b57cec5SDimitry Andric 11950b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1196cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>& basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs) { 11970b57cec5SDimitry Andric swap(__rhs); 11980b57cec5SDimitry Andric return *this; 11990b57cec5SDimitry Andric} 12000b57cec5SDimitry Andric 12010b57cec5SDimitry Andrictemplate <class _CharT, class _Traits> 1202cb14a3feSDimitry Andricbasic_iostream<_CharT, _Traits>::~basic_iostream() {} 12030b57cec5SDimitry Andric 12040b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1205bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1206cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 12070b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12080b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 1209cb14a3feSDimitry Andric if (__sen) { 121006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1211cb14a3feSDimitry Andric try { 12120b57cec5SDimitry Andric#endif 12130b57cec5SDimitry Andric __str.clear(); 12140b57cec5SDimitry Andric streamsize __n = __is.width(); 12150b57cec5SDimitry Andric if (__n <= 0) 12160b57cec5SDimitry Andric __n = __str.max_size(); 12170b57cec5SDimitry Andric if (__n <= 0) 12180b57cec5SDimitry Andric __n = numeric_limits<streamsize>::max(); 12190b57cec5SDimitry Andric streamsize __c = 0; 1220bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 1221cb14a3feSDimitry Andric while (__c < __n) { 12220b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1223cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 12240b57cec5SDimitry Andric __state |= ios_base::eofbit; 12250b57cec5SDimitry Andric break; 12260b57cec5SDimitry Andric } 12270b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 12280b57cec5SDimitry Andric if (__ct.is(__ct.space, __ch)) 12290b57cec5SDimitry Andric break; 12300b57cec5SDimitry Andric __str.push_back(__ch); 12310b57cec5SDimitry Andric ++__c; 12320b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 12330b57cec5SDimitry Andric } 12340b57cec5SDimitry Andric __is.width(0); 12350b57cec5SDimitry Andric if (__c == 0) 12360b57cec5SDimitry Andric __state |= ios_base::failbit; 123706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1238cb14a3feSDimitry Andric } catch (...) { 12390b57cec5SDimitry Andric __state |= ios_base::badbit; 12400b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1241cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 12420b57cec5SDimitry Andric throw; 12430b57cec5SDimitry Andric } 12440b57cec5SDimitry Andric } 12450b57cec5SDimitry Andric#endif 12460b57cec5SDimitry Andric __is.setstate(__state); 12470b57cec5SDimitry Andric } 12480b57cec5SDimitry Andric return __is; 12490b57cec5SDimitry Andric} 12500b57cec5SDimitry Andric 12510b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1252bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1253cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) { 12540b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 12550b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true); 1256cb14a3feSDimitry Andric if (__sen) { 125706c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1258cb14a3feSDimitry Andric try { 12590b57cec5SDimitry Andric#endif 12600b57cec5SDimitry Andric __str.clear(); 12610b57cec5SDimitry Andric streamsize __extr = 0; 1262cb14a3feSDimitry Andric while (true) { 12630b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sbumpc(); 1264cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 12650b57cec5SDimitry Andric __state |= ios_base::eofbit; 12660b57cec5SDimitry Andric break; 12670b57cec5SDimitry Andric } 12680b57cec5SDimitry Andric ++__extr; 12690b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 12700b57cec5SDimitry Andric if (_Traits::eq(__ch, __dlm)) 12710b57cec5SDimitry Andric break; 12720b57cec5SDimitry Andric __str.push_back(__ch); 1273cb14a3feSDimitry Andric if (__str.size() == __str.max_size()) { 12740b57cec5SDimitry Andric __state |= ios_base::failbit; 12750b57cec5SDimitry Andric break; 12760b57cec5SDimitry Andric } 12770b57cec5SDimitry Andric } 12780b57cec5SDimitry Andric if (__extr == 0) 12790b57cec5SDimitry Andric __state |= ios_base::failbit; 128006c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1281cb14a3feSDimitry Andric } catch (...) { 12820b57cec5SDimitry Andric __state |= ios_base::badbit; 12830b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1284cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 12850b57cec5SDimitry Andric throw; 12860b57cec5SDimitry Andric } 12870b57cec5SDimitry Andric } 12880b57cec5SDimitry Andric#endif 12890b57cec5SDimitry Andric __is.setstate(__state); 12900b57cec5SDimitry Andric } 12910b57cec5SDimitry Andric return __is; 12920b57cec5SDimitry Andric} 12930b57cec5SDimitry Andric 12940b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1295cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1296cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 1297bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 12980b57cec5SDimitry Andric} 12990b57cec5SDimitry Andric 13000b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1301cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1302cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm) { 1303bdd1243dSDimitry Andric return std::getline(__is, __str, __dlm); 13040b57cec5SDimitry Andric} 13050b57cec5SDimitry Andric 13060b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, class _Allocator> 1307cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1308cb14a3feSDimitry Andricgetline(basic_istream<_CharT, _Traits>&& __is, basic_string<_CharT, _Traits, _Allocator>& __str) { 1309bdd1243dSDimitry Andric return std::getline(__is, __str, __is.widen('\n')); 13100b57cec5SDimitry Andric} 13110b57cec5SDimitry Andric 13120b57cec5SDimitry Andrictemplate <class _CharT, class _Traits, size_t _Size> 1313bdd1243dSDimitry Andric_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>& 1314cb14a3feSDimitry Andricoperator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) { 13150b57cec5SDimitry Andric ios_base::iostate __state = ios_base::goodbit; 13160b57cec5SDimitry Andric typename basic_istream<_CharT, _Traits>::sentry __sen(__is); 1317cb14a3feSDimitry Andric if (__sen) { 131806c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1319cb14a3feSDimitry Andric try { 13200b57cec5SDimitry Andric#endif 13210b57cec5SDimitry Andric basic_string<_CharT, _Traits> __str; 1322bdd1243dSDimitry Andric const ctype<_CharT>& __ct = std::use_facet<ctype<_CharT> >(__is.getloc()); 13230b57cec5SDimitry Andric size_t __c = 0; 13240b57cec5SDimitry Andric _CharT __zero = __ct.widen('0'); 13250b57cec5SDimitry Andric _CharT __one = __ct.widen('1'); 1326cb14a3feSDimitry Andric while (__c != _Size) { 13270b57cec5SDimitry Andric typename _Traits::int_type __i = __is.rdbuf()->sgetc(); 1328cb14a3feSDimitry Andric if (_Traits::eq_int_type(__i, _Traits::eof())) { 13290b57cec5SDimitry Andric __state |= ios_base::eofbit; 13300b57cec5SDimitry Andric break; 13310b57cec5SDimitry Andric } 13320b57cec5SDimitry Andric _CharT __ch = _Traits::to_char_type(__i); 13330b57cec5SDimitry Andric if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one)) 13340b57cec5SDimitry Andric break; 13350b57cec5SDimitry Andric __str.push_back(__ch); 13360b57cec5SDimitry Andric ++__c; 13370b57cec5SDimitry Andric __is.rdbuf()->sbumpc(); 13380b57cec5SDimitry Andric } 13390b57cec5SDimitry Andric __x = bitset<_Size>(__str); 1340e40139ffSDimitry Andric if (_Size > 0 && __c == 0) 13410b57cec5SDimitry Andric __state |= ios_base::failbit; 134206c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS 1343cb14a3feSDimitry Andric } catch (...) { 13440b57cec5SDimitry Andric __state |= ios_base::badbit; 13450b57cec5SDimitry Andric __is.__setstate_nothrow(__state); 1346cb14a3feSDimitry Andric if (__is.exceptions() & ios_base::badbit) { 13470b57cec5SDimitry Andric throw; 13480b57cec5SDimitry Andric } 13490b57cec5SDimitry Andric } 13500b57cec5SDimitry Andric#endif 13510b57cec5SDimitry Andric __is.setstate(__state); 13520b57cec5SDimitry Andric } 13530b57cec5SDimitry Andric return __is; 13540b57cec5SDimitry Andric} 13550b57cec5SDimitry Andric 135681ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>; 1357349cc55cSDimitry Andric#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 135881ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>; 1359349cc55cSDimitry Andric#endif 136081ad6265SDimitry Andricextern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>; 13610b57cec5SDimitry Andric 13620b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD 13630b57cec5SDimitry Andric 1364bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 1365bdd1243dSDimitry Andric# include <concepts> 13665f757f3fSDimitry Andric# include <iosfwd> 1367*0fca6ea1SDimitry Andric# include <ostream> 1368bdd1243dSDimitry Andric# include <type_traits> 1369bdd1243dSDimitry Andric#endif 1370bdd1243dSDimitry Andric 13710b57cec5SDimitry Andric_LIBCPP_POP_MACROS 13720b57cec5SDimitry Andric 13730b57cec5SDimitry Andric#endif // _LIBCPP_ISTREAM 1374