diff options
Diffstat (limited to 'contrib/libstdc++/include/bits/basic_ios.tcc')
-rw-r--r-- | contrib/libstdc++/include/bits/basic_ios.tcc | 165 |
1 files changed, 73 insertions, 92 deletions
diff --git a/contrib/libstdc++/include/bits/basic_ios.tcc b/contrib/libstdc++/include/bits/basic_ios.tcc index 1c9cd3b7256a..fcb4b02493f6 100644 --- a/contrib/libstdc++/include/bits/basic_ios.tcc +++ b/contrib/libstdc++/include/bits/basic_ios.tcc @@ -1,4 +1,4 @@ -// basic_ios locale and locale-related member functions -*- C++ -*- +// basic_ios member functions -*- C++ -*- // Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. // @@ -27,8 +27,8 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#ifndef _CPP_BITS_BASICIOS_TCC -#define _CPP_BITS_BASICIOS_TCC 1 +#ifndef _BASIC_IOS_TCC +#define _BASIC_IOS_TCC 1 #pragma GCC system_header @@ -37,17 +37,17 @@ namespace std template<typename _CharT, typename _Traits> void basic_ios<_CharT, _Traits>::clear(iostate __state) - { + { if (this->rdbuf()) _M_streambuf_state = __state; else _M_streambuf_state = __state | badbit; - if ((this->rdstate() & this->exceptions())) - __throw_ios_failure("basic_ios::clear(iostate) caused exception"); + if (this->exceptions() & this->rdstate()) + __throw_ios_failure(__N("basic_ios::clear")); } - + template<typename _CharT, typename _Traits> - basic_streambuf<_CharT, _Traits>* + basic_streambuf<_CharT, _Traits>* basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __sb) { basic_streambuf<_CharT, _Traits>* __old = _M_streambuf; @@ -60,74 +60,66 @@ namespace std basic_ios<_CharT, _Traits>& basic_ios<_CharT, _Traits>::copyfmt(const basic_ios& __rhs) { - // Per 27.1.1.1, do not call imbue, yet must trash all caches - // associated with imbue() - - // Alloc any new word array first, so if it fails we have "rollback". - _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ? - _M_local_word : new _Words[__rhs._M_word_size]; - - // Bump refs before doing callbacks, for safety. - _Callback_list* __cb = __rhs._M_callbacks; - if (__cb) - __cb->_M_add_reference(); - _M_call_callbacks(erase_event); - if (_M_word != _M_local_word) + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 292. effects of a.copyfmt (a) + if (this != &__rhs) { - delete [] _M_word; - _M_word = 0; + // Per 27.1.1, do not call imbue, yet must trash all caches + // associated with imbue() + + // Alloc any new word array first, so if it fails we have "rollback". + _Words* __words = (__rhs._M_word_size <= _S_local_word_size) ? + _M_local_word : new _Words[__rhs._M_word_size]; + + // Bump refs before doing callbacks, for safety. + _Callback_list* __cb = __rhs._M_callbacks; + if (__cb) + __cb->_M_add_reference(); + _M_call_callbacks(erase_event); + if (_M_word != _M_local_word) + { + delete [] _M_word; + _M_word = 0; + } + _M_dispose_callbacks(); + + // NB: Don't want any added during above. + _M_callbacks = __cb; + for (int __i = 0; __i < __rhs._M_word_size; ++__i) + __words[__i] = __rhs._M_word[__i]; + if (_M_word != _M_local_word) + { + delete [] _M_word; + _M_word = 0; + } + _M_word = __words; + _M_word_size = __rhs._M_word_size; + + this->flags(__rhs.flags()); + this->width(__rhs.width()); + this->precision(__rhs.precision()); + this->tie(__rhs.tie()); + this->fill(__rhs.fill()); + _M_ios_locale = __rhs.getloc(); + _M_cache_locale(_M_ios_locale); + + _M_call_callbacks(copyfmt_event); + + // The next is required to be the last assignment. + this->exceptions(__rhs.exceptions()); } - _M_dispose_callbacks(); - - _M_callbacks = __cb; // NB: Don't want any added during above. - for (int __i = 0; __i < __rhs._M_word_size; ++__i) - __words[__i] = __rhs._M_word[__i]; - if (_M_word != _M_local_word) - { - delete [] _M_word; - _M_word = 0; - } - _M_word = __words; - _M_word_size = __rhs._M_word_size; - - this->flags(__rhs.flags()); - this->width(__rhs.width()); - this->precision(__rhs.precision()); - this->tie(__rhs.tie()); - this->fill(__rhs.fill()); - _M_ios_locale = __rhs.getloc(); - - // This removes the link to __rhs locale cache - _M_call_callbacks(copyfmt_event); - - _M_cache_locale(_M_ios_locale); - - - // The next is required to be the last assignment. - this->exceptions(__rhs.exceptions()); - return *this; } template<typename _CharT, typename _Traits> char basic_ios<_CharT, _Traits>::narrow(char_type __c, char __dfault) const - { - char __ret = __dfault; - if (_M_check_facet(_M_fctype)) - __ret = _M_fctype->narrow(__c, __dfault); - return __ret; - } + { return __check_facet(_M_ctype).narrow(__c, __dfault); } template<typename _CharT, typename _Traits> _CharT basic_ios<_CharT, _Traits>::widen(char __c) const - { - char_type __ret = char_type(); - if (_M_check_facet(_M_fctype)) - __ret = _M_fctype->widen(__c); - return __ret; - } + { return __check_facet(_M_ctype).widen(__c); } // Locales: template<typename _CharT, typename _Traits> @@ -148,8 +140,9 @@ namespace std { // NB: This may be called more than once on the same object. ios_base::_M_init(); + + // Cache locale data and specific facets used by iostreams. _M_cache_locale(_M_ios_locale); - _M_tie = 0; // NB: The 27.4.4.1 Postconditions Table specifies requirements // after basic_ios::init() has been called. As part of this, @@ -166,6 +159,7 @@ namespace std _M_fill = _CharT(); _M_fill_init = false; + _M_tie = 0; _M_exception = goodbit; _M_streambuf = __sb; _M_streambuf_state = __sb ? goodbit : badbit; @@ -176,44 +170,31 @@ namespace std basic_ios<_CharT, _Traits>::_M_cache_locale(const locale& __loc) { if (__builtin_expect(has_facet<__ctype_type>(__loc), true)) - _M_fctype = &use_facet<__ctype_type>(__loc); - else - _M_fctype = 0; - if (__builtin_expect(has_facet<__numput_type>(__loc), true)) - _M_fnumput = &use_facet<__numput_type>(__loc); + _M_ctype = &use_facet<__ctype_type>(__loc); else - _M_fnumput = 0; - if (__builtin_expect(has_facet<__numget_type>(__loc), true)) - _M_fnumget = &use_facet<__numget_type>(__loc); + _M_ctype = 0; + + if (__builtin_expect(has_facet<__num_put_type>(__loc), true)) + _M_num_put = &use_facet<__num_put_type>(__loc); else - _M_fnumget = 0; - } + _M_num_put = 0; -#if 1 - // XXX GLIBCXX_ABI Deprecated, compatibility only. - template<typename _CharT, typename _Traits> - void - basic_ios<_CharT, _Traits>::_M_cache_facets(const locale& __loc) - { - if (__builtin_expect(has_facet<__ctype_type>(__loc), true)) - _M_fctype = &use_facet<__ctype_type>(__loc); - if (__builtin_expect(has_facet<__numput_type>(__loc), true)) - _M_fnumput = &use_facet<__numput_type>(__loc); - if (__builtin_expect(has_facet<__numget_type>(__loc), true)) - _M_fnumget = &use_facet<__numget_type>(__loc); + if (__builtin_expect(has_facet<__num_get_type>(__loc), true)) + _M_num_get = &use_facet<__num_get_type>(__loc); + else + _M_num_get = 0; } -#endif // Inhibit implicit instantiations for required instantiations, - // which are defined via explicit instantiations elsewhere. + // which are defined via explicit instantiations elsewhere. // NB: This syntax is a GNU extension. -#if _GLIBCPP_EXTERN_TEMPLATE +#if _GLIBCXX_EXTERN_TEMPLATE extern template class basic_ios<char>; -#ifdef _GLIBCPP_USE_WCHAR_T +#ifdef _GLIBCXX_USE_WCHAR_T extern template class basic_ios<wchar_t>; #endif #endif } // namespace std -#endif +#endif |