Blame view

3rdparty/boost_1_81_0/boost/flyweight/serialize.hpp 2.68 KB
598bfd3f   Hu Chunming   提交_GLIBCXX_USE_CX...
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
97
98
  /* Copyright 2006-2015 Joaquin M Lopez Munoz.
   * Distributed under 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/flyweight for library home page.
   */
  
  #ifndef BOOST_FLYWEIGHT_SERIALIZE_HPP
  #define BOOST_FLYWEIGHT_SERIALIZE_HPP
  
  #if defined(_MSC_VER)&&(_MSC_VER>=1200)
  #pragma once
  #endif
  
  #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
  #include <boost/flyweight/flyweight_fwd.hpp>
  #include <boost/flyweight/detail/archive_constructed.hpp>
  #include <boost/flyweight/detail/serialization_helper.hpp>
  #include <boost/serialization/nvp.hpp>
  #include <boost/serialization/split_free.hpp>
  #include <boost/throw_exception.hpp> 
  #include <memory>
  
  /* Serialization routines for flyweight<T>. 
   */
  
  namespace boost{
    
  namespace serialization{
  
  template<
    class Archive,
    typename T,typename Arg1,typename Arg2,typename Arg3
  >
  inline void serialize(
    Archive& ar,::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
    const unsigned int version)
  {
    split_free(ar,f,version);              
  }                                               
  
  template<
    class Archive,
    typename T,typename Arg1,typename Arg2,typename Arg3
  >
  void save(
    Archive& ar,const ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
    const unsigned int /*version*/)
  {
    typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>    flyweight;
    typedef ::boost::flyweights::detail::save_helper<flyweight> helper;
    typedef typename helper::size_type                          size_type;
  
    helper& hlp=ar.template get_helper<helper>();
  
    size_type n=hlp.find(f);
    ar<<make_nvp("item",n);
    if(n==hlp.size()){
      ar<<make_nvp("key",f.get_key());
      hlp.push_back(f);
    }
  }
  
  template<
    class Archive,
    typename T,typename Arg1,typename Arg2,typename Arg3
  >
  void load(
    Archive& ar,::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
    const unsigned int version)
  {
    typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>    flyweight;
    typedef typename flyweight::key_type                        key_type;
    typedef ::boost::flyweights::detail::load_helper<flyweight> helper;
    typedef typename helper::size_type                          size_type;
  
    helper& hlp=ar.template get_helper<helper>();
  
    size_type n=0;
    ar>>make_nvp("item",n);
    if(n>hlp.size()){
      throw_exception(
        archive::archive_exception(archive::archive_exception::other_exception));
    }
    else if(n==hlp.size()){
      ::boost::flyweights::detail::archive_constructed<key_type> k(
        "key",ar,version);
      hlp.push_back(flyweight(k.get()));
    }
    f=hlp[n];
  }
  
  } /* namespace serialization */
  
  } /* namespace boost */
  
  #endif