Blame view

3rdparty/boost_1_81_0/boost/serialization/state_saver.hpp 2.63 KB
0b6a182c   Hu Chunming   添加无鉴权注册和注销
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  #ifndef BOOST_SERIALIZATION_STATE_SAVER_HPP
  #define BOOST_SERIALIZATION_STATE_SAVER_HPP
  
  // MS compatible compilers support #pragma once
  #if defined(_MSC_VER)
  # pragma once
  #endif
  
  /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  // state_saver.hpp:
  
  // (C) Copyright 2003-4 Pavel Vozenilek and Robert Ramey - http://www.rrsd.com.
  // Use, modification and distribution is subject to the Boost Software
  // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  // http://www.boost.org/LICENSE_1_0.txt)
  
  //  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.
  
  // Inspired by Daryle Walker's iostate_saver concept.  This saves the original
  // value of a variable when a state_saver is constructed and restores
  // upon destruction.  Useful for being sure that state is restored to
  // variables upon exit from scope.
  
  
  #include <boost/config.hpp>
  #ifndef BOOST_NO_EXCEPTIONS
      #include <exception>
  #endif
  
  #include <boost/call_traits.hpp>
  #include <boost/noncopyable.hpp>
  #include <boost/type_traits/has_nothrow_copy.hpp>
  #include <boost/core/no_exceptions_support.hpp>
  
  #include <boost/mpl/eval_if.hpp>
  #include <boost/mpl/identity.hpp>
  
  namespace boost {
  namespace serialization {
  
  template<class T>
  // T requirements:
  //  - POD or object semantic (cannot be reference, function, ...)
  //  - copy constructor
  //  - operator = (no-throw one preferred)
  class state_saver : private boost::noncopyable
  {
  private:
      const T previous_value;
      T & previous_ref;
  
      struct restore {
          static void invoke(T & previous_ref, const T & previous_value){
              previous_ref = previous_value; // won't throw
          }
      };
  
      struct restore_with_exception {
          static void invoke(T & previous_ref, const T & previous_value){
              BOOST_TRY{
                  previous_ref = previous_value;
              }
              BOOST_CATCH(::std::exception &) {
                  // we must ignore it - we are in destructor
              }
              BOOST_CATCH_END
          }
      };
  
  public:
      state_saver(
          T & object
      ) :
          previous_value(object),
          previous_ref(object)
      {}
  
      ~state_saver() {
          #ifndef BOOST_NO_EXCEPTIONS
              typedef typename mpl::eval_if<
                  has_nothrow_copy< T >,
                  mpl::identity<restore>,
                  mpl::identity<restore_with_exception>
              >::type typex;
              typex::invoke(previous_ref, previous_value);
          #else
              previous_ref = previous_value;
          #endif
      }
  
  }; // state_saver<>
  
  } // serialization
  } // boost
  
  #endif //BOOST_SERIALIZATION_STATE_SAVER_HPP