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