File Index Symbol Index

// istream standard header
#pragma once
#ifndef _ISTREAM_
#define _ISTREAM_
#ifndef RC_INVOKED #include <ostream>
_STL_DISABLE_CLANG_WARNINGS
#pragma push_macro("new")
#undef new
// CLASS TEMPLATE basic_istream
template
<
class
_Elem
,
class
_Traits
>
class
basic_istream
:
virtual
public
basic_ios
<
_Elem
,
_Traits
> {
// control extractions from a stream buffer
public
:
typedef
basic_ios
<
_Elem
,
_Traits
>
_Myios
;
typedef
basic_streambuf
<
_Elem
,
_Traits
>
_Mysb
;
typedef
istreambuf_iterator
<
_Elem
,
_Traits
>
_Iter
;
typedef
ctype
<
_Elem
>
_Ctype
;
typedef
num_get
<
_Elem
,
_Iter
>
_Nget
;
#if defined(__FORCE_INSTANCE)
explicit __CLR_OR_THIS_CALL basic_istream(_Mysb *_Strbuf,
bool _Isstd, bool _Noinit)
: _Chcount(0)
{ // construct from stream buffer pointer
if (!_Noinit)
_Myios::init(_Strbuf, _Isstd);
} #endif /* defined(__FORCE_INSTANCE) */
bool
_Isstd
=
false
) : _Chcount(
0
) {
// construct from stream buffer pointer
_Myios
::
init
(
_Strbuf
,
_Isstd
); } {
// construct uninitialized
this
->
_Addstd
(
this
); }
protected
: : _Chcount(
_Right
.
_Chcount
) {
// construct by moving _Right
_Myios
::
init
();
_Right
.
_Chcount
=
0
; } {
// move from _Right
this
->
swap
(
_Right
);
return
(*
this
); } {
// swap with _Right
_Myios
::
swap
(
_Right
); }
public
: {
// destroy the object
}
typedef
typename
_Traits
::int_type
int_type
;
typedef
typename
_Traits
::pos_type
pos_type
;
typedef
typename
_Traits
::off_type
off_type
;
// CLASS TEMPLATE sentry
class
_Sentry_base
{
// stores thread lock and reference to input stream
public
: : _Myistr(
_Istr
) {
// lock the stream buffer, if there
if
(
_Myistr
.
rdbuf
() !=
nullptr
)
_Myistr
.
rdbuf
()->_Lock(); } {
// destroy after unlocking
if
(
_Myistr
.
rdbuf
() !=
nullptr
)
_Myistr
.
rdbuf
()->_Unlock(); }
basic_istream
&
_Myistr
;
// the input stream, for _Unlock call at destruction
_Sentry_base
&
operator
=
(
const
_Sentry_base
&) =
delete
; };
class
sentry
:
public
_Sentry_base
{
// stores thread lock and result of _Ipfx call
public
: :
_Sentry_base
(
_Istr
) {
// construct locking and calling _Ipfx
_Ok
=
this
->
_Myistr
.
_Ipfx
(
_Noskip
); } {
// test if _Ipfx succeeded
return
(
_Ok
); }
private
:
bool
_Ok
;
// true if _Ipfx succeeded at construction
}; {
// test stream state and skip whitespace as needed
if
(
this
->
good
()) {
// state okay, flush tied stream and skip whitespace
if
(
_Myios
::
tie
() !=
nullptr
)
_Myios
::
tie
()->flush();
if
(!
_Noskip
&&
this
->
flags
() &
ios_base
::
skipws
) {
// skip whitespace
int_type
_Meta
=
_Myios
::
rdbuf
()->sgetc();
for
(; ;
_Meta
=
_Myios
::
rdbuf
()->snextc())
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_Myios
::
setstate
(
ios_base
::
eofbit
);
break
; }
else
if
(!
_Ctype_fac
.
is
(
_Ctype
::
space
,
_Traits
::to_char_type(
_Meta
)))
break
;
// not whitespace, quit
}
if
(
this
->
good
())
return
(
true
); }
_Myios
::
setstate
(
ios_base
::
failbit
);
return
(
false
); } {
// test stream state and skip whitespace as needed (retained)
return
(
_Ipfx
(
_Noskip
)); } {
// perform any wrapup (retained)
}
#ifdef _M_CEE_PURE
basic_istream& __CLR_OR_THIS_CALL operator>>(basic_istream& (__clrcall *_Pfn)(basic_istream&))
{ // call basic_istream manipulator
return ((*_Pfn)(*this));
}
basic_istream& __CLR_OR_THIS_CALL operator>>(_Myios& (__clrcall *_Pfn)(_Myios&))
{ // call basic_ios manipulator
(*_Pfn)(*(_Myios *)this);
return (*this);
}
basic_istream& __CLR_OR_THIS_CALL operator>>(ios_base& (__clrcall *_Pfn)(ios_base&))
{ // call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
#endif /* _M_CEE_PURE */
{
// call basic_istream manipulator
return
((*
_Pfn
)(*
this
)); } {
// call basic_ios manipulator
(*
_Pfn
)(*(
_Myios
*)
this
);
return
(*
this
); } {
// call ios_base manipulator
(*
_Pfn
)(*(
ios_base
*)
this
);
return
(*
this
); }
private
:
template
<
class
_Ty
>
basic_istream
&
_Common_extract_with_num_get
(
_Ty
&
_Val
) {
// formatted extract with num_get
ios_base
::
iostate
_Err
=
ios_base
::
goodbit
;
const
sentry
_Ok
(*
this
);
if
(
_Ok
) {
// state okay, use facet to extract
}
_Myios
::
setstate
(
_Err
);
return
(*
this
); }
public
: {
// extract a boolean
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a short
ios_base
::
iostate
_Err
=
ios_base
::
goodbit
;
const
sentry
_Ok
(*
this
);
if
(
_Ok
) {
// state okay, use facet to extract
long
_Lval
; {
_Err
|=
ios_base
::
failbit
; } {
_Err
|=
ios_base
::
failbit
; }
else
{
_Val
=
static_cast
<
short
>(
_Lval
); } }
_Myios
::
setstate
(
_Err
);
return
(*
this
); }
/* NOTE: If you are not using native wchar_t, the unsigned short extractor is masked by an explicit specialization that treats an unsigned short as a wide character. To read or write unsigned shorts as integers with wchar_t streams, make wchar_t a native type with the command line option /Zc:wchar_t. */
{
// extract an unsigned short
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract an int
static_assert
(
sizeof
(
int
)
=
=
sizeof
(
long
),
"Bad overflow assumptions due to sizeof(int) != sizeof(long)"
);
long
_Result
=
_Val
;
_Common_extract_with_num_get
(
_Result
);
_Val
=
_Result
;
return
(*
this
); } {
// extract an unsigned int
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a long
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract an unsigned long
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a long long
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract an unsigned long long
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a float
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a double
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a long double
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract a void pointer
return
(
_Common_extract_with_num_get
(
_Val
)); } {
// extract until end-of-file into a stream buffer
_Chcount
=
0
;
// behaves as an unformatted input function
const
sentry
_Ok
(*
this
,
true
);
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
if
(
_Ok
&&
_Strbuf
!=
nullptr
) {
// state okay, extract characters
for
(
int_type
_Meta
=
_Myios
::
rdbuf
()->sgetc(); ;
_Meta
=
_Myios
::
rdbuf
()->snextc()) {
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
// got a character, insert it into buffer
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Strbuf
->
sputc
(
_Traits
::to_char_type(
_Meta
)))) {
break
; }
break
; ++
_Chcount
; } }
if
(
_Chcount
=
=
0
) {
// If the function inserts no characters, it calls setstate(failbit)
_State
=
ios_base
::
failbit
; }
_Myios
::
setstate
(
_State
);
return
(*
this
); } {
// extract a metacharacter
int_type
_Meta
=
0
;
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(!
_Ok
)
_Meta
=
_Traits
::eof();
// state not okay, return EOF
else
{
// state okay, extract a character
_Meta
=
_Myios
::
rdbuf
()->sgetc();
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
))
_State
|=
ios_base
::
eofbit
|
ios_base
::
failbit
;
// end of file
else
{
// got a character, count it
_Myios
::
rdbuf
()->sbumpc(); ++
_Chcount
; } }
_Myios
::
setstate
(
_State
);
return
(
_Meta
); } {
// get up to _Count characters into NTCS
return
(
get
(
_Str
,
_Count
,
_Myios
::
widen
(
'\n'
))); }
streamsize
_Count
,
_Elem
_Delim
) {
// get up to _Count characters into NTCS, stop before _Delim
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
&&
0
<
_Count
) {
// state okay, extract characters
int_type
_Meta
=
_Myios
::
rdbuf
()->sgetc();
for
(;
0
<
--
_Count
;
_Meta
=
_Myios
::
rdbuf
()->snextc())
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
if
(
_Traits
::to_char_type(
_Meta
) ==
_Delim
)
break
;
// got a delimiter, quit
else
{
// got a character, add it to string
*
_Str
++ =
_Traits
::to_char_type(
_Meta
); ++
_Chcount
; } }
_Myios
::
setstate
(
_Chcount
=
=
0
?
_State
|
ios_base
::
failbit
:
_State
); *
_Str
=
_Elem
();
// add terminating null character
return
(*
this
); } {
// get a character
int_type
_Meta
=
get
();
if
(!
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
))
_Ch
=
_Traits
::to_char_type(
_Meta
);
return
(*
this
); } {
// extract up to newline and insert into stream buffer
return
(
get
(
_Strbuf
,
_Myios
::
widen
(
'\n'
))); } {
// extract up to delimiter and insert into stream buffer
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
) {
// state okay, use facet to extract
int_type
_Meta
=
_Myios
::
rdbuf
()->sgetc();
for
(; ;
_Meta
=
_Myios
::
rdbuf
()->snextc())
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
{
// got a character, insert it into stream buffer
_Elem
_Ch
=
_Traits
::to_char_type(
_Meta
);
if
(
_Ch
==
_Delim
||
_Traits
::eq_int_type(
_Traits
::eof(),
_Strbuf
.
sputc
(
_Ch
)))
break
;
break
; ++
_Chcount
; } }
if
(
_Chcount
=
=
0
)
_State
|=
ios_base
::
failbit
;
_Myios
::
setstate
(
_State
);
return
(*
this
); } {
// get up to _Count characters into NTCS, discard newline
return
(
getline
(
_Str
,
_Count
,
_Myios
::
widen
(
'\n'
))); }
streamsize
_Count
,
_Elem
_Delim
) {
// get up to _Count characters into NTCS, discard _Delim
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
&&
0
<
_Count
) {
// state okay, use facet to extract
int_type
_Metadelim
=
_Traits
::to_int_type(
_Delim
);
int_type
_Meta
=
_Myios
::
rdbuf
()->sgetc();
for
(; ;
_Meta
=
_Myios
::
rdbuf
()->snextc())
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
if
(
_Meta
==
_Metadelim
) {
// got a delimiter, discard it and quit
++
_Chcount
;
_Myios
::
rdbuf
()->sbumpc();
break
; }
else
if
(--
_Count
<=
0
) {
// buffer full, quit
_State
|=
ios_base
::
failbit
;
break
; }
else
{
// got a character, add it to string
*
_Str
++ =
_Traits
::to_char_type(
_Meta
); ++
_Chcount
; } } *
_Str
=
_Elem
();
// add terminating null character
_Myios
::
setstate
(
_Chcount
=
=
0
?
_State
|
ios_base
::
failbit
:
_State
);
return
(*
this
); }
int_type
_Metadelim
=
_Traits
::eof()) {
// ignore up to _Count characters, discarding delimiter
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
&&
0
<
_Count
) {
// state okay, use facet to extract
for
(;;) {
// get a metacharacter if more room in buffer
int_type
_Meta
;
if
(
_Count
!
=
(
numeric_limits
<
streamsize
>::
max
)() && --
_Count
<
0
)
break
;
// buffer full, quit
else
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
=
_Myios
::
rdbuf
()->sbumpc())) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
{
// got a character, count it
++
_Chcount
;
if
(
_Meta
==
_Metadelim
)
break
;
// got a delimiter, quit
} } }
_Myios
::
setstate
(
_State
);
return
(*
this
); } {
// read up to _Count characters into buffer
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
&&
0
<
_Count
) {
// state okay, use facet to extract
const
streamsize
_Num
=
_Myios
::
rdbuf
()->sgetn(
_Str
,
_Count
);
_Chcount
+=
_Num
;
if
(
_Num
!
=
_Count
)
_State
|=
ios_base
::
eofbit
|
ios_base
::
failbit
;
// short read
}
_Myios
::
setstate
(
_State
);
return
(*
this
); }
streamsize
_Count
) {
// read up to _Count characters into buffer, without blocking
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
const
sentry
_Ok
(*
this
,
true
);
streamsize
_Num
;
if
(!
_Ok
)
_State
|=
ios_base
::
failbit
;
// no buffer, fail
else
if
((
_Num
=
_Myios
::
rdbuf
()->in_avail()) <
0
)
_State
|=
ios_base
::
eofbit
;
// no characters available
else
if
(
0
<
_Count
&&
0
<
_Num
) {
// read available
read
(
_Str
,
_Num
<
_Count
?
_Num
:
_Count
); }
_Myios
::
setstate
(
_State
);
return
(
gcount
()); } {
// return next character, unconsumed
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Chcount
=
0
;
int_type
_Meta
=
0
;
const
sentry
_Ok
(*
this
,
true
);
if
(!
_Ok
)
_Meta
=
_Traits
::eof();
// state not okay, return EOF
else
{
// state okay, read a character
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
=
_Myios
::
rdbuf
()->sgetc()))
_State
|=
ios_base
::
eofbit
; }
_Myios
::
setstate
(
_State
);
return
(
_Meta
); } {
// put back a character
_Chcount
=
0
;
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
ios_base
::
iostate
_Oldstate
=
_Myios
::
rdstate
();
_Myios
::
clear
(
_Oldstate
& ~
ios_base
::
eofbit
);
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
) {
// state okay, put character back
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Myios
::
rdbuf
()->sputbackc(
_Ch
)))
_State
|=
ios_base
::
badbit
|
_Oldstate
; }
_Myios
::
setstate
(
_State
);
return
(*
this
); } {
// put back last read character
_Chcount
=
0
;
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
ios_base
::
iostate
_Oldstate
=
_Myios
::
rdstate
();
_Myios
::
clear
(
_Oldstate
& ~
ios_base
::
eofbit
);
const
sentry
_Ok
(*
this
,
true
);
if
(
_Ok
) {
// state okay, put character back
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Myios
::
rdbuf
()->sungetc()))
_State
|=
ios_base
::
badbit
|
_Oldstate
; }
_Myios
::
setstate
(
_State
);
return
(*
this
); } {
// get count from last extraction
return
(
_Chcount
); } {
// synchronize with input source
const
sentry
_Ok
(*
this
,
true
);
if
(
_Myios
::
rdbuf
() ==
nullptr
)
return
(-
1
);
else
if
(
_Myios
::
rdbuf
()->pubsync() == -
1
) {
// sync failed
_Myios
::
setstate
(
ios_base
::
badbit
);
return
(-
1
); }
else
return
(
0
); } {
// set input stream position to _Pos
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
ios_base
::
iostate
_Oldstate
=
_Myios
::
rdstate
();
_Myios
::
clear
(
_Oldstate
& ~
ios_base
::
eofbit
);
const
sentry
_Ok
(*
this
,
true
);
if
(!
this
->
fail
() && (
off_type
)
_Myios
::
rdbuf
()->pubseekpos(
_Pos
,
ios_base
::
in
) == -
1
)
_Myios
::
setstate
(
_State
|
ios_base
::
failbit
);
return
(*
this
); } {
// change input stream position by _Off, according to _Way
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
ios_base
::
iostate
_Oldstate
=
_Myios
::
rdstate
();
_Myios
::
clear
(
_Oldstate
& ~
ios_base
::
eofbit
);
const
sentry
_Ok
(*
this
,
true
);
if
(!
this
->
fail
() && (
off_type
)
_Myios
::
rdbuf
()->pubseekoff(
_Off
,
_Way
,
ios_base
::
in
) == -
1
)
_Myios
::
setstate
(
_State
|
ios_base
::
failbit
);
return
(*
this
); } {
// return input stream position
const
sentry
_Ok
(*
this
,
true
);
if
(!
this
->
fail
())
return
(
_Myios
::
rdbuf
()->pubseekoff(
0
,
ios_base
::
cur
,
ios_base
::
in
));
else
return
(
pos_type
(-
1
)); }
private
:
streamsize
_Chcount
;
// the character count
};
#ifndef _NATIVE_WCHAR_T_DEFINED
template<class _Elem,
class _Traits> inline
basic_istream<_Elem, _Traits>& operator>>(
basic_istream<_Elem, _Traits>& _Istr, _Elem& _Ch);
/* NOTE:
If you are not using native wchar_t, the following explicit
specialization will mask the member function (above) that treats
an unsigned short as an integer.
To read or write unsigned shorts as integers with wchar_t streams,
make wchar_t a native type with the command line option /Zc:wchar_t.
*/
template<> inline
basic_istream<unsigned short, char_traits<unsigned short> >&
__CLR_OR_THIS_CALL basic_istream<unsigned short,
char_traits<unsigned short> >::operator>>(unsigned short& _Ch)
{ // extract a character
return (_STD operator>>(*this, _Ch));
}
#endif /* _NATIVE_WCHAR_T_DEFINED */
#if defined(_DLL_CPPLIB)
#if !defined(_CRTBLD) || defined(__FORCE_INSTANCE)
#ifdef __FORCE_INSTANCE
template class _CRTIMP2_PURE_IMPORT basic_istream<unsigned short,
char_traits<unsigned short> >;
#endif /* __FORCE_INSTANCE */ #endif /* defined(_DLL_CPPLIB) */
// CLASS TEMPLATE basic_iostream
template
<
class
_Elem
,
class
_Traits
>
class
basic_iostream
:
public
basic_istream
<
_Elem
,
_Traits
>,
public
basic_ostream
<
_Elem
,
_Traits
> {
// control insertions and extractions from a stream buffer
public
:
typedef
basic_istream
<
_Elem
,
_Traits
>
_Myis
;
typedef
basic_ostream
<
_Elem
,
_Traits
>
_Myos
;
typedef
basic_ios
<
_Elem
,
_Traits
>
_Myios
;
typedef
_Elem
char_type
;
typedef
_Traits
traits_type
;
typedef
typename
_Traits
::int_type
int_type
;
typedef
typename
_Traits
::pos_type
pos_type
;
typedef
typename
_Traits
::off_type
off_type
; :
_Myis
(
_Strbuf
,
false
),
_Myos
(
_Noinit
,
false
) {
// construct from stream buffer pointer
}
protected
: :
_Myis
(
_Right
.
rdbuf
(),
false
),
_Myos
(
_Noinit
,
false
) {
// construct by moving _Right
_Myios
::
init
(); } {
// move from _Right
this
->
swap
(
_Right
);
return
(*
this
); } {
// swap with _Right
_Myios
::
swap
(
_Right
); }
public
: {
// destroy the object
} };
#if defined(_DLL_CPPLIB)
#if !defined(_CRTBLD) || defined(__FORCE_INSTANCE)
#ifdef __FORCE_INSTANCE
template class _CRTIMP2_PURE_IMPORT basic_iostream<unsigned short,
char_traits<unsigned short> >;
#endif /* __FORCE_INSTANCE */ #endif /* defined(_DLL_CPPLIB) */
// EXTRACTORS
template
<
class
_Elem
,
class
_Traits
>
inline
basic_istream
<
_Elem
,
_Traits
>&
operator
>
>
(
basic_istream
<
_Elem
,
_Traits
>&
_Istr
,
_Elem
*
_Str
) {
// extract NTBS
typedef
basic_istream
<
_Elem
,
_Traits
>
_Myis
;
typedef
ctype
<
_Elem
>
_Ctype
;
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
_Elem
*
_Str0
=
_Str
;
const
typename
_Myis
::
sentry
_Ok
(
_Istr
);
if
(
_Ok
) {
// state okay, extract characters
streamsize
_Count
=
0
<
_Istr
.
width
() ?
_Istr
.
width
() : (
numeric_limits
<
streamsize
>::
max
)();
typename
_Myis
::
int_type
_Meta
=
_Istr
.
rdbuf
()->sgetc();
_Elem
_Ch
;
for
(;
0
<
--
_Count
;
_Meta
=
_Istr
.
rdbuf
()->snextc())
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
if
(
_Ctype_fac
.
is
(
_Ctype
::
space
,
_Ch
=
_Traits
::to_char_type(
_Meta
)) ||
_Ch
==
_Elem
())
break
;
// whitespace or nul, quit
else
*
_Str
++ =
_Traits
::to_char_type(
_Meta
);
// add it to string
} *
_Str
=
_Elem
();
// add terminating null character
_Istr
.
width
(
0
);
_Istr
.
setstate
(
_Str
=
=
_Str0
?
_State
|
ios_base
::
failbit
:
_State
);
return
(
_Istr
); }
template
<
class
_Elem
,
class
_Traits
>
inline
basic_istream
<
_Elem
,
_Traits
>&
operator
>
>
(
basic_istream
<
_Elem
,
_Traits
>&
_Istr
,
_Elem
&
_Ch
) {
// extract a character
typedef
basic_istream
<
_Elem
,
_Traits
>
_Myis
;
typename
_Myis
::
int_type
_Meta
;
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
const
typename
_Myis
::
sentry
_Ok
(
_Istr
);
if
(
_Ok
) {
// state okay, extract characters
_Meta
=
_Istr
.
rdbuf
()->sbumpc();
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
))
_State
|=
ios_base
::
eofbit
|
ios_base
::
failbit
;
// end of file
else
_Ch
=
_Traits
::to_char_type(
_Meta
);
// got a character
}
_Istr
.
setstate
(
_State
);
return
(
_Istr
); }
template
<
class
_Traits
>
inline
basic_istream
<
char
,
_Traits
>&
operator
>
>
(
basic_istream
<
char
,
_Traits
>&
_Istr
,
signed
char
*
_Str
) {
// extract a signed char NTBS
return
(
_Istr
>> (
char
*)
_Str
); }
template
<
class
_Traits
>
inline
basic_istream
<
char
,
_Traits
>&
operator
>
>
(
basic_istream
<
char
,
_Traits
>&
_Istr
,
signed
char
&
_Ch
) {
// extract a signed char
return
(
_Istr
>> (
char
&)
_Ch
); }
template
<
class
_Traits
>
inline
basic_istream
<
char
,
_Traits
>&
operator
>
>
(
basic_istream
<
char
,
_Traits
>&
_Istr
,
unsigned
char
*
_Str
) {
// extract an unsigned char NTBS
return
(
_Istr
>> (
char
*)
_Str
); }
template
<
class
_Traits
>
inline
basic_istream
<
char
,
_Traits
>&
operator
>
>
(
basic_istream
<
char
,
_Traits
>&
_Istr
,
unsigned
char
&
_Ch
) {
// extract an unsigned char
return
(
_Istr
>> (
char
&)
_Ch
); }
template
<
class
_Istr
,
class
_Ty
,
class
=
void
>
struct
_Can_stream_in
:
false_type
{ };
template
<
class
_Istr
,
class
_Ty
> :
true_type
{ };
template
<
class
_Istr
,
class
_Ty
,
enable_if_t
<
conjunction_v
<
// avoid infinite recursion
negation
<
is_lvalue_reference
<
_Istr
>>,
is_base_of
<
ios_base
,
_Istr
>,
_Can_stream_in
<
_Istr
,
_Ty
>>,
int
> =
0
>
inline
_Istr
&&
operator
>
>
(
_Istr
&&
_Is
,
_Ty
&&
_Val
) {
// extract from rvalue stream
}
// MANIPULATORS
template
<
class
_Elem
,
class
_Traits
>
inline
basic_istream
<
_Elem
,
_Traits
>& {
// consume whitespace
const
typename
basic_istream
<
_Elem
,
_Traits
>::
sentry
_Ok
(
_Istr
,
true
);
if
(
_Ok
) {
// state okay, extract characters
ios_base
::
iostate
_State
=
ios_base
::
goodbit
;
for
(
typename
_Traits
::int_type
_Meta
=
_Istr
.
rdbuf
()->sgetc(); ;
_Meta
=
_Istr
.
rdbuf
()->snextc()) {
if
(
_Traits
::eq_int_type(
_Traits
::eof(),
_Meta
)) {
// end of file, quit
_State
|=
ios_base
::
eofbit
;
break
; }
else
if
(!
_Ctype_fac
.
is
(
ctype
<
_Elem
>::
space
,
_Traits
::to_char_type(
_Meta
))) {
break
;
// not whitespace, quit
} }
_Istr
.
setstate
(
_State
); }
return
(
_Istr
); }
#pragma pop_macro("new")
_STL_RESTORE_CLANG_WARNINGS
/* * Copyright (c) by P.J. Plauger. All rights reserved. * Consult your license regarding permissions and restrictions. V6.50:0009 */