• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// -*- C++ -*-
2//===--------------------------- istream ----------------------------------===//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_ISTREAM
12#define _LIBCPP_ISTREAM
13
14/*
15    istream synopsis
16
17template <class charT, class traits = char_traits<charT> >
18class basic_istream
19    : virtual public basic_ios<charT,traits>
20{
21public:
22    // types (inherited from basic_ios (27.5.4)):
23    typedef charT                          char_type;
24    typedef traits                         traits_type;
25    typedef typename traits_type::int_type int_type;
26    typedef typename traits_type::pos_type pos_type;
27    typedef typename traits_type::off_type off_type;
28
29    // 27.7.1.1.1 Constructor/destructor:
30    explicit basic_istream(basic_streambuf<char_type, traits_type>* sb);
31    basic_istream(basic_istream&& rhs);
32    virtual ~basic_istream();
33
34    // 27.7.1.1.2 Assign/swap:
35    basic_istream& operator=(basic_istream&& rhs);
36    void swap(basic_istream& rhs);
37
38    // 27.7.1.1.3 Prefix/suffix:
39    class sentry;
40
41    // 27.7.1.2 Formatted input:
42    basic_istream& operator>>(basic_istream& (*pf)(basic_istream&));
43    basic_istream& operator>>(basic_ios<char_type, traits_type>&
44                              (*pf)(basic_ios<char_type, traits_type>&));
45    basic_istream& operator>>(ios_base& (*pf)(ios_base&));
46    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* sb);
47    basic_istream& operator>>(bool& n);
48    basic_istream& operator>>(short& n);
49    basic_istream& operator>>(unsigned short& n);
50    basic_istream& operator>>(int& n);
51    basic_istream& operator>>(unsigned int& n);
52    basic_istream& operator>>(long& n);
53    basic_istream& operator>>(unsigned long& n);
54    basic_istream& operator>>(long long& n);
55    basic_istream& operator>>(unsigned long long& n);
56    basic_istream& operator>>(float& f);
57    basic_istream& operator>>(double& f);
58    basic_istream& operator>>(long double& f);
59    basic_istream& operator>>(void*& p);
60
61    // 27.7.1.3 Unformatted input:
62    streamsize gcount() const;
63    int_type get();
64    basic_istream& get(char_type& c);
65    basic_istream& get(char_type* s, streamsize n);
66    basic_istream& get(char_type* s, streamsize n, char_type delim);
67    basic_istream& get(basic_streambuf<char_type,traits_type>& sb);
68    basic_istream& get(basic_streambuf<char_type,traits_type>& sb, char_type delim);
69
70    basic_istream& getline(char_type* s, streamsize n);
71    basic_istream& getline(char_type* s, streamsize n, char_type delim);
72
73    basic_istream& ignore(streamsize n = 1, int_type delim = traits_type::eof());
74    int_type peek();
75    basic_istream& read (char_type* s, streamsize n);
76    streamsize readsome(char_type* s, streamsize n);
77
78    basic_istream& putback(char_type c);
79    basic_istream& unget();
80    int sync();
81
82    pos_type tellg();
83    basic_istream& seekg(pos_type);
84    basic_istream& seekg(off_type, ios_base::seekdir);
85};
86
87// 27.7.1.2.3 character extraction templates:
88template<class charT, class traits>
89  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT&);
90
91template<class traits>
92  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char&);
93
94template<class traits>
95  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char&);
96
97template<class charT, class traits>
98  basic_istream<charT,traits>& operator>>(basic_istream<charT,traits>&, charT*);
99
100template<class traits>
101  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, unsigned char*);
102
103template<class traits>
104  basic_istream<char,traits>& operator>>(basic_istream<char,traits>&, signed char*);
105
106template <class charT, class traits>
107  void
108  swap(basic_istream<charT, traits>& x, basic_istream<charT, traits>& y);
109
110typedef basic_istream<char> istream;
111typedef basic_istream<wchar_t> wistream;
112
113template <class charT, class traits = char_traits<charT> >
114class basic_iostream :
115    public basic_istream<charT,traits>,
116    public basic_ostream<charT,traits>
117{
118public:
119    // types:
120    typedef charT                          char_type;
121    typedef traits                         traits_type;
122    typedef typename traits_type::int_type int_type;
123    typedef typename traits_type::pos_type pos_type;
124    typedef typename traits_type::off_type off_type;
125
126    // constructor/destructor
127    explicit basic_iostream(basic_streambuf<char_type, traits_type>* sb);
128    basic_iostream(basic_iostream&& rhs);
129    virtual ~basic_iostream();
130
131    // assign/swap
132    basic_iostream& operator=(basic_iostream&& rhs);
133    void swap(basic_iostream& rhs);
134};
135
136template <class charT, class traits>
137  void
138  swap(basic_iostream<charT, traits>& x, basic_iostream<charT, traits>& y);
139
140typedef basic_iostream<char> iostream;
141typedef basic_iostream<wchar_t> wiostream;
142
143template <class charT, class traits>
144  basic_istream<charT,traits>&
145  ws(basic_istream<charT,traits>& is);
146
147template <class charT, class traits, class T>
148  basic_istream<charT, traits>&
149  operator>>(basic_istream<charT, traits>&& is, T& x);
150
151}  // std
152
153*/
154
155#include <__config>
156#include <ostream>
157
158#include <__undef_min_max>
159
160#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
161#pragma GCC system_header
162#endif
163
164_LIBCPP_BEGIN_NAMESPACE_STD
165
166template <class _CharT, class _Traits>
167class _LIBCPP_VISIBLE basic_istream
168    : virtual public basic_ios<_CharT, _Traits>
169{
170    streamsize __gc_;
171public:
172    // types (inherited from basic_ios (27.5.4)):
173    typedef _CharT                         char_type;
174    typedef _Traits                        traits_type;
175    typedef typename traits_type::int_type int_type;
176    typedef typename traits_type::pos_type pos_type;
177    typedef typename traits_type::off_type off_type;
178
179    // 27.7.1.1.1 Constructor/destructor:
180    explicit basic_istream(basic_streambuf<char_type, traits_type>* __sb);
181    virtual ~basic_istream();
182protected:
183#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
184    _LIBCPP_INLINE_VISIBILITY
185    basic_istream(basic_istream&& __rhs);
186#endif
187
188    // 27.7.1.1.2 Assign/swap:
189#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
190    _LIBCPP_INLINE_VISIBILITY
191    basic_istream& operator=(basic_istream&& __rhs);
192#endif
193    void swap(basic_istream& __rhs);
194public:
195
196    // 27.7.1.1.3 Prefix/suffix:
197    class _LIBCPP_VISIBLE sentry;
198
199    // 27.7.1.2 Formatted input:
200    basic_istream& operator>>(basic_istream& (*__pf)(basic_istream&));
201    basic_istream& operator>>(basic_ios<char_type, traits_type>&
202                              (*__pf)(basic_ios<char_type, traits_type>&));
203    basic_istream& operator>>(ios_base& (*__pf)(ios_base&));
204    basic_istream& operator>>(basic_streambuf<char_type, traits_type>* __sb);
205    basic_istream& operator>>(bool& __n);
206    basic_istream& operator>>(short& __n);
207    basic_istream& operator>>(unsigned short& __n);
208    basic_istream& operator>>(int& __n);
209    basic_istream& operator>>(unsigned int& __n);
210    basic_istream& operator>>(long& __n);
211    basic_istream& operator>>(unsigned long& __n);
212    basic_istream& operator>>(long long& __n);
213    basic_istream& operator>>(unsigned long long& __n);
214    basic_istream& operator>>(float& __f);
215    basic_istream& operator>>(double& __f);
216    basic_istream& operator>>(long double& __f);
217    basic_istream& operator>>(void*& __p);
218
219    // 27.7.1.3 Unformatted input:
220    _LIBCPP_INLINE_VISIBILITY
221    streamsize gcount() const {return __gc_;}
222    int_type get();
223    basic_istream& get(char_type& __c);
224    basic_istream& get(char_type* __s, streamsize __n);
225    basic_istream& get(char_type* __s, streamsize __n, char_type __dlm);
226    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb);
227    basic_istream& get(basic_streambuf<char_type, traits_type>& __sb, char_type __dlm);
228
229    basic_istream& getline(char_type* __s, streamsize __n);
230    basic_istream& getline(char_type* __s, streamsize __n, char_type __dlm);
231
232    basic_istream& ignore(streamsize __n = 1, int_type __dlm = traits_type::eof());
233    int_type peek();
234    basic_istream& read (char_type* __s, streamsize __n);
235    streamsize readsome(char_type* __s, streamsize __n);
236
237    basic_istream& putback(char_type __c);
238    basic_istream& unget();
239    int sync();
240
241    pos_type tellg();
242    basic_istream& seekg(pos_type __pos);
243    basic_istream& seekg(off_type __off, ios_base::seekdir __dir);
244};
245
246template <class _CharT, class _Traits>
247class _LIBCPP_VISIBLE basic_istream<_CharT, _Traits>::sentry
248{
249    bool __ok_;
250
251    sentry(const sentry&); // = delete;
252    sentry& operator=(const sentry&); // = delete;
253
254public:
255    explicit sentry(basic_istream<_CharT, _Traits>& __is, bool __noskipws = false);
256//    ~sentry() = default;
257
258    _LIBCPP_INLINE_VISIBILITY
259        _LIBCPP_EXPLICIT
260        operator bool() const {return __ok_;}
261};
262
263template <class _CharT, class _Traits>
264basic_istream<_CharT, _Traits>::sentry::sentry(basic_istream<_CharT, _Traits>& __is,
265                                               bool __noskipws)
266    : __ok_(false)
267{
268    if (__is.good())
269    {
270        if (__is.tie())
271            __is.tie()->flush();
272        if (!__noskipws && (__is.flags() & ios_base::skipws))
273        {
274            typedef istreambuf_iterator<_CharT, _Traits> _Ip;
275            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
276            _Ip __i(__is);
277            _Ip __eof;
278            for (; __i != __eof; ++__i)
279                if (!__ct.is(__ct.space, *__i))
280                    break;
281            if (__i == __eof)
282                __is.setstate(ios_base::failbit | ios_base::eofbit);
283        }
284        __ok_ = __is.good();
285    }
286    else
287        __is.setstate(ios_base::failbit);
288}
289
290template <class _CharT, class _Traits>
291inline _LIBCPP_INLINE_VISIBILITY
292basic_istream<_CharT, _Traits>::basic_istream(basic_streambuf<char_type, traits_type>* __sb)
293    : __gc_(0)
294{
295    this->init(__sb);
296}
297
298#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
299
300template <class _CharT, class _Traits>
301inline _LIBCPP_INLINE_VISIBILITY
302basic_istream<_CharT, _Traits>::basic_istream(basic_istream&& __rhs)
303    : __gc_(__rhs.__gc_)
304{
305    __rhs.__gc_ = 0;
306    this->move(__rhs);
307}
308
309template <class _CharT, class _Traits>
310inline _LIBCPP_INLINE_VISIBILITY
311basic_istream<_CharT, _Traits>&
312basic_istream<_CharT, _Traits>::operator=(basic_istream&& __rhs)
313{
314    swap(__rhs);
315    return *this;
316}
317
318#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
319
320template <class _CharT, class _Traits>
321basic_istream<_CharT, _Traits>::~basic_istream()
322{
323}
324
325template <class _CharT, class _Traits>
326inline _LIBCPP_INLINE_VISIBILITY
327void
328basic_istream<_CharT, _Traits>::swap(basic_istream& __rhs)
329{
330    _VSTD::swap(__gc_, __rhs.__gc_);
331    basic_ios<char_type, traits_type>::swap(__rhs);
332}
333
334template <class _CharT, class _Traits>
335basic_istream<_CharT, _Traits>&
336basic_istream<_CharT, _Traits>::operator>>(unsigned short& __n)
337{
338#ifndef _LIBCPP_NO_EXCEPTIONS
339    try
340    {
341#endif  // _LIBCPP_NO_EXCEPTIONS
342        sentry __s(*this);
343        if (__s)
344        {
345            typedef istreambuf_iterator<char_type, traits_type> _Ip;
346            typedef num_get<char_type, _Ip> _Fp;
347            ios_base::iostate __err = ios_base::goodbit;
348            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
349            this->setstate(__err);
350        }
351#ifndef _LIBCPP_NO_EXCEPTIONS
352    }
353    catch (...)
354    {
355        this->__set_badbit_and_consider_rethrow();
356    }
357#endif  // _LIBCPP_NO_EXCEPTIONS
358    return *this;
359}
360
361template <class _CharT, class _Traits>
362basic_istream<_CharT, _Traits>&
363basic_istream<_CharT, _Traits>::operator>>(unsigned int& __n)
364{
365#ifndef _LIBCPP_NO_EXCEPTIONS
366    try
367    {
368#endif  // _LIBCPP_NO_EXCEPTIONS
369        sentry __s(*this);
370        if (__s)
371        {
372            typedef istreambuf_iterator<char_type, traits_type> _Ip;
373            typedef num_get<char_type, _Ip> _Fp;
374            ios_base::iostate __err = ios_base::goodbit;
375            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
376            this->setstate(__err);
377        }
378#ifndef _LIBCPP_NO_EXCEPTIONS
379    }
380    catch (...)
381    {
382        this->__set_badbit_and_consider_rethrow();
383    }
384#endif  // _LIBCPP_NO_EXCEPTIONS
385    return *this;
386}
387
388template <class _CharT, class _Traits>
389basic_istream<_CharT, _Traits>&
390basic_istream<_CharT, _Traits>::operator>>(long& __n)
391{
392#ifndef _LIBCPP_NO_EXCEPTIONS
393    try
394    {
395#endif  // _LIBCPP_NO_EXCEPTIONS
396        sentry __s(*this);
397        if (__s)
398        {
399            typedef istreambuf_iterator<char_type, traits_type> _Ip;
400            typedef num_get<char_type, _Ip> _Fp;
401            ios_base::iostate __err = ios_base::goodbit;
402            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
403            this->setstate(__err);
404        }
405#ifndef _LIBCPP_NO_EXCEPTIONS
406    }
407    catch (...)
408    {
409        this->__set_badbit_and_consider_rethrow();
410    }
411#endif  // _LIBCPP_NO_EXCEPTIONS
412    return *this;
413}
414
415template <class _CharT, class _Traits>
416basic_istream<_CharT, _Traits>&
417basic_istream<_CharT, _Traits>::operator>>(unsigned long& __n)
418{
419#ifndef _LIBCPP_NO_EXCEPTIONS
420    try
421    {
422#endif  // _LIBCPP_NO_EXCEPTIONS
423        sentry __s(*this);
424        if (__s)
425        {
426            typedef istreambuf_iterator<char_type, traits_type> _Ip;
427            typedef num_get<char_type, _Ip> _Fp;
428            ios_base::iostate __err = ios_base::goodbit;
429            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
430            this->setstate(__err);
431        }
432#ifndef _LIBCPP_NO_EXCEPTIONS
433    }
434    catch (...)
435    {
436        this->__set_badbit_and_consider_rethrow();
437    }
438#endif  // _LIBCPP_NO_EXCEPTIONS
439    return *this;
440}
441
442template <class _CharT, class _Traits>
443basic_istream<_CharT, _Traits>&
444basic_istream<_CharT, _Traits>::operator>>(long long& __n)
445{
446#ifndef _LIBCPP_NO_EXCEPTIONS
447    try
448    {
449#endif  // _LIBCPP_NO_EXCEPTIONS
450        sentry __s(*this);
451        if (__s)
452        {
453            typedef istreambuf_iterator<char_type, traits_type> _Ip;
454            typedef num_get<char_type, _Ip> _Fp;
455            ios_base::iostate __err = ios_base::goodbit;
456            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
457            this->setstate(__err);
458        }
459#ifndef _LIBCPP_NO_EXCEPTIONS
460    }
461    catch (...)
462    {
463        this->__set_badbit_and_consider_rethrow();
464    }
465#endif  // _LIBCPP_NO_EXCEPTIONS
466    return *this;
467}
468
469template <class _CharT, class _Traits>
470basic_istream<_CharT, _Traits>&
471basic_istream<_CharT, _Traits>::operator>>(unsigned long long& __n)
472{
473#ifndef _LIBCPP_NO_EXCEPTIONS
474    try
475    {
476#endif  // _LIBCPP_NO_EXCEPTIONS
477        sentry __s(*this);
478        if (__s)
479        {
480            typedef istreambuf_iterator<char_type, traits_type> _Ip;
481            typedef num_get<char_type, _Ip> _Fp;
482            ios_base::iostate __err = ios_base::goodbit;
483            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
484            this->setstate(__err);
485        }
486#ifndef _LIBCPP_NO_EXCEPTIONS
487    }
488    catch (...)
489    {
490        this->__set_badbit_and_consider_rethrow();
491    }
492#endif  // _LIBCPP_NO_EXCEPTIONS
493    return *this;
494}
495
496template <class _CharT, class _Traits>
497basic_istream<_CharT, _Traits>&
498basic_istream<_CharT, _Traits>::operator>>(float& __n)
499{
500#ifndef _LIBCPP_NO_EXCEPTIONS
501    try
502    {
503#endif  // _LIBCPP_NO_EXCEPTIONS
504        sentry __s(*this);
505        if (__s)
506        {
507            typedef istreambuf_iterator<char_type, traits_type> _Ip;
508            typedef num_get<char_type, _Ip> _Fp;
509            ios_base::iostate __err = ios_base::goodbit;
510            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
511            this->setstate(__err);
512        }
513#ifndef _LIBCPP_NO_EXCEPTIONS
514    }
515    catch (...)
516    {
517        this->__set_badbit_and_consider_rethrow();
518    }
519#endif  // _LIBCPP_NO_EXCEPTIONS
520    return *this;
521}
522
523template <class _CharT, class _Traits>
524basic_istream<_CharT, _Traits>&
525basic_istream<_CharT, _Traits>::operator>>(double& __n)
526{
527#ifndef _LIBCPP_NO_EXCEPTIONS
528    try
529    {
530#endif  // _LIBCPP_NO_EXCEPTIONS
531        sentry __s(*this);
532        if (__s)
533        {
534            typedef istreambuf_iterator<char_type, traits_type> _Ip;
535            typedef num_get<char_type, _Ip> _Fp;
536            ios_base::iostate __err = ios_base::goodbit;
537            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
538            this->setstate(__err);
539        }
540#ifndef _LIBCPP_NO_EXCEPTIONS
541    }
542    catch (...)
543    {
544        this->__set_badbit_and_consider_rethrow();
545    }
546#endif  // _LIBCPP_NO_EXCEPTIONS
547    return *this;
548}
549
550template <class _CharT, class _Traits>
551basic_istream<_CharT, _Traits>&
552basic_istream<_CharT, _Traits>::operator>>(long double& __n)
553{
554#ifndef _LIBCPP_NO_EXCEPTIONS
555    try
556    {
557#endif  // _LIBCPP_NO_EXCEPTIONS
558        sentry __s(*this);
559        if (__s)
560        {
561            typedef istreambuf_iterator<char_type, traits_type> _Ip;
562            typedef num_get<char_type, _Ip> _Fp;
563            ios_base::iostate __err = ios_base::goodbit;
564            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
565            this->setstate(__err);
566        }
567#ifndef _LIBCPP_NO_EXCEPTIONS
568    }
569    catch (...)
570    {
571        this->__set_badbit_and_consider_rethrow();
572    }
573#endif  // _LIBCPP_NO_EXCEPTIONS
574    return *this;
575}
576
577template <class _CharT, class _Traits>
578basic_istream<_CharT, _Traits>&
579basic_istream<_CharT, _Traits>::operator>>(bool& __n)
580{
581#ifndef _LIBCPP_NO_EXCEPTIONS
582    try
583    {
584#endif  // _LIBCPP_NO_EXCEPTIONS
585        sentry __s(*this);
586        if (__s)
587        {
588            typedef istreambuf_iterator<char_type, traits_type> _Ip;
589            typedef num_get<char_type, _Ip> _Fp;
590            ios_base::iostate __err = ios_base::goodbit;
591            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
592            this->setstate(__err);
593        }
594#ifndef _LIBCPP_NO_EXCEPTIONS
595    }
596    catch (...)
597    {
598        this->__set_badbit_and_consider_rethrow();
599    }
600#endif  // _LIBCPP_NO_EXCEPTIONS
601    return *this;
602}
603
604template <class _CharT, class _Traits>
605basic_istream<_CharT, _Traits>&
606basic_istream<_CharT, _Traits>::operator>>(void*& __n)
607{
608#ifndef _LIBCPP_NO_EXCEPTIONS
609    try
610    {
611#endif  // _LIBCPP_NO_EXCEPTIONS
612        sentry __s(*this);
613        if (__s)
614        {
615            typedef istreambuf_iterator<char_type, traits_type> _Ip;
616            typedef num_get<char_type, _Ip> _Fp;
617            ios_base::iostate __err = ios_base::goodbit;
618            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __n);
619            this->setstate(__err);
620        }
621#ifndef _LIBCPP_NO_EXCEPTIONS
622    }
623    catch (...)
624    {
625        this->__set_badbit_and_consider_rethrow();
626    }
627#endif  // _LIBCPP_NO_EXCEPTIONS
628    return *this;
629}
630
631template <class _CharT, class _Traits>
632basic_istream<_CharT, _Traits>&
633basic_istream<_CharT, _Traits>::operator>>(short& __n)
634{
635#ifndef _LIBCPP_NO_EXCEPTIONS
636    try
637    {
638#endif  // _LIBCPP_NO_EXCEPTIONS
639        sentry __s(*this);
640        if (__s)
641        {
642            typedef istreambuf_iterator<char_type, traits_type> _Ip;
643            typedef num_get<char_type, _Ip> _Fp;
644            ios_base::iostate __err = ios_base::goodbit;
645            long __temp;
646            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
647            if (__temp < numeric_limits<short>::min())
648            {
649                __err |= ios_base::failbit;
650                __n = numeric_limits<short>::min();
651            }
652            else if (__temp > numeric_limits<short>::max())
653            {
654                __err |= ios_base::failbit;
655                __n = numeric_limits<short>::max();
656            }
657            else
658                __n = static_cast<short>(__temp);
659            this->setstate(__err);
660        }
661#ifndef _LIBCPP_NO_EXCEPTIONS
662    }
663    catch (...)
664    {
665        this->__set_badbit_and_consider_rethrow();
666    }
667#endif  // _LIBCPP_NO_EXCEPTIONS
668    return *this;
669}
670
671template <class _CharT, class _Traits>
672basic_istream<_CharT, _Traits>&
673basic_istream<_CharT, _Traits>::operator>>(int& __n)
674{
675#ifndef _LIBCPP_NO_EXCEPTIONS
676    try
677    {
678#endif  // _LIBCPP_NO_EXCEPTIONS
679        sentry __s(*this);
680        if (__s)
681        {
682            typedef istreambuf_iterator<char_type, traits_type> _Ip;
683            typedef num_get<char_type, _Ip> _Fp;
684            ios_base::iostate __err = ios_base::goodbit;
685            long __temp;
686            use_facet<_Fp>(this->getloc()).get(_Ip(*this), _Ip(), *this, __err, __temp);
687            if (__temp < numeric_limits<int>::min())
688            {
689                __err |= ios_base::failbit;
690                __n = numeric_limits<int>::min();
691            }
692            else if (__temp > numeric_limits<int>::max())
693            {
694                __err |= ios_base::failbit;
695                __n = numeric_limits<int>::max();
696            }
697            else
698                __n = static_cast<int>(__temp);
699            this->setstate(__err);
700        }
701#ifndef _LIBCPP_NO_EXCEPTIONS
702    }
703    catch (...)
704    {
705        this->__set_badbit_and_consider_rethrow();
706    }
707#endif  // _LIBCPP_NO_EXCEPTIONS
708    return *this;
709}
710
711template <class _CharT, class _Traits>
712inline _LIBCPP_INLINE_VISIBILITY
713basic_istream<_CharT, _Traits>&
714basic_istream<_CharT, _Traits>::operator>>(basic_istream& (*__pf)(basic_istream&))
715{
716    return __pf(*this);
717}
718
719template <class _CharT, class _Traits>
720inline _LIBCPP_INLINE_VISIBILITY
721basic_istream<_CharT, _Traits>&
722basic_istream<_CharT, _Traits>::operator>>(basic_ios<char_type, traits_type>&
723                                           (*__pf)(basic_ios<char_type, traits_type>&))
724{
725    __pf(*this);
726    return *this;
727}
728
729template <class _CharT, class _Traits>
730inline _LIBCPP_INLINE_VISIBILITY
731basic_istream<_CharT, _Traits>&
732basic_istream<_CharT, _Traits>::operator>>(ios_base& (*__pf)(ios_base&))
733{
734    __pf(*this);
735    return *this;
736}
737
738template<class _CharT, class _Traits>
739basic_istream<_CharT, _Traits>&
740operator>>(basic_istream<_CharT, _Traits>& __is, _CharT* __s)
741{
742#ifndef _LIBCPP_NO_EXCEPTIONS
743    try
744    {
745#endif  // _LIBCPP_NO_EXCEPTIONS
746        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
747        if (__sen)
748        {
749            streamsize __n = __is.width();
750            if (__n <= 0)
751                __n = numeric_limits<streamsize>::max() / sizeof(_CharT) - 1;
752            streamsize __c = 0;
753            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
754            ios_base::iostate __err = ios_base::goodbit;
755            while (__c < __n-1)
756            {
757                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
758                if (_Traits::eq_int_type(__i, _Traits::eof()))
759                {
760                   __err |= ios_base::eofbit;
761                   break;
762                }
763                _CharT __ch = _Traits::to_char_type(__i);
764                if (__ct.is(__ct.space, __ch))
765                    break;
766                *__s++ = __ch;
767                ++__c;
768                 __is.rdbuf()->sbumpc();
769            }
770            *__s = _CharT();
771            __is.width(0);
772            if (__c == 0)
773               __err |= ios_base::failbit;
774            __is.setstate(__err);
775        }
776#ifndef _LIBCPP_NO_EXCEPTIONS
777    }
778    catch (...)
779    {
780        __is.__set_badbit_and_consider_rethrow();
781    }
782#endif  // _LIBCPP_NO_EXCEPTIONS
783    return __is;
784}
785
786template<class _Traits>
787inline _LIBCPP_INLINE_VISIBILITY
788basic_istream<char, _Traits>&
789operator>>(basic_istream<char, _Traits>& __is, unsigned char* __s)
790{
791    return __is >> (char*)__s;
792}
793
794template<class _Traits>
795inline _LIBCPP_INLINE_VISIBILITY
796basic_istream<char, _Traits>&
797operator>>(basic_istream<char, _Traits>& __is, signed char* __s)
798{
799    return __is >> (char*)__s;
800}
801
802template<class _CharT, class _Traits>
803basic_istream<_CharT, _Traits>&
804operator>>(basic_istream<_CharT, _Traits>& __is, _CharT& __c)
805{
806#ifndef _LIBCPP_NO_EXCEPTIONS
807    try
808    {
809#endif  // _LIBCPP_NO_EXCEPTIONS
810        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
811        if (__sen)
812        {
813            typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
814            if (_Traits::eq_int_type(__i, _Traits::eof()))
815                __is.setstate(ios_base::eofbit | ios_base::failbit);
816            else
817                __c = _Traits::to_char_type(__i);
818        }
819#ifndef _LIBCPP_NO_EXCEPTIONS
820    }
821    catch (...)
822    {
823        __is.__set_badbit_and_consider_rethrow();
824    }
825#endif  // _LIBCPP_NO_EXCEPTIONS
826    return __is;
827}
828
829template<class _Traits>
830inline _LIBCPP_INLINE_VISIBILITY
831basic_istream<char, _Traits>&
832operator>>(basic_istream<char, _Traits>& __is, unsigned char& __c)
833{
834    return __is >> (char&)__c;
835}
836
837template<class _Traits>
838inline _LIBCPP_INLINE_VISIBILITY
839basic_istream<char, _Traits>&
840operator>>(basic_istream<char, _Traits>& __is, signed char& __c)
841{
842    return __is >> (char&)__c;
843}
844
845template<class _CharT, class _Traits>
846basic_istream<_CharT, _Traits>&
847basic_istream<_CharT, _Traits>::operator>>(basic_streambuf<char_type, traits_type>* __sb)
848{
849    __gc_ = 0;
850#ifndef _LIBCPP_NO_EXCEPTIONS
851    try
852    {
853#endif  // _LIBCPP_NO_EXCEPTIONS
854        sentry __s(*this, true);
855        if (__s)
856        {
857            if (__sb)
858            {
859#ifndef _LIBCPP_NO_EXCEPTIONS
860                try
861                {
862#endif  // _LIBCPP_NO_EXCEPTIONS
863                    ios_base::iostate __err = ios_base::goodbit;
864                    while (true)
865                    {
866                        typename traits_type::int_type __i = this->rdbuf()->sgetc();
867                        if (traits_type::eq_int_type(__i, _Traits::eof()))
868                        {
869                           __err |= ios_base::eofbit;
870                           break;
871                        }
872                        if (traits_type::eq_int_type(
873                                __sb->sputc(traits_type::to_char_type(__i)),
874                                traits_type::eof()))
875                            break;
876                        ++__gc_;
877                        this->rdbuf()->sbumpc();
878                    }
879                    if (__gc_ == 0)
880                       __err |= ios_base::failbit;
881                    this->setstate(__err);
882#ifndef _LIBCPP_NO_EXCEPTIONS
883                }
884                catch (...)
885                {
886                    if (__gc_ == 0)
887                        this->__set_failbit_and_consider_rethrow();
888                }
889#endif  // _LIBCPP_NO_EXCEPTIONS
890            }
891            else
892                this->setstate(ios_base::failbit);
893        }
894#ifndef _LIBCPP_NO_EXCEPTIONS
895    }
896    catch (...)
897    {
898        this->__set_badbit_and_consider_rethrow();
899    }
900#endif  // _LIBCPP_NO_EXCEPTIONS
901    return *this;
902}
903
904template<class _CharT, class _Traits>
905typename basic_istream<_CharT, _Traits>::int_type
906basic_istream<_CharT, _Traits>::get()
907{
908    __gc_ = 0;
909    int_type __r = traits_type::eof();
910#ifndef _LIBCPP_NO_EXCEPTIONS
911    try
912    {
913#endif  // _LIBCPP_NO_EXCEPTIONS
914        sentry __s(*this, true);
915        if (__s)
916        {
917            __r = this->rdbuf()->sbumpc();
918            if (traits_type::eq_int_type(__r, traits_type::eof()))
919               this->setstate(ios_base::failbit | ios_base::eofbit);
920            else
921                __gc_ = 1;
922        }
923#ifndef _LIBCPP_NO_EXCEPTIONS
924    }
925    catch (...)
926    {
927        this->__set_badbit_and_consider_rethrow();
928    }
929#endif  // _LIBCPP_NO_EXCEPTIONS
930    return __r;
931}
932
933template<class _CharT, class _Traits>
934inline _LIBCPP_INLINE_VISIBILITY
935basic_istream<_CharT, _Traits>&
936basic_istream<_CharT, _Traits>::get(char_type& __c)
937{
938    int_type __ch = get();
939    if (__ch != traits_type::eof())
940        __c = traits_type::to_char_type(__ch);
941    return *this;
942}
943
944template<class _CharT, class _Traits>
945basic_istream<_CharT, _Traits>&
946basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n, char_type __dlm)
947{
948    __gc_ = 0;
949#ifndef _LIBCPP_NO_EXCEPTIONS
950    try
951    {
952#endif  // _LIBCPP_NO_EXCEPTIONS
953        sentry __sen(*this, true);
954        if (__sen)
955        {
956            if (__n > 0)
957            {
958                ios_base::iostate __err = ios_base::goodbit;
959                while (__gc_ < __n-1)
960                {
961                    int_type __i = this->rdbuf()->sgetc();
962                    if (traits_type::eq_int_type(__i, traits_type::eof()))
963                    {
964                       __err |= ios_base::eofbit;
965                       break;
966                    }
967                    char_type __ch = traits_type::to_char_type(__i);
968                    if (traits_type::eq(__ch, __dlm))
969                        break;
970                    *__s++ = __ch;
971                    ++__gc_;
972                     this->rdbuf()->sbumpc();
973                }
974                *__s = char_type();
975                if (__gc_ == 0)
976                   __err |= ios_base::failbit;
977                this->setstate(__err);
978            }
979            else
980                this->setstate(ios_base::failbit);
981        }
982#ifndef _LIBCPP_NO_EXCEPTIONS
983    }
984    catch (...)
985    {
986        this->__set_badbit_and_consider_rethrow();
987    }
988#endif  // _LIBCPP_NO_EXCEPTIONS
989    return *this;
990}
991
992template<class _CharT, class _Traits>
993inline _LIBCPP_INLINE_VISIBILITY
994basic_istream<_CharT, _Traits>&
995basic_istream<_CharT, _Traits>::get(char_type* __s, streamsize __n)
996{
997    return get(__s, __n, this->widen('\n'));
998}
999
1000template<class _CharT, class _Traits>
1001basic_istream<_CharT, _Traits>&
1002basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb,
1003                                    char_type __dlm)
1004{
1005    __gc_ = 0;
1006#ifndef _LIBCPP_NO_EXCEPTIONS
1007    try
1008    {
1009#endif  // _LIBCPP_NO_EXCEPTIONS
1010        sentry __sen(*this, true);
1011        if (__sen)
1012        {
1013            ios_base::iostate __err = ios_base::goodbit;
1014#ifndef _LIBCPP_NO_EXCEPTIONS
1015            try
1016            {
1017#endif  // _LIBCPP_NO_EXCEPTIONS
1018                while (true)
1019                {
1020                    typename traits_type::int_type __i = this->rdbuf()->sgetc();
1021                    if (traits_type::eq_int_type(__i, traits_type::eof()))
1022                    {
1023                       __err |= ios_base::eofbit;
1024                       break;
1025                    }
1026                    char_type __ch = traits_type::to_char_type(__i);
1027                    if (traits_type::eq(__ch, __dlm))
1028                        break;
1029                    if (traits_type::eq_int_type(__sb.sputc(__ch), traits_type::eof()))
1030                        break;
1031                    ++__gc_;
1032                    this->rdbuf()->sbumpc();
1033                }
1034#ifndef _LIBCPP_NO_EXCEPTIONS
1035            }
1036            catch (...)
1037            {
1038            }
1039#endif  // _LIBCPP_NO_EXCEPTIONS
1040            if (__gc_ == 0)
1041               __err |= ios_base::failbit;
1042            this->setstate(__err);
1043        }
1044#ifndef _LIBCPP_NO_EXCEPTIONS
1045    }
1046    catch (...)
1047    {
1048        this->__set_badbit_and_consider_rethrow();
1049    }
1050#endif  // _LIBCPP_NO_EXCEPTIONS
1051    return *this;
1052}
1053
1054template<class _CharT, class _Traits>
1055inline _LIBCPP_INLINE_VISIBILITY
1056basic_istream<_CharT, _Traits>&
1057basic_istream<_CharT, _Traits>::get(basic_streambuf<char_type, traits_type>& __sb)
1058{
1059    return get(__sb, this->widen('\n'));
1060}
1061
1062template<class _CharT, class _Traits>
1063basic_istream<_CharT, _Traits>&
1064basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n, char_type __dlm)
1065{
1066    __gc_ = 0;
1067#ifndef _LIBCPP_NO_EXCEPTIONS
1068    try
1069    {
1070#endif  // _LIBCPP_NO_EXCEPTIONS
1071        sentry __sen(*this, true);
1072        if (__sen)
1073        {
1074            ios_base::iostate __err = ios_base::goodbit;
1075            while (true)
1076            {
1077                typename traits_type::int_type __i = this->rdbuf()->sgetc();
1078                if (traits_type::eq_int_type(__i, traits_type::eof()))
1079                {
1080                   __err |= ios_base::eofbit;
1081                   break;
1082                }
1083                char_type __ch = traits_type::to_char_type(__i);
1084                if (traits_type::eq(__ch, __dlm))
1085                {
1086                    this->rdbuf()->sbumpc();
1087                    ++__gc_;
1088                    break;
1089                }
1090                if (__gc_ >= __n-1)
1091                {
1092                    __err |= ios_base::failbit;
1093                    break;
1094                }
1095                *__s++ = __ch;
1096                this->rdbuf()->sbumpc();
1097                ++__gc_;
1098            }
1099            if (__n > 0)
1100                *__s = char_type();
1101            if (__gc_ == 0)
1102               __err |= ios_base::failbit;
1103            this->setstate(__err);
1104        }
1105#ifndef _LIBCPP_NO_EXCEPTIONS
1106    }
1107    catch (...)
1108    {
1109        this->__set_badbit_and_consider_rethrow();
1110    }
1111#endif  // _LIBCPP_NO_EXCEPTIONS
1112    return *this;
1113}
1114
1115template<class _CharT, class _Traits>
1116inline _LIBCPP_INLINE_VISIBILITY
1117basic_istream<_CharT, _Traits>&
1118basic_istream<_CharT, _Traits>::getline(char_type* __s, streamsize __n)
1119{
1120    return getline(__s, __n, this->widen('\n'));
1121}
1122
1123template<class _CharT, class _Traits>
1124basic_istream<_CharT, _Traits>&
1125basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __dlm)
1126{
1127    __gc_ = 0;
1128#ifndef _LIBCPP_NO_EXCEPTIONS
1129    try
1130    {
1131#endif  // _LIBCPP_NO_EXCEPTIONS
1132        sentry __sen(*this, true);
1133        if (__sen)
1134        {
1135            ios_base::iostate __err = ios_base::goodbit;
1136            if (__n == numeric_limits<streamsize>::max())
1137            {
1138                while (true)
1139                {
1140                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1141                    if (traits_type::eq_int_type(__i, traits_type::eof()))
1142                    {
1143                       __err |= ios_base::eofbit;
1144                       break;
1145                    }
1146                    ++__gc_;
1147                    char_type __ch = traits_type::to_char_type(__i);
1148                    if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
1149                        break;
1150                }
1151            }
1152            else
1153            {
1154                while (__gc_ < __n)
1155                {
1156                    typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1157                    if (traits_type::eq_int_type(__i, traits_type::eof()))
1158                    {
1159                       __err |= ios_base::eofbit;
1160                       break;
1161                    }
1162                    ++__gc_;
1163                    char_type __ch = traits_type::to_char_type(__i);
1164                    if (traits_type::eq(__ch, static_cast<char_type>(__dlm)))
1165                        break;
1166                }
1167            }
1168            this->setstate(__err);
1169        }
1170#ifndef _LIBCPP_NO_EXCEPTIONS
1171    }
1172    catch (...)
1173    {
1174        this->__set_badbit_and_consider_rethrow();
1175    }
1176#endif  // _LIBCPP_NO_EXCEPTIONS
1177    return *this;
1178}
1179
1180template<class _CharT, class _Traits>
1181typename basic_istream<_CharT, _Traits>::int_type
1182basic_istream<_CharT, _Traits>::peek()
1183{
1184    __gc_ = 0;
1185    int_type __r = traits_type::eof();
1186#ifndef _LIBCPP_NO_EXCEPTIONS
1187    try
1188    {
1189#endif  // _LIBCPP_NO_EXCEPTIONS
1190        sentry __sen(*this, true);
1191        if (__sen)
1192        {
1193            __r = this->rdbuf()->sgetc();
1194            if (traits_type::eq_int_type(__r, traits_type::eof()))
1195                this->setstate(ios_base::eofbit);
1196        }
1197#ifndef _LIBCPP_NO_EXCEPTIONS
1198    }
1199    catch (...)
1200    {
1201        this->__set_badbit_and_consider_rethrow();
1202    }
1203#endif  // _LIBCPP_NO_EXCEPTIONS
1204    return __r;
1205}
1206
1207template<class _CharT, class _Traits>
1208basic_istream<_CharT, _Traits>&
1209basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
1210{
1211    __gc_ = 0;
1212#ifndef _LIBCPP_NO_EXCEPTIONS
1213    try
1214    {
1215#endif  // _LIBCPP_NO_EXCEPTIONS
1216        sentry __sen(*this, true);
1217        if (__sen)
1218        {
1219            for (; __gc_ < __n; ++__gc_)
1220            {
1221                typename traits_type::int_type __i = this->rdbuf()->sbumpc();
1222                if (traits_type::eq_int_type(__i, traits_type::eof()))
1223                {
1224                   this->setstate(ios_base::failbit | ios_base::eofbit);
1225                   break;
1226                }
1227                *__s++ = traits_type::to_char_type(__i);
1228            }
1229        }
1230        else
1231            this->setstate(ios_base::failbit);
1232#ifndef _LIBCPP_NO_EXCEPTIONS
1233    }
1234    catch (...)
1235    {
1236        this->__set_badbit_and_consider_rethrow();
1237    }
1238#endif  // _LIBCPP_NO_EXCEPTIONS
1239    return *this;
1240}
1241
1242template<class _CharT, class _Traits>
1243streamsize
1244basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __n)
1245{
1246    __gc_ = 0;
1247    streamsize __c = this->rdbuf()->in_avail();
1248    switch (__c)
1249    {
1250    case -1:
1251        this->setstate(ios_base::eofbit);
1252        break;
1253    case 0:
1254        break;
1255    default:
1256        read(__s, _VSTD::min(__c, __n));
1257        break;
1258    }
1259    return __gc_;
1260}
1261
1262template<class _CharT, class _Traits>
1263basic_istream<_CharT, _Traits>&
1264basic_istream<_CharT, _Traits>::putback(char_type __c)
1265{
1266    __gc_ = 0;
1267#ifndef _LIBCPP_NO_EXCEPTIONS
1268    try
1269    {
1270#endif  // _LIBCPP_NO_EXCEPTIONS
1271        this->clear(this->rdstate() & ~ios_base::eofbit);
1272        sentry __sen(*this, true);
1273        if (__sen)
1274        {
1275            if (this->rdbuf() == 0 || this->rdbuf()->sputbackc(__c) == traits_type::eof())
1276                this->setstate(ios_base::badbit);
1277        }
1278        else
1279            this->setstate(ios_base::failbit);
1280#ifndef _LIBCPP_NO_EXCEPTIONS
1281    }
1282    catch (...)
1283    {
1284        this->__set_badbit_and_consider_rethrow();
1285    }
1286#endif  // _LIBCPP_NO_EXCEPTIONS
1287    return *this;
1288}
1289
1290template<class _CharT, class _Traits>
1291basic_istream<_CharT, _Traits>&
1292basic_istream<_CharT, _Traits>::unget()
1293{
1294    __gc_ = 0;
1295#ifndef _LIBCPP_NO_EXCEPTIONS
1296    try
1297    {
1298#endif  // _LIBCPP_NO_EXCEPTIONS
1299        this->clear(this->rdstate() & ~ios_base::eofbit);
1300        sentry __sen(*this, true);
1301        if (__sen)
1302        {
1303            if (this->rdbuf() == 0 || this->rdbuf()->sungetc() == traits_type::eof())
1304                this->setstate(ios_base::badbit);
1305        }
1306        else
1307            this->setstate(ios_base::failbit);
1308#ifndef _LIBCPP_NO_EXCEPTIONS
1309    }
1310    catch (...)
1311    {
1312        this->__set_badbit_and_consider_rethrow();
1313    }
1314#endif  // _LIBCPP_NO_EXCEPTIONS
1315    return *this;
1316}
1317
1318template<class _CharT, class _Traits>
1319int
1320basic_istream<_CharT, _Traits>::sync()
1321{
1322    int __r = 0;
1323#ifndef _LIBCPP_NO_EXCEPTIONS
1324    try
1325    {
1326#endif  // _LIBCPP_NO_EXCEPTIONS
1327        sentry __sen(*this, true);
1328        if (__sen)
1329        {
1330            if (this->rdbuf() == 0)
1331                return -1;
1332            if (this->rdbuf()->pubsync() == -1)
1333            {
1334                this->setstate(ios_base::badbit);
1335                return -1;
1336            }
1337        }
1338#ifndef _LIBCPP_NO_EXCEPTIONS
1339    }
1340    catch (...)
1341    {
1342        this->__set_badbit_and_consider_rethrow();
1343    }
1344#endif  // _LIBCPP_NO_EXCEPTIONS
1345    return __r;
1346}
1347
1348template<class _CharT, class _Traits>
1349typename basic_istream<_CharT, _Traits>::pos_type
1350basic_istream<_CharT, _Traits>::tellg()
1351{
1352    pos_type __r(-1);
1353#ifndef _LIBCPP_NO_EXCEPTIONS
1354    try
1355    {
1356#endif  // _LIBCPP_NO_EXCEPTIONS
1357        sentry __sen(*this, true);
1358        if (__sen)
1359            __r = this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in);
1360#ifndef _LIBCPP_NO_EXCEPTIONS
1361    }
1362    catch (...)
1363    {
1364        this->__set_badbit_and_consider_rethrow();
1365    }
1366#endif  // _LIBCPP_NO_EXCEPTIONS
1367    return __r;
1368}
1369
1370template<class _CharT, class _Traits>
1371basic_istream<_CharT, _Traits>&
1372basic_istream<_CharT, _Traits>::seekg(pos_type __pos)
1373{
1374#ifndef _LIBCPP_NO_EXCEPTIONS
1375    try
1376    {
1377#endif  // _LIBCPP_NO_EXCEPTIONS
1378        this->clear(this->rdstate() & ~ios_base::eofbit);
1379        sentry __sen(*this, true);
1380        if (__sen)
1381            if (this->rdbuf()->pubseekpos(__pos, ios_base::in) == pos_type(-1))
1382                this->setstate(ios_base::failbit);
1383#ifndef _LIBCPP_NO_EXCEPTIONS
1384    }
1385    catch (...)
1386    {
1387        this->__set_badbit_and_consider_rethrow();
1388    }
1389#endif  // _LIBCPP_NO_EXCEPTIONS
1390    return *this;
1391}
1392
1393template<class _CharT, class _Traits>
1394basic_istream<_CharT, _Traits>&
1395basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
1396{
1397#ifndef _LIBCPP_NO_EXCEPTIONS
1398    try
1399    {
1400#endif  // _LIBCPP_NO_EXCEPTIONS
1401        sentry __sen(*this, true);
1402        if (__sen)
1403            this->rdbuf()->pubseekoff(__off, __dir, ios_base::in);
1404#ifndef _LIBCPP_NO_EXCEPTIONS
1405    }
1406    catch (...)
1407    {
1408        this->__set_badbit_and_consider_rethrow();
1409    }
1410#endif  // _LIBCPP_NO_EXCEPTIONS
1411    return *this;
1412}
1413
1414template <class _CharT, class _Traits>
1415basic_istream<_CharT, _Traits>&
1416ws(basic_istream<_CharT, _Traits>& __is)
1417{
1418#ifndef _LIBCPP_NO_EXCEPTIONS
1419    try
1420    {
1421#endif  // _LIBCPP_NO_EXCEPTIONS
1422        typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1423        if (__sen)
1424        {
1425            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1426            while (true)
1427            {
1428                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1429                if (_Traits::eq_int_type(__i, _Traits::eof()))
1430                {
1431                   __is.setstate(ios_base::eofbit);
1432                   break;
1433                }
1434                if (!__ct.is(__ct.space, _Traits::to_char_type(__i)))
1435                    break;
1436                __is.rdbuf()->sbumpc();
1437            }
1438        }
1439#ifndef _LIBCPP_NO_EXCEPTIONS
1440    }
1441    catch (...)
1442    {
1443        __is.__set_badbit_and_consider_rethrow();
1444    }
1445#endif  // _LIBCPP_NO_EXCEPTIONS
1446    return __is;
1447}
1448
1449#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1450
1451template <class _CharT, class _Traits, class _Tp>
1452inline _LIBCPP_INLINE_VISIBILITY
1453basic_istream<_CharT, _Traits>&
1454operator>>(basic_istream<_CharT, _Traits>&& __is, _Tp& __x)
1455{
1456    __is >> __x;
1457    return __is;
1458}
1459
1460#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1461
1462template <class _CharT, class _Traits>
1463class _LIBCPP_VISIBLE basic_iostream
1464    : public basic_istream<_CharT, _Traits>,
1465      public basic_ostream<_CharT, _Traits>
1466{
1467public:
1468    // types:
1469    typedef _CharT                         char_type;
1470    typedef _Traits                        traits_type;
1471    typedef typename traits_type::int_type int_type;
1472    typedef typename traits_type::pos_type pos_type;
1473    typedef typename traits_type::off_type off_type;
1474
1475    // constructor/destructor
1476    explicit basic_iostream(basic_streambuf<char_type, traits_type>* __sb);
1477    virtual ~basic_iostream();
1478protected:
1479#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1480    _LIBCPP_INLINE_VISIBILITY
1481    basic_iostream(basic_iostream&& __rhs);
1482#endif
1483
1484    // assign/swap
1485#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1486    _LIBCPP_INLINE_VISIBILITY
1487    basic_iostream& operator=(basic_iostream&& __rhs);
1488#endif
1489    void swap(basic_iostream& __rhs);
1490public:
1491};
1492
1493template <class _CharT, class _Traits>
1494inline _LIBCPP_INLINE_VISIBILITY
1495basic_iostream<_CharT, _Traits>::basic_iostream(basic_streambuf<char_type, traits_type>* __sb)
1496    : basic_istream<_CharT, _Traits>(__sb)
1497{
1498}
1499
1500#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1501
1502template <class _CharT, class _Traits>
1503inline _LIBCPP_INLINE_VISIBILITY
1504basic_iostream<_CharT, _Traits>::basic_iostream(basic_iostream&& __rhs)
1505    : basic_istream<_CharT, _Traits>(_VSTD::move(__rhs))
1506{
1507}
1508
1509template <class _CharT, class _Traits>
1510inline _LIBCPP_INLINE_VISIBILITY
1511basic_iostream<_CharT, _Traits>&
1512basic_iostream<_CharT, _Traits>::operator=(basic_iostream&& __rhs)
1513{
1514    swap(__rhs);
1515    return *this;
1516}
1517
1518#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1519
1520template <class _CharT, class _Traits>
1521basic_iostream<_CharT, _Traits>::~basic_iostream()
1522{
1523}
1524
1525template <class _CharT, class _Traits>
1526inline _LIBCPP_INLINE_VISIBILITY
1527void
1528basic_iostream<_CharT, _Traits>::swap(basic_iostream& __rhs)
1529{
1530    basic_istream<char_type, traits_type>::swap(__rhs);
1531}
1532
1533template<class _CharT, class _Traits, class _Allocator>
1534basic_istream<_CharT, _Traits>&
1535operator>>(basic_istream<_CharT, _Traits>& __is,
1536           basic_string<_CharT, _Traits, _Allocator>& __str)
1537{
1538#ifndef _LIBCPP_NO_EXCEPTIONS
1539    try
1540    {
1541#endif  // _LIBCPP_NO_EXCEPTIONS
1542        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1543        if (__sen)
1544        {
1545            __str.clear();
1546            streamsize __n = __is.width();
1547            if (__n <= 0)
1548                __n = __str.max_size();
1549            if (__n <= 0)
1550                __n = numeric_limits<streamsize>::max();
1551            streamsize __c = 0;
1552            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1553            ios_base::iostate __err = ios_base::goodbit;
1554            while (__c < __n)
1555            {
1556                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1557                if (_Traits::eq_int_type(__i, _Traits::eof()))
1558                {
1559                   __err |= ios_base::eofbit;
1560                   break;
1561                }
1562                _CharT __ch = _Traits::to_char_type(__i);
1563                if (__ct.is(__ct.space, __ch))
1564                    break;
1565                __str.push_back(__ch);
1566                ++__c;
1567                 __is.rdbuf()->sbumpc();
1568            }
1569            __is.width(0);
1570            if (__c == 0)
1571               __err |= ios_base::failbit;
1572            __is.setstate(__err);
1573        }
1574        else
1575            __is.setstate(ios_base::failbit);
1576#ifndef _LIBCPP_NO_EXCEPTIONS
1577    }
1578    catch (...)
1579    {
1580        __is.__set_badbit_and_consider_rethrow();
1581    }
1582#endif  // _LIBCPP_NO_EXCEPTIONS
1583    return __is;
1584}
1585
1586template<class _CharT, class _Traits, class _Allocator>
1587basic_istream<_CharT, _Traits>&
1588getline(basic_istream<_CharT, _Traits>& __is,
1589        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1590{
1591#ifndef _LIBCPP_NO_EXCEPTIONS
1592    try
1593    {
1594#endif  // _LIBCPP_NO_EXCEPTIONS
1595        typename basic_istream<_CharT, _Traits>::sentry __sen(__is, true);
1596        if (__sen)
1597        {
1598            __str.clear();
1599            ios_base::iostate __err = ios_base::goodbit;
1600            streamsize __extr = 0;
1601            while (true)
1602            {
1603                typename _Traits::int_type __i = __is.rdbuf()->sbumpc();
1604                if (_Traits::eq_int_type(__i, _Traits::eof()))
1605                {
1606                   __err |= ios_base::eofbit;
1607                   break;
1608                }
1609                ++__extr;
1610                _CharT __ch = _Traits::to_char_type(__i);
1611                if (_Traits::eq(__ch, __dlm))
1612                    break;
1613                __str.push_back(__ch);
1614                if (__str.size() == __str.max_size())
1615                {
1616                    __err |= ios_base::failbit;
1617                    break;
1618                }
1619            }
1620            if (__extr == 0)
1621               __err |= ios_base::failbit;
1622            __is.setstate(__err);
1623        }
1624#ifndef _LIBCPP_NO_EXCEPTIONS
1625    }
1626    catch (...)
1627    {
1628        __is.__set_badbit_and_consider_rethrow();
1629    }
1630#endif  // _LIBCPP_NO_EXCEPTIONS
1631    return __is;
1632}
1633
1634template<class _CharT, class _Traits, class _Allocator>
1635inline _LIBCPP_INLINE_VISIBILITY
1636basic_istream<_CharT, _Traits>&
1637getline(basic_istream<_CharT, _Traits>& __is,
1638        basic_string<_CharT, _Traits, _Allocator>& __str)
1639{
1640    return getline(__is, __str, __is.widen('\n'));
1641}
1642
1643#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1644
1645template<class _CharT, class _Traits, class _Allocator>
1646inline _LIBCPP_INLINE_VISIBILITY
1647basic_istream<_CharT, _Traits>&
1648getline(basic_istream<_CharT, _Traits>&& __is,
1649        basic_string<_CharT, _Traits, _Allocator>& __str, _CharT __dlm)
1650{
1651    return getline(__is, __str, __dlm);
1652}
1653
1654template<class _CharT, class _Traits, class _Allocator>
1655inline _LIBCPP_INLINE_VISIBILITY
1656basic_istream<_CharT, _Traits>&
1657getline(basic_istream<_CharT, _Traits>&& __is,
1658        basic_string<_CharT, _Traits, _Allocator>& __str)
1659{
1660    return getline(__is, __str, __is.widen('\n'));
1661}
1662
1663#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1664
1665template <class _CharT, class _Traits, size_t _Size>
1666basic_istream<_CharT, _Traits>&
1667operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x)
1668{
1669#ifndef _LIBCPP_NO_EXCEPTIONS
1670    try
1671    {
1672#endif  // _LIBCPP_NO_EXCEPTIONS
1673        typename basic_istream<_CharT, _Traits>::sentry __sen(__is);
1674        if (__sen)
1675        {
1676            basic_string<_CharT, _Traits> __str;
1677            const ctype<_CharT>& __ct = use_facet<ctype<_CharT> >(__is.getloc());
1678            streamsize __c = 0;
1679            ios_base::iostate __err = ios_base::goodbit;
1680            _CharT __zero = __ct.widen('0');
1681            _CharT __one = __ct.widen('1');
1682            while (__c < _Size)
1683            {
1684                typename _Traits::int_type __i = __is.rdbuf()->sgetc();
1685                if (_Traits::eq_int_type(__i, _Traits::eof()))
1686                {
1687                   __err |= ios_base::eofbit;
1688                   break;
1689                }
1690                _CharT __ch = _Traits::to_char_type(__i);
1691                if (!_Traits::eq(__ch, __zero) && !_Traits::eq(__ch, __one))
1692                    break;
1693                __str.push_back(__ch);
1694                ++__c;
1695                 __is.rdbuf()->sbumpc();
1696            }
1697            __x = bitset<_Size>(__str);
1698            if (__c == 0)
1699               __err |= ios_base::failbit;
1700            __is.setstate(__err);
1701        }
1702        else
1703            __is.setstate(ios_base::failbit);
1704#ifndef _LIBCPP_NO_EXCEPTIONS
1705    }
1706    catch (...)
1707    {
1708        __is.__set_badbit_and_consider_rethrow();
1709    }
1710#endif  // _LIBCPP_NO_EXCEPTIONS
1711    return __is;
1712}
1713
1714_LIBCPP_EXTERN_TEMPLATE(class basic_istream<char>)
1715_LIBCPP_EXTERN_TEMPLATE(class basic_istream<wchar_t>)
1716_LIBCPP_EXTERN_TEMPLATE(class basic_iostream<char>)
1717
1718_LIBCPP_END_NAMESPACE_STD
1719
1720#endif  // _LIBCPP_ISTREAM
1721