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