re PR libstdc++/24645 (Commonize arithmetic inserters/extractors bodies)

2006-01-02  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/24645
	* include/std/std_istream.h (basic_istream<>::_M_extract): New.
	(operator>>(bool&), operator>>(short&), operator>>(unsigned short&),
	operator>>(int&), operator>>(unsigned int&), operator>>(long&),
	operator>>(unsigned long&), operator>>(long long&), operator>>
	(unsigned long long&), operator>>(float&), operator>>(double&),
	operator>>(long double&), operator>>(void*&)): Use it.
	* include/bits/istream.tcc (basic_istream<>::_M_extract): Define.
	* include/std/std_ostream.h (basic_ostream<>::_M_insert): New.
	(operator<<(long), operator<<(unsigned long), operator<<(bool),
	operator<<(short), operator<<(unsigned short), operator<<(int),
	operator<<(unsigned int), operator<<(long long), operator<<
	(unsigned long long), operator<<(double), operator<<(float),
	operator<<(long double), operator<<(const void*): Use it.
	* include/bits/ostream.tcc (basic_ostream<>::_M_insert): Define.
	* src/istream-inst.cc: Add _M_insert instantiations.
	* src/ostream-inst.cc: Add _M_extract instantiations.
	* config/abi/pre/gnu.ver: Export the new symbols @GLIBCXX_3.4.7;
	detail existing @GLIBCXX_3.4 exports of basic_ostream, num_put,
	money_put, etc., symbols to avoid exporting _M_insert symbols
	@GLIBCXX_3.4.

From-SVN: r109236
This commit is contained in:
Paolo Carlini 2006-01-02 09:57:49 +00:00 committed by Paolo Carlini
parent 5f0926cd78
commit 49d5c016da
8 changed files with 327 additions and 700 deletions

View file

@ -1,3 +1,27 @@
2006-01-02 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/24645
* include/std/std_istream.h (basic_istream<>::_M_extract): New.
(operator>>(bool&), operator>>(short&), operator>>(unsigned short&),
operator>>(int&), operator>>(unsigned int&), operator>>(long&),
operator>>(unsigned long&), operator>>(long long&), operator>>
(unsigned long long&), operator>>(float&), operator>>(double&),
operator>>(long double&), operator>>(void*&)): Use it.
* include/bits/istream.tcc (basic_istream<>::_M_extract): Define.
* include/std/std_ostream.h (basic_ostream<>::_M_insert): New.
(operator<<(long), operator<<(unsigned long), operator<<(bool),
operator<<(short), operator<<(unsigned short), operator<<(int),
operator<<(unsigned int), operator<<(long long), operator<<
(unsigned long long), operator<<(double), operator<<(float),
operator<<(long double), operator<<(const void*): Use it.
* include/bits/ostream.tcc (basic_ostream<>::_M_insert): Define.
* src/istream-inst.cc: Add _M_insert instantiations.
* src/ostream-inst.cc: Add _M_extract instantiations.
* config/abi/pre/gnu.ver: Export the new symbols @GLIBCXX_3.4.7;
detail existing @GLIBCXX_3.4 exports of basic_ostream, num_put,
money_put, etc., symbols to avoid exporting _M_insert symbols
@GLIBCXX_3.4.
2005-12-28 Paolo Carlini <pcarlini@suse.de>
* docs/html/ext/lwg-active.html, lwg-defects.html: Import Revision 40.

View file

@ -42,7 +42,10 @@ GLIBCXX_3.4 {
std::basic_[j-n]*;
std::basic_o[a-e]*;
# std::basic_ofstream;
std::basic_o[g-z]*;
# std::basic_o[g-z]*;
std::basic_o[g-r]*;
std::basic_ostr[a-d]*;
std::basic_ostr[f-z]*;
std::basic_[p-r]*;
std::basic_streambuf*;
# std::basic_string
@ -86,7 +89,12 @@ GLIBCXX_3.4 {
std::locale::_[J-Ra-z]*;
std::locale::_S_normalize_category*;
std::locale::_[T-Za-z]*;
std::[A-Zm-r]*;
# std::[A-Zm-r]*;
std::[A-Zm-n]*;
std::[p-r]*;
std::ostrstream*;
std::out_of_range*;
std::overflow_error*;
std::set_new_handler*;
std::set_terminate*;
std::set_unexpected*;
@ -257,7 +265,7 @@ GLIBCXX_3.4 {
_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[il][ijlm];
_ZNSt13basic_istreamIwSt11char_traitsIwEErsE*;
# std::istream operators and inserters
# std::istream operators and extractors
_ZSt7getlineI[cw]St11char_traitsI[cw]ESaI[cw]EERSt13basic_istream*;
_ZSt2wsI[cw]St11char_traitsI[cw]EE*;
_ZStrsI[cw]St11char_traitsI[cw]EERSt13basic_istream*;
@ -267,6 +275,37 @@ GLIBCXX_3.4 {
_ZStrsIe[cw]St11char_traitsI[cw]EERSt13basic_istream*;
_ZStrsIf[cw]St11char_traitsI[cw]EERSt13basic_istream*;
# std::basic_ostream<char>
_ZNSoC*;
_ZNSoD*;
_ZNKSo6sentrycvbEv;
_ZNSo8_M_write*;
_ZNSo[0-9][a-z]*;
_ZNSolsE*;
# std::basic_ostream<wchar_t>
_ZNSt13basic_ostreamIwSt11char_traitsIwEEC*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEED*;
_ZNKSt13basic_ostreamIwSt11char_traitsIwEE[0-9][a-z]*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpE*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKw*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentry*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_write*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*;
# std::ostream operators and inserters
_ZSt4end[ls]I[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
_ZSt5flushI[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
_ZStlsI[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
_ZStlsI[cw]St11char_traitsI[cw]ESaI[cw]EERSt13basic_ostream*;
_ZStlsISt11char_traitsI[cw]EERSt13basic_ostream*;
_ZStlsId[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
_ZStlsIe[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
_ZStlsIf[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
# std::locale destructors
_ZNSt6localeD*;
@ -287,9 +326,15 @@ GLIBCXX_3.4 {
# std::num_get
_ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
# std::num_put
_ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
# std::money_get
_ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
# std::money_put
_ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
# std::_Rb_tree
_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base;
_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base;
@ -328,25 +373,25 @@ GLIBCXX_3.4 {
_ZN9__gnu_cxx18__exchange_and_add*;
# __gnu_debug
_ZN10__gnu_norm15_List_node_base4hookEPS0_;
_ZN10__gnu_norm15_List_node_base4swapERS0_S1_;
_ZN10__gnu_norm15_List_node_base6unhookEv;
_ZN10__gnu_norm15_List_node_base7reverseEv;
_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_;
_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb;
_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv;
_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv;
_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_;
_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv;
_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv;
_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv;
_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_;
_ZNK11__gnu_debug16_Error_formatter8_M_errorEv;
_ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE;
_ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc;
_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_;
_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc;
_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc;
_ZN10__gnu_norm15_List_node_base4hookEPS0_;
_ZN10__gnu_norm15_List_node_base4swapERS0_S1_;
_ZN10__gnu_norm15_List_node_base6unhookEv;
_ZN10__gnu_norm15_List_node_base7reverseEv;
_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_;
_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb;
_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv;
_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv;
_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_;
_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv;
_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv;
_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv;
_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_;
_ZNK11__gnu_debug16_Error_formatter8_M_errorEv;
_ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE;
_ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc;
_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_;
_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc;
_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc;
# operator new(size_t)
_Znw[jm];
@ -596,25 +641,30 @@ GLIBCXX_3.4.7 {
_ZNSt6locale5_Impl16_M_install_cacheEPKNS_5facetE[jm];
_ZNSt10__gnu_norm15_List_node_base4hookEPS0_;
_ZNSt10__gnu_norm15_List_node_base4swapERS0_S1_;
_ZNSt10__gnu_norm15_List_node_base6unhookEv;
_ZNSt10__gnu_norm15_List_node_base7reverseEv;
_ZNSt10__gnu_norm15_List_node_base8transferEPS0_S1_;
_ZNKSt11__gnu_debug16_Error_formatter8_M_errorEv;
_ZNKSt11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE;
_ZNKSt11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc;
_ZNKSt11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_;
_ZNKSt11__gnu_debug16_Error_formatter13_M_print_wordEPKc;
_ZNKSt11__gnu_debug16_Error_formatter15_M_print_stringEPKc;
_ZNKSt11__gnu_debug19_Safe_iterator_base11_M_singularEv;
_ZNKSt11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_;
_ZNSt11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb;
_ZNSt11__gnu_debug19_Safe_iterator_base9_M_detachEv;
_ZNSt11__gnu_debug19_Safe_sequence_base13_M_detach_allEv;
_ZNSt11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv;
_ZNSt11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv;
_ZNSt11__gnu_debug19_Safe_sequence_base7_M_swapERS0_;
_ZNSt10__gnu_norm15_List_node_base4hookEPS0_;
_ZNSt10__gnu_norm15_List_node_base4swapERS0_S1_;
_ZNSt10__gnu_norm15_List_node_base6unhookEv;
_ZNSt10__gnu_norm15_List_node_base7reverseEv;
_ZNSt10__gnu_norm15_List_node_base8transferEPS0_S1_;
_ZNKSt11__gnu_debug16_Error_formatter8_M_errorEv;
_ZNKSt11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE;
_ZNKSt11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc;
_ZNKSt11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_;
_ZNKSt11__gnu_debug16_Error_formatter13_M_print_wordEPKc;
_ZNKSt11__gnu_debug16_Error_formatter15_M_print_stringEPKc;
_ZNKSt11__gnu_debug19_Safe_iterator_base11_M_singularEv;
_ZNKSt11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_;
_ZNSt11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb;
_ZNSt11__gnu_debug19_Safe_iterator_base9_M_detachEv;
_ZNSt11__gnu_debug19_Safe_sequence_base13_M_detach_allEv;
_ZNSt11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv;
_ZNSt11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv;
_ZNSt11__gnu_debug19_Safe_sequence_base7_M_swapERS0_;
_ZNSo9_M_insertI*;
_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertI*;
_ZNSi10_M_extractI*;
_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractI*;
} GLIBCXX_3.4.6;

View file

@ -110,310 +110,27 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(bool& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(short& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
long __l;
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __l);
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 118. basic_istream uses nonexistent num_get member functions.
if (!(__err & ios_base::failbit)
&& (numeric_limits<short>::min() <= __l
&& __l <= numeric_limits<short>::max()))
__n = __l;
else
__err |= ios_base::failbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(unsigned short& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(int& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
long __l;
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __l);
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 118. basic_istream uses nonexistent num_get member functions.
if (!(__err & ios_base::failbit)
&& (numeric_limits<int>::min() <= __l
&& __l <= numeric_limits<int>::max()))
__n = __l;
else
__err |= ios_base::failbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(unsigned int& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(long& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(unsigned long& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
#ifdef _GLIBCXX_USE_LONG_LONG
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(long long& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(unsigned long long& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
#endif
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(float& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(double& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(long double& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
operator>>(void*& __n)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __n);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _ValueT>
basic_istream<_CharT, _Traits>&
basic_istream<_CharT, _Traits>::
_M_extract(_ValueT& __v)
{
sentry __cerb(*this, false);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_get_type& __ng = __check_facet(this->_M_num_get);
__ng.get(*this, 0, *this, __err, __v);
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_istream<_CharT, _Traits>&

View file

@ -97,333 +97,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(bool __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(short __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
long __l;
const ios_base::fmtflags __fmt = (this->flags()
& ios_base::basefield);
if (__fmt == ios_base::oct || __fmt == ios_base::hex)
__l = static_cast<long>(static_cast<unsigned short>(__n));
else
__l = static_cast<long>(__n);
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __l).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(unsigned short __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(),
static_cast<unsigned long>(__n)).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(int __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
long __l;
const ios_base::fmtflags __fmt = (this->flags()
& ios_base::basefield);
if (__fmt == ios_base::oct || __fmt == ios_base::hex)
__l = static_cast<long>(static_cast<unsigned int>(__n));
else
__l = static_cast<long>(__n);
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __l).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(unsigned int __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(),
static_cast<unsigned long>(__n)).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(long __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(unsigned long __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
#ifdef _GLIBCXX_USE_LONG_LONG
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(long long __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(unsigned long long __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
#endif
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(float __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(),
static_cast<double>(__n)).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(double __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(long double __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
operator<<(const void* __n)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __n).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _ValueT>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::
_M_insert(_ValueT __v)
{
sentry __cerb(*this);
if (__cerb)
{
ios_base::iostate __err = ios_base::iostate(ios_base::goodbit);
try
{
const __num_put_type& __np = __check_facet(this->_M_num_put);
if (__np.put(*this, *this, this->fill(), __v).failed())
__err |= ios_base::badbit;
}
catch(...)
{ this->_M_setstate(ios_base::badbit); }
if (__err)
this->setstate(__err);
}
return *this;
}
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
basic_ostream<_CharT, _Traits>::

View file

@ -166,45 +166,86 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @c num_get facet) to parse the input data.
*/
__istream_type&
operator>>(bool& __n);
operator>>(bool& __n)
{ return _M_extract(__n); }
__istream_type&
operator>>(short& __n);
operator>>(short& __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 118. basic_istream uses nonexistent num_get member functions.
long __l;
_M_extract(__l);
if (!this->fail())
{
if (numeric_limits<short>::min() <= __l
&& __l <= numeric_limits<short>::max())
__n = __l;
else
this->setstate(ios_base::failbit);
}
return *this;
}
__istream_type&
operator>>(unsigned short& __n);
operator>>(unsigned short& __n)
{ return _M_extract(__n); }
__istream_type&
operator>>(int& __n);
operator>>(int& __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 118. basic_istream uses nonexistent num_get member functions.
long __l;
_M_extract(__l);
if (!this->fail())
{
if (numeric_limits<int>::min() <= __l
&& __l <= numeric_limits<int>::max())
__n = __l;
else
this->setstate(ios_base::failbit);
}
return *this;
}
__istream_type&
operator>>(unsigned int& __n);
operator>>(unsigned int& __n)
{ return _M_extract(__n); }
__istream_type&
operator>>(long& __n);
operator>>(long& __n)
{ return _M_extract(__n); }
__istream_type&
operator>>(unsigned long& __n);
operator>>(unsigned long& __n)
{ return _M_extract(__n); }
#ifdef _GLIBCXX_USE_LONG_LONG
__istream_type&
operator>>(long long& __n);
operator>>(long long& __n)
{ return _M_extract(__n); }
__istream_type&
operator>>(unsigned long long& __n);
operator>>(unsigned long long& __n)
{ return _M_extract(__n); }
#endif
__istream_type&
operator>>(float& __f);
operator>>(float& __f)
{ return _M_extract(__f); }
__istream_type&
operator>>(double& __f);
operator>>(double& __f)
{ return _M_extract(__f); }
__istream_type&
operator>>(long double& __f);
operator>>(long double& __f)
{ return _M_extract(__f); }
__istream_type&
operator>>(void*& __p);
operator>>(void*& __p)
{ return _M_extract(__p); }
/**
* @brief Extracting into another streambuf.
@ -572,6 +613,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
protected:
explicit
basic_istream(): _M_gcount(streamsize(0)) { }
template<typename _ValueT>
__istream_type&
_M_extract(_ValueT& __v);
};
// Explicit specialization declarations, defined in src/istream.cc.

View file

@ -164,45 +164,86 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @c num_get facet) to perform numeric formatting.
*/
__ostream_type&
operator<<(long __n);
operator<<(long __n)
{ return _M_insert(__n); }
__ostream_type&
operator<<(unsigned long __n);
operator<<(unsigned long __n)
{ return _M_insert(__n); }
__ostream_type&
operator<<(bool __n);
operator<<(bool __n)
{ return _M_insert(__n); }
__ostream_type&
operator<<(short __n);
operator<<(short __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
if (__fmt == ios_base::oct || __fmt == ios_base::hex)
return _M_insert(static_cast<long>(static_cast<unsigned short>(__n)));
else
return _M_insert(static_cast<long>(__n));
}
__ostream_type&
operator<<(unsigned short __n);
operator<<(unsigned short __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
return _M_insert(static_cast<unsigned long>(__n));
}
__ostream_type&
operator<<(int __n);
operator<<(int __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
const ios_base::fmtflags __fmt = this->flags() & ios_base::basefield;
if (__fmt == ios_base::oct || __fmt == ios_base::hex)
return _M_insert(static_cast<long>(static_cast<unsigned int>(__n)));
else
return _M_insert(static_cast<long>(__n));
}
__ostream_type&
operator<<(unsigned int __n);
operator<<(unsigned int __n)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
return _M_insert(static_cast<unsigned long>(__n));
}
#ifdef _GLIBCXX_USE_LONG_LONG
__ostream_type&
operator<<(long long __n);
operator<<(long long __n)
{ return _M_insert(__n); }
__ostream_type&
operator<<(unsigned long long __n);
operator<<(unsigned long long __n)
{ return _M_insert(__n); }
#endif
__ostream_type&
operator<<(double __f);
operator<<(double __f)
{ return _M_insert(__f); }
__ostream_type&
operator<<(float __f);
operator<<(float __f)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 117. basic_ostream uses nonexistent num_put member functions.
return _M_insert(static_cast<double>(__f));
}
__ostream_type&
operator<<(long double __f);
operator<<(long double __f)
{ return _M_insert(__f); }
__ostream_type&
operator<<(const void* __p);
operator<<(const void* __p)
{ return _M_insert(__p); }
/**
* @brief Extracting from another streambuf.
@ -339,6 +380,10 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
protected:
explicit
basic_ostream() { }
template<typename _ValueT>
__ostream_type&
_M_insert(_ValueT __v);
};
/**

View file

@ -53,6 +53,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template istream& operator>>(istream&, _Setprecision);
template istream& operator>>(istream&, _Setw);
template istream& istream::_M_extract(unsigned short&);
template istream& istream::_M_extract(unsigned int&);
template istream& istream::_M_extract(long&);
template istream& istream::_M_extract(unsigned long&);
template istream& istream::_M_extract(bool&);
#ifdef _GLIBCXX_USE_LONG_LONG
template istream& istream::_M_extract(long long&);
template istream& istream::_M_extract(unsigned long long&);
#endif
template istream& istream::_M_extract(float&);
template istream& istream::_M_extract(double&);
template istream& istream::_M_extract(long double&);
template istream& istream::_M_extract(void*&);
#ifdef _GLIBCXX_USE_WCHAR_T
template class basic_istream<wchar_t>;
template wistream& ws(wistream&);
@ -65,6 +79,20 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template wistream& operator>>(wistream&, _Setbase);
template wistream& operator>>(wistream&, _Setprecision);
template wistream& operator>>(wistream&, _Setw);
template wistream& wistream::_M_extract(unsigned short&);
template wistream& wistream::_M_extract(unsigned int&);
template wistream& wistream::_M_extract(long&);
template wistream& wistream::_M_extract(unsigned long&);
template wistream& wistream::_M_extract(bool&);
#ifdef _GLIBCXX_USE_LONG_LONG
template wistream& wistream::_M_extract(long long&);
template wistream& wistream::_M_extract(unsigned long long&);
#endif
template wistream& wistream::_M_extract(float&);
template wistream& wistream::_M_extract(double&);
template wistream& wistream::_M_extract(long double&);
template wistream& wistream::_M_extract(void*&);
#endif
_GLIBCXX_END_NAMESPACE

View file

@ -1,6 +1,6 @@
// Explicit instantiation file.
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2005
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@ -56,6 +56,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template ostream& operator<<(ostream&, _Setprecision);
template ostream& operator<<(ostream&, _Setw);
template ostream& ostream::_M_insert(long);
template ostream& ostream::_M_insert(unsigned long);
template ostream& ostream::_M_insert(bool);
#ifdef _GLIBCXX_USE_LONG_LONG
template ostream& ostream::_M_insert(long long);
template ostream& ostream::_M_insert(unsigned long long);
#endif
template ostream& ostream::_M_insert(double);
template ostream& ostream::_M_insert(long double);
template ostream& ostream::_M_insert(const void*);
#ifdef _GLIBCXX_USE_WCHAR_T
template class basic_ostream<wchar_t>;
template wostream& endl(wostream&);
@ -72,6 +83,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
template wostream& operator<<(wostream&, _Setbase);
template wostream& operator<<(wostream&, _Setprecision);
template wostream& operator<<(wostream&, _Setw);
template wostream& wostream::_M_insert(long);
template wostream& wostream::_M_insert(unsigned long);
template wostream& wostream::_M_insert(bool);
#ifdef _GLIBCXX_USE_LONG_LONG
template wostream& wostream::_M_insert(long long);
template wostream& wostream::_M_insert(unsigned long long);
#endif
template wostream& wostream::_M_insert(double);
template wostream& wostream::_M_insert(long double);
template wostream& wostream::_M_insert(const void*);
#endif
_GLIBCXX_END_NAMESPACE