Chris@16: // Boost io/ios_state.hpp header file --------------------------------------// Chris@16: Chris@16: // Copyright 2002, 2005 Daryle Walker. Use, modification, and distribution Chris@16: // are subject to the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or a copy at .) Chris@16: Chris@16: // See for the library's home page. Chris@16: Chris@16: #ifndef BOOST_IO_IOS_STATE_HPP Chris@16: #define BOOST_IO_IOS_STATE_HPP Chris@16: Chris@16: #include // self include Chris@16: #include Chris@16: Chris@16: #include // for std::ios_base, std::basic_ios, etc. Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: #include // for std::locale Chris@16: #endif Chris@16: #include // for std::basic_ostream Chris@16: #include // for std::basic_streambuf Chris@16: #include // for std::char_traits Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace io Chris@16: { Chris@16: Chris@16: Chris@16: // Basic stream state saver class declarations -----------------------------// Chris@16: Chris@16: class ios_flags_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef ::std::ios_base::fmtflags aspect_type; Chris@16: Chris@16: explicit ios_flags_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.flags() ) Chris@16: {} Chris@16: ios_flags_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.flags(a) ) Chris@16: {} Chris@16: ~ios_flags_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.flags( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: Chris@16: ios_flags_saver& operator=(const ios_flags_saver&); Chris@16: }; Chris@16: Chris@16: class ios_precision_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef ::std::streamsize aspect_type; Chris@16: Chris@16: explicit ios_precision_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.precision() ) Chris@16: {} Chris@16: ios_precision_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.precision(a) ) Chris@16: {} Chris@16: ~ios_precision_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.precision( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: Chris@16: ios_precision_saver& operator=(const ios_precision_saver&); Chris@16: }; Chris@16: Chris@16: class ios_width_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef ::std::streamsize aspect_type; Chris@16: Chris@16: explicit ios_width_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.width() ) Chris@16: {} Chris@16: ios_width_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.width(a) ) Chris@16: {} Chris@16: ~ios_width_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.width( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: ios_width_saver& operator=(const ios_width_saver&); Chris@16: }; Chris@16: Chris@16: Chris@16: // Advanced stream state saver class template declarations -----------------// Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_iostate_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef ::std::ios_base::iostate aspect_type; Chris@16: Chris@16: explicit basic_ios_iostate_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.rdstate() ) Chris@16: {} Chris@16: basic_ios_iostate_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.rdstate() ) Chris@16: { s.clear(a); } Chris@16: ~basic_ios_iostate_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.clear( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_iostate_saver& operator=(const basic_ios_iostate_saver&); Chris@16: }; Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_exception_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef ::std::ios_base::iostate aspect_type; Chris@16: Chris@16: explicit basic_ios_exception_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.exceptions() ) Chris@16: {} Chris@16: #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) Chris@16: basic_ios_exception_saver( state_type &s, aspect_type a ) Chris@16: #else Chris@16: basic_ios_exception_saver( state_type &s, aspect_type const &a ) Chris@16: #endif Chris@16: : s_save_( s ), a_save_( s.exceptions() ) Chris@16: { s.exceptions(a); } Chris@16: ~basic_ios_exception_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.exceptions( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_exception_saver& operator=(const basic_ios_exception_saver&); Chris@16: }; Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_tie_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef ::std::basic_ostream * aspect_type; Chris@16: Chris@16: explicit basic_ios_tie_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.tie() ) Chris@16: {} Chris@16: basic_ios_tie_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.tie(a) ) Chris@16: {} Chris@16: ~basic_ios_tie_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.tie( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_tie_saver& operator=(const basic_ios_tie_saver&); Chris@16: }; Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_rdbuf_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef ::std::basic_streambuf * aspect_type; Chris@16: Chris@16: explicit basic_ios_rdbuf_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.rdbuf() ) Chris@16: {} Chris@16: basic_ios_rdbuf_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.rdbuf(a) ) Chris@16: {} Chris@16: ~basic_ios_rdbuf_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.rdbuf( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_rdbuf_saver& operator=(const basic_ios_rdbuf_saver&); Chris@16: }; Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_fill_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef typename state_type::char_type aspect_type; Chris@16: Chris@16: explicit basic_ios_fill_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.fill() ) Chris@16: {} Chris@16: basic_ios_fill_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.fill(a) ) Chris@16: {} Chris@16: ~basic_ios_fill_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.fill( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_fill_saver& operator=(const basic_ios_fill_saver&); Chris@16: }; Chris@16: Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_locale_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: typedef ::std::locale aspect_type; Chris@16: Chris@16: explicit basic_ios_locale_saver( state_type &s ) Chris@16: : s_save_( s ), a_save_( s.getloc() ) Chris@16: {} Chris@16: basic_ios_locale_saver( state_type &s, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.imbue(a) ) Chris@16: {} Chris@16: ~basic_ios_locale_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.imbue( a_save_ ); } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: basic_ios_locale_saver& operator=(const basic_ios_locale_saver&); Chris@16: }; Chris@16: #endif Chris@16: Chris@16: Chris@16: // User-defined stream state saver class declarations ----------------------// Chris@16: Chris@16: class ios_iword_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef int index_type; Chris@16: typedef long aspect_type; Chris@16: Chris@16: explicit ios_iword_saver( state_type &s, index_type i ) Chris@16: : s_save_( s ), a_save_( s.iword(i) ), i_save_( i ) Chris@16: {} Chris@16: ios_iword_saver( state_type &s, index_type i, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.iword(i) ), i_save_( i ) Chris@16: { s.iword(i) = a; } Chris@16: ~ios_iword_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.iword( i_save_ ) = a_save_; } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: index_type const i_save_; Chris@16: Chris@16: ios_iword_saver& operator=(const ios_iword_saver&); Chris@16: }; Chris@16: Chris@16: class ios_pword_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef int index_type; Chris@16: typedef void * aspect_type; Chris@16: Chris@16: explicit ios_pword_saver( state_type &s, index_type i ) Chris@16: : s_save_( s ), a_save_( s.pword(i) ), i_save_( i ) Chris@16: {} Chris@16: ios_pword_saver( state_type &s, index_type i, aspect_type const &a ) Chris@16: : s_save_( s ), a_save_( s.pword(i) ), i_save_( i ) Chris@16: { s.pword(i) = a; } Chris@16: ~ios_pword_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { s_save_.pword( i_save_ ) = a_save_; } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: aspect_type const a_save_; Chris@16: index_type const i_save_; Chris@16: Chris@16: ios_pword_saver operator=(const ios_pword_saver&); Chris@16: }; Chris@16: Chris@16: Chris@16: // Combined stream state saver class (template) declarations ---------------// Chris@16: Chris@16: class ios_base_all_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: Chris@16: explicit ios_base_all_saver( state_type &s ) Chris@16: : s_save_( s ), a1_save_( s.flags() ), a2_save_( s.precision() ) Chris@16: , a3_save_( s.width() ) Chris@16: {} Chris@16: Chris@16: ~ios_base_all_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { Chris@16: s_save_.width( a3_save_ ); Chris@16: s_save_.precision( a2_save_ ); Chris@16: s_save_.flags( a1_save_ ); Chris@16: } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: state_type::fmtflags const a1_save_; Chris@16: ::std::streamsize const a2_save_; Chris@16: ::std::streamsize const a3_save_; Chris@16: Chris@16: ios_base_all_saver& operator=(const ios_base_all_saver&); Chris@16: }; Chris@16: Chris@16: template < typename Ch, class Tr > Chris@16: class basic_ios_all_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::basic_ios state_type; Chris@16: Chris@16: explicit basic_ios_all_saver( state_type &s ) Chris@16: : s_save_( s ), a1_save_( s.flags() ), a2_save_( s.precision() ) Chris@16: , a3_save_( s.width() ), a4_save_( s.rdstate() ) Chris@16: , a5_save_( s.exceptions() ), a6_save_( s.tie() ) Chris@16: , a7_save_( s.rdbuf() ), a8_save_( s.fill() ) Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: , a9_save_( s.getloc() ) Chris@16: #endif Chris@16: {} Chris@16: Chris@16: ~basic_ios_all_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: s_save_.imbue( a9_save_ ); Chris@16: #endif Chris@16: s_save_.fill( a8_save_ ); Chris@16: s_save_.rdbuf( a7_save_ ); Chris@16: s_save_.tie( a6_save_ ); Chris@16: s_save_.exceptions( a5_save_ ); Chris@16: s_save_.clear( a4_save_ ); Chris@16: s_save_.width( a3_save_ ); Chris@16: s_save_.precision( a2_save_ ); Chris@16: s_save_.flags( a1_save_ ); Chris@16: } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: typename state_type::fmtflags const a1_save_; Chris@16: ::std::streamsize const a2_save_; Chris@16: ::std::streamsize const a3_save_; Chris@16: typename state_type::iostate const a4_save_; Chris@16: typename state_type::iostate const a5_save_; Chris@16: ::std::basic_ostream * const a6_save_; Chris@16: ::std::basic_streambuf * const a7_save_; Chris@16: typename state_type::char_type const a8_save_; Chris@16: #ifndef BOOST_NO_STD_LOCALE Chris@16: ::std::locale const a9_save_; Chris@16: #endif Chris@16: Chris@16: basic_ios_all_saver& operator=(const basic_ios_all_saver&); Chris@16: }; Chris@16: Chris@16: class ios_all_word_saver Chris@16: { Chris@16: public: Chris@16: typedef ::std::ios_base state_type; Chris@16: typedef int index_type; Chris@16: Chris@16: ios_all_word_saver( state_type &s, index_type i ) Chris@16: : s_save_( s ), i_save_( i ), a1_save_( s.iword(i) ) Chris@16: , a2_save_( s.pword(i) ) Chris@16: {} Chris@16: Chris@16: ~ios_all_word_saver() Chris@16: { this->restore(); } Chris@16: Chris@16: void restore() Chris@16: { Chris@16: s_save_.pword( i_save_ ) = a2_save_; Chris@16: s_save_.iword( i_save_ ) = a1_save_; Chris@16: } Chris@16: Chris@16: private: Chris@16: state_type & s_save_; Chris@16: index_type const i_save_; Chris@16: long const a1_save_; Chris@16: void * const a2_save_; Chris@16: Chris@16: ios_all_word_saver& operator=(const ios_all_word_saver&); Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace io Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: #endif // BOOST_IO_IOS_STATE_HPP