diff options
Diffstat (limited to 'boost/archive/basic_streambuf_locale_saver.hpp')
-rw-r--r-- | boost/archive/basic_streambuf_locale_saver.hpp | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/boost/archive/basic_streambuf_locale_saver.hpp b/boost/archive/basic_streambuf_locale_saver.hpp index 64c8e5d314..5cd4b36f08 100644 --- a/boost/archive/basic_streambuf_locale_saver.hpp +++ b/boost/archive/basic_streambuf_locale_saver.hpp @@ -27,6 +27,7 @@ #ifndef BOOST_NO_STD_LOCALE #include <locale> // for std::locale +#include <ios> #include <streambuf> // for std::basic_streambuf #include <boost/config.hpp> @@ -45,25 +46,57 @@ class basic_streambuf_locale_saver : private boost::noncopyable { public: - typedef ::std::basic_streambuf<Ch, Tr> state_type; - typedef ::std::locale aspect_type; - explicit basic_streambuf_locale_saver( state_type &s ) - : s_save_( s ), a_save_( s.getloc() ) - {} - explicit basic_streambuf_locale_saver( state_type &s, aspect_type const &a ) - : s_save_( s ), a_save_( s.pubimbue(a) ) - {} - ~basic_streambuf_locale_saver() - { this->restore(); } - void restore(){ - s_save_.pubsync(); - s_save_.pubimbue( a_save_ ); + explicit basic_streambuf_locale_saver(std::basic_streambuf<Ch, Tr> &s) : + m_streambuf(s), + m_locale(s.getloc()) + {} + ~basic_streambuf_locale_saver(){ + m_streambuf.pubsync(); + m_streambuf.pubimbue(m_locale); } private: - state_type & s_save_; - aspect_type const a_save_; + std::basic_streambuf<Ch, Tr> & m_streambuf; + std::locale const m_locale; }; +template < typename Ch, class Tr > +class basic_istream_locale_saver : + private boost::noncopyable +{ +public: + explicit basic_istream_locale_saver(std::basic_istream<Ch, Tr> &s) : + m_istream(s), + m_locale(s.getloc()) + {} + ~basic_istream_locale_saver(){ + // libstdc++ crashes without this + m_istream.sync(); + m_istream.imbue(m_locale); + } +private: + std::basic_istream<Ch, Tr> & m_istream; + std::locale const m_locale; +}; + +template < typename Ch, class Tr > +class basic_ostream_locale_saver : + private boost::noncopyable +{ +public: + explicit basic_ostream_locale_saver(std::basic_ostream<Ch, Tr> &s) : + m_ostream(s), + m_locale(s.getloc()) + {} + ~basic_ostream_locale_saver(){ + m_ostream.flush(); + m_ostream.imbue(m_locale); + } +private: + std::basic_ostream<Ch, Tr> & m_ostream; + std::locale const m_locale; +}; + + } // archive } // boost |