diff --git a/libcxx/include/__ostream/basic_ostream.h b/libcxx/include/__ostream/basic_ostream.h index cf4d26167aebd..97226476e5ef0 100644 --- a/libcxx/include/__ostream/basic_ostream.h +++ b/libcxx/include/__ostream/basic_ostream.h @@ -88,6 +88,55 @@ class _LIBCPP_TEMPLATE_VIS basic_ostream : virtual public basic_ios<_CharT, _Tra return *this; } + template + _LIBCPP_HIDE_FROM_ABI basic_ostream& __put_num(_Tp __value) { +# if _LIBCPP_HAS_EXCEPTIONS + try { +# endif // _LIBCPP_HAS_EXCEPTIONS + sentry __s(*this); + if (__s) { + using _Fp = num_put >; + const _Fp& __facet = std::use_facet<_Fp>(this->getloc()); + if (__facet.put(*this, *this, this->fill(), __value).failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +# if _LIBCPP_HAS_EXCEPTIONS + } catch (...) { + this->__set_badbit_and_consider_rethrow(); + } +# endif // _LIBCPP_HAS_EXCEPTIONS + return *this; + } + + template + _LIBCPP_HIDE_FROM_ABI basic_ostream& __put_num_integer_promote(_Tp __value) { +# if _LIBCPP_HAS_EXCEPTIONS + try { +# endif // _LIBCPP_HAS_EXCEPTIONS + sentry __s(*this); + if (__s) { + ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; + + using _Fp = num_put >; + const _Fp& __facet = std::use_facet<_Fp>(this->getloc()); + if (__facet + .put(*this, + *this, + this->fill(), + __flags == ios_base::oct || __flags == ios_base::hex + ? static_cast<__copy_unsigned_t<_Tp, long> >(std::__to_unsigned_like(__value)) + : static_cast<__copy_unsigned_t<_Tp, long> >(__value)) + .failed()) + this->setstate(ios_base::badbit | ios_base::failbit); + } +# if _LIBCPP_HAS_EXCEPTIONS + } catch (...) { + this->__set_badbit_and_consider_rethrow(); + } +# endif // _LIBCPP_HAS_EXCEPTIONS + return *this; + } + basic_ostream& operator<<(bool __n); basic_ostream& operator<<(short __n); basic_ostream& operator<<(unsigned short __n); @@ -225,276 +274,67 @@ basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(bool __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(short __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, - *this, - this->fill(), - __flags == ios_base::oct || __flags == ios_base::hex - ? static_cast(static_cast(__n)) - : static_cast(__n)) - .failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num_integer_promote(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned short __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), static_cast(__n)).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num_integer_promote(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(int __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - ios_base::fmtflags __flags = ios_base::flags() & ios_base::basefield; - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, - *this, - this->fill(), - __flags == ios_base::oct || __flags == ios_base::hex - ? static_cast(static_cast(__n)) - : static_cast(__n)) - .failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num_integer_promote(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned int __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), static_cast(__n)).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num_integer_promote(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long long __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(unsigned long long __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(float __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), static_cast(__n)).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return *this << static_cast(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(double __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(long double __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template basic_ostream<_CharT, _Traits>& basic_ostream<_CharT, _Traits>::operator<<(const void* __n) { -# if _LIBCPP_HAS_EXCEPTIONS - try { -# endif // _LIBCPP_HAS_EXCEPTIONS - sentry __s(*this); - if (__s) { - typedef num_put > _Fp; - const _Fp& __f = std::use_facet<_Fp>(this->getloc()); - if (__f.put(*this, *this, this->fill(), __n).failed()) - this->setstate(ios_base::badbit | ios_base::failbit); - } -# if _LIBCPP_HAS_EXCEPTIONS - } catch (...) { - this->__set_badbit_and_consider_rethrow(); - } -# endif // _LIBCPP_HAS_EXCEPTIONS - return *this; + return __put_num(__n); } template