Chris@16: #ifndef BOOST_SERIALIZATION_STATE_SAVER_HPP Chris@16: #define BOOST_SERIALIZATION_STATE_SAVER_HPP Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // state_saver.hpp: Chris@16: Chris@16: // (C) Copyright 2003-4 Pavel Vozenilek and Robert Ramey - http://www.rrsd.com. Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/serialization for updates, documentation, and revision history. Chris@16: Chris@16: // Inspired by Daryle Walker's iostate_saver concept. This saves the original Chris@16: // value of a variable when a state_saver is constructed and restores Chris@16: // upon destruction. Useful for being sure that state is restored to Chris@16: // variables upon exit from scope. Chris@16: Chris@16: Chris@16: #include Chris@16: #ifndef BOOST_NO_EXCEPTIONS Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace serialization { Chris@16: Chris@16: template Chris@16: // T requirements: Chris@16: // - POD or object semantic (cannot be reference, function, ...) Chris@16: // - copy constructor Chris@16: // - operator = (no-throw one preferred) Chris@16: class state_saver : private boost::noncopyable Chris@16: { Chris@16: private: Chris@16: const T previous_value; Chris@16: T & previous_ref; Chris@16: Chris@16: struct restore { Chris@16: static void invoke(T & previous_ref, const T & previous_value){ Chris@16: previous_ref = previous_value; // won't throw Chris@16: } Chris@16: }; Chris@16: Chris@16: struct restore_with_exception { Chris@16: static void invoke(T & previous_ref, const T & previous_value){ Chris@16: BOOST_TRY{ Chris@16: previous_ref = previous_value; Chris@16: } Chris@16: BOOST_CATCH(::std::exception &) { Chris@16: // we must ignore it - we are in destructor Chris@16: } Chris@16: BOOST_CATCH_END Chris@16: } Chris@16: }; Chris@16: Chris@16: public: Chris@16: state_saver( Chris@16: T & object Chris@16: ) : Chris@16: previous_value(object), Chris@16: previous_ref(object) Chris@16: {} Chris@16: Chris@16: ~state_saver() { Chris@16: #ifndef BOOST_NO_EXCEPTIONS Chris@101: typedef typename mpl::eval_if< Chris@16: has_nothrow_copy< T >, Chris@16: mpl::identity, Chris@16: mpl::identity Chris@16: >::type typex; Chris@16: typex::invoke(previous_ref, previous_value); Chris@16: #else Chris@16: previous_ref = previous_value; Chris@16: #endif Chris@16: } Chris@16: Chris@16: }; // state_saver<> Chris@16: Chris@16: } // serialization Chris@16: } // boost Chris@16: Chris@16: #endif //BOOST_SERIALIZATION_STATE_SAVER_HPP