oserializer.hpp
Go to the documentation of this file.
1 #ifndef BOOST_ARCHIVE_OSERIALIZER_HPP
2 #define BOOST_ARCHIVE_OSERIALIZER_HPP
3 
4 // MS compatible compilers support #pragma once
5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
6 # pragma once
7 # pragma inline_depth(511)
8 # pragma inline_recursion(on)
9 #endif
10 
11 #if defined(__MWERKS__)
12 # pragma inline_depth(511)
13 #endif
14 
16 // oserializer.hpp: interface for serialization system.
17 
18 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
19 // Use, modification and distribution is subject to the Boost Software
20 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
21 // http://www.boost.org/LICENSE_1_0.txt)
22 
23 // See http://www.boost.org for updates, documentation, and revision history.
24 
25 #include <boost/config.hpp>
26 #include <boost/detail/workaround.hpp>
27 #include <boost/mpl/and.hpp>
28 #include <boost/mpl/empty.hpp>
29 #include <boost/mpl/equal_to.hpp>
30 #include <boost/mpl/eval_if.hpp>
31 #include <boost/mpl/greater_equal.hpp>
32 #include <boost/mpl/identity.hpp>
33 #include <boost/mpl/int.hpp>
34 #include <boost/mpl/less.hpp>
35 #include <boost/mpl/list.hpp>
36 #include <boost/mpl/not.hpp>
37 #include <boost/serialization/is_abstract.hpp>
38 #include <boost/smart_cast.hpp>
39 #include <boost/static_assert.hpp>
40 #include <boost/static_warning.hpp>
41 #include <boost/throw_exception.hpp>
42 #include <boost/type_traits/is_const.hpp>
43 #include <boost/type_traits/is_enum.hpp>
44 #include <boost/type_traits/is_fundamental.hpp>
45 #include <boost/type_traits/is_pointer.hpp>
46 #include <boost/type_traits/is_same.hpp>
47 #include <boost/type_traits/is_volatile.hpp>
48 
49 #include <cassert>
50 
51 #ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO
52 # include <boost/serialization/extended_type_info_typeid.hpp>
53 #endif
54 // the following is need only for dynamic cast of polymorphic pointers
55 #include <boost/archive/archive_exception.hpp>
56 #include <boost/archive/detail/archive_pointer_oserializer.hpp>
57 #include <boost/archive/detail/basic_oarchive.hpp>
58 #include <boost/archive/detail/basic_oserializer.hpp>
59 #include <boost/serialization/force_include.hpp>
60 #include <boost/serialization/level.hpp>
61 #include <boost/serialization/nvp.hpp>
62 #include <boost/serialization/serialization.hpp>
63 #include <boost/serialization/tracking.hpp>
64 #include <boost/serialization/type_info_implementation.hpp>
65 #include <boost/serialization/version.hpp>
66 #include <boost/serialization/void_cast.hpp>
67 
68 namespace boost
69 {
70 
71 namespace serialization
72 {
73 class extended_type_info;
74 } // namespace serialization
75 
76 namespace archive
77 {
78 
79 // an accessor to permit friend access to archives. Needed because
80 // some compilers don't handle friend templates completely
82 {
83 public:
84  template<class Archive>
85  static void end_preamble(Archive & ar)
86  {
87  ar.end_preamble();
88  }
89  template<class Archive, class T>
90  static void save_primitive(Archive & ar, const T & t)
91  {
92  ar.end_preamble();
93  ar.save(t);
94  }
95 };
96 
97 namespace detail
98 {
99 
100 template<class Archive, class T>
101 class oserializer : public basic_oserializer
102 {
103 private:
104  // private constructor to inhibit any existence other than the
105  // static one
106  explicit oserializer() : basic_oserializer(*boost::serialization::type_info_implementation<T>::type::get_instance())
107  {
108  }
109 
110 public:
111  virtual BOOST_DLLEXPORT void save_object_data(basic_oarchive & ar, const void * x) const BOOST_USED;
112  virtual bool class_info() const
113  {
114  return boost::serialization::implementation_level<T>::value >= boost::serialization::object_class_info;
115  }
116  virtual bool tracking(const unsigned int /* flags */) const
117  {
118  // if(0 != (flags & no_tracking))
119  // return false;
120  return boost::serialization::tracking_level<T>::value == boost::serialization::track_always
121  || boost::serialization::tracking_level<T>::value == boost::serialization::track_selectivly
122  && serialized_as_pointer();
123  }
124  virtual unsigned int version() const
125  {
126  return ::boost::serialization::version<T>::value;
127  }
128  virtual bool is_polymorphic() const
129  {
130  typedef BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation<T>::type::is_polymorphic::type typex;
131  return typex::value;
132  }
134  {
135  static oserializer instance;
136  return instance;
137  }
138  virtual ~oserializer() {}
139 };
140 
141 template<class Archive, class T>
142 BOOST_DLLEXPORT void oserializer<Archive, T>::save_object_data(basic_oarchive & ar, const void * x) const
143 {
144  // make sure call is routed through the highest interface that might
145  // be specialized by the user.
146  boost::serialization::serialize_adl(boost::smart_cast_reference<Archive &>(ar),
147  *static_cast<T *>(const_cast<void *>(x)), version());
148 }
149 
150 // instantiation of this template creates a static object. Note inversion of
151 // normal argument order to workaround bizarre error in MSVC 6.0 which only
152 // manifests iftself during compiler time.
153 template<class T, class Archive>
154 class pointer_oserializer : public archive_pointer_oserializer<Archive>
155 {
156 private:
157  virtual const basic_oserializer & get_basic_serializer() const
158  {
160  }
161  virtual BOOST_DLLEXPORT void save_object_ptr(basic_oarchive & ar, const void * x) const BOOST_USED;
162 #if defined(__GNUC__) || (defined(BOOST_MSVC) && (_MSC_VER <= 1300))
163 public:
164 #endif
165  // private constructor to inhibit any existence other than the
166  // static one. Note GCC doesn't permit constructor to be private
167  explicit BOOST_DLLEXPORT pointer_oserializer() BOOST_USED;
168  static const pointer_oserializer instance;
169 
170 public:
171 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
172  // at least one compiler (CW) seems to require that serialize_adl
173  // be explicitly instantiated. Still under investigation.
174  void (*const m)(Archive &, T &, const unsigned);
175  boost::serialization::extended_type_info * (*e)();
176 #endif
177  static BOOST_DLLEXPORT const pointer_oserializer & instantiate() BOOST_USED;
178  virtual ~pointer_oserializer() {}
179 };
180 
181 template<class T, class Archive>
183 {
184  return instance;
185 }
186 
187 // note: instances of this template to be constructed before the main
188 // is called in order for things to be initialized properly. For this
189 // reason, hiding the instance in a static function as was done above
190 // won't work here so we created a free instance here.
191 template<class T, class Archive>
193 
194 template<class T, class Archive>
195 BOOST_DLLEXPORT void pointer_oserializer<T, Archive>::save_object_ptr(basic_oarchive & ar, const void * x) const
196 {
197  assert(NULL != x);
198  // make sure call is routed through the highest interface that might
199  // be specialized by the user.
200  T * t = static_cast<T *>(const_cast<void *>(x));
201  const unsigned int file_version = boost::serialization::version<T>::value;
202  Archive & ar_impl = boost::smart_cast_reference<Archive &>(ar);
203  boost::serialization::save_construct_data_adl<Archive, T>(ar_impl, t, file_version);
204  ar_impl << boost::serialization::make_nvp(NULL, *t);
205 }
206 
207 template<class T, class Archive>
208 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
209 BOOST_DLLEXPORT pointer_oserializer<T, Archive>::pointer_oserializer()
210 : archive_pointer_oserializer<Archive>(*boost::serialization::type_info_implementation<T>::type::get_instance()),
211  m(boost::serialization::serialize_adl<Archive, T>),
212  e(boost::serialization::type_info_implementation<T>::type::get_instance)
213 #else
214 BOOST_DLLEXPORT pointer_oserializer<T, Archive>::pointer_oserializer()
215 : archive_pointer_oserializer<Archive>(*boost::serialization::type_info_implementation<T>::type::get_instance())
216 #endif
217 {
218  // make sure appropriate member function is instantiated
219  oserializer<Archive, T> & bos = oserializer<Archive, T>::instantiate();
220  bos.set_bpos(this);
221 }
222 
223 template<class Archive, class T>
225 {
226  // note this bounces the call right back to the archive
227  // with no runtime overhead
229  {
230  static void invoke(Archive & ar, const T & t)
231  {
233  }
234  };
235  // same as above but passes through serialization
236  struct save_only
237  {
238  static void invoke(Archive & ar, const T & t)
239  {
240  // make sure call is routed through the highest interface that might
241  // be specialized by the user.
242  boost::serialization::serialize_adl(ar, const_cast<T &>(t), ::boost::serialization::version<T>::value);
243  }
244  };
245  // adds class information to the archive. This includes
246  // serialization level and class version
248  {
249  static void invoke(Archive & ar, const T & t)
250  {
251  ar.save_object(&t, oserializer<Archive, T>::instantiate());
252  }
253  };
254 
255  // adds class information to the archive. This includes
256  // serialization level and class version
258  {
259  static void invoke(Archive & ar, const T & t)
260  {
261  // if(0 == (ar.get_flags() & no_tracking))
262  save_standard::invoke(ar, t);
263  // else
264  // save_only::invoke(ar, t);
265  }
266  };
267 
268  typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
269  // if its primitive
270  mpl::equal_to<boost::serialization::implementation_level<T>, mpl::int_<boost::serialization::primitive_type>>,
271  mpl::identity<save_primitive>,
272  // else
273  BOOST_DEDUCED_TYPENAME mpl::eval_if<
274  // class info / version
275  mpl::greater_equal<boost::serialization::implementation_level<T>,
276  mpl::int_<boost::serialization::object_class_info>>,
277  // do standard save
278  mpl::identity<save_standard>,
279  // else
280  BOOST_DEDUCED_TYPENAME mpl::eval_if<
281  // no tracking
282  mpl::equal_to<boost::serialization::tracking_level<T>, mpl::int_<boost::serialization::track_never>>,
283  // do a fast save
284  mpl::identity<save_only>,
285  // else
286  // do a fast save only tracking is turned off
287  mpl::identity<save_conditional>>>>::type typex;
288 
289  static void invoke(Archive & ar, const T & t)
290  {
291  // check that we're not trying to serialize something that
292  // has been marked not to be serialized. If this your program
293  // traps here, you've tried to serialize a class whose trait
294  // has been marked "non-serializable". Either reset the trait
295  // (see level.hpp) or change program not to serialize items of this class
296  BOOST_STATIC_ASSERT((mpl::greater_equal<boost::serialization::implementation_level<T>,
297  mpl::int_<boost::serialization::primitive_type>>::value));
298  typex::invoke(ar, t);
299  };
300 };
301 
302 template<class Archive, class TPtr>
304 {
305  template<class T>
306  struct abstract
307  {
308  static const basic_pointer_oserializer * register_type(Archive & /* ar */)
309  {
310  // it has? to be polymorphic
311  BOOST_STATIC_ASSERT(boost::serialization::type_info_implementation<T>::type::is_polymorphic::value);
312  return static_cast<const basic_pointer_oserializer *>(NULL);
313  }
314  };
315 
316  template<class T>
318  {
319  static const basic_pointer_oserializer * register_type(Archive & ar)
320  {
321  return ar.register_type(static_cast<T *>(NULL));
322  }
323  };
324 
325  template<class T>
326  static const basic_pointer_oserializer * register_type(Archive & ar, T & /*t*/)
327  {
328  // there should never be any need to save an abstract polymorphic
329  // class pointer. Inhibiting code generation for this
330  // permits abstract base classes to be used - note: exception
331  // virtual serialize functions used for plug-ins
332  typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<serialization::is_abstract<T>, mpl::identity<abstract<T>>,
333  mpl::identity<non_abstract<T>>>::type typex;
334  return typex::register_type(ar);
335  }
336 
337  template<class T>
339  {
340  static void save(Archive & ar, const T & t, const basic_pointer_oserializer * bpos_ptr)
341  {
342  // save the requested pointer type
343  ar.save_pointer(&t, bpos_ptr);
344  }
345  };
346 
347  template<class T>
348  struct polymorphic
349  {
350  static void save(Archive & ar, const T & t, const basic_pointer_oserializer * bpos_ptr)
351  {
352  const boost::serialization::extended_type_info * this_type =
353  boost::serialization::type_info_implementation<T>::type::get_instance();
354  // retrieve the true type of the object pointed to
355  // if this assertion fails its an error in this library
356  assert(NULL != this_type);
357  const boost::serialization::extended_type_info * true_type =
358  boost::serialization::type_info_implementation<T>::type::get_derived_extended_type_info(t);
359  // note:if this exception is thrown, be sure that derived pointer
360  // is either regsitered or exported.
361  if(NULL == true_type)
362  {
363  boost::throw_exception(archive_exception(archive_exception::unregistered_class));
364  }
365 
366  // if its not a pointer to a more derived type
367  const void * vp = static_cast<const void *>(&t);
368  if(*this_type == *true_type)
369  {
370  ar.save_pointer(vp, bpos_ptr);
371  return;
372  }
373  // convert pointer to more derived type. if this is thrown
374  // it means that the base/derived relationship hasn't be registered
375  vp = serialization::void_downcast(*true_type, *this_type, &t);
376  if(NULL == vp)
377  {
378  boost::throw_exception(archive_exception(archive_exception::unregistered_cast));
379  }
380 
381  // sice true_type is valid, and this only gets made if the
382  // pointer oserializer object has been created, this should never
383  // fail
384  bpos_ptr = archive_pointer_oserializer<Archive>::find(*true_type);
385  assert(NULL != bpos_ptr);
386  if(NULL == bpos_ptr) boost::throw_exception(archive_exception(archive_exception::unregistered_class));
387  ar.save_pointer(vp, bpos_ptr);
388  }
389  };
390 
391  template<class T>
392  static void save(Archive & ar, const T & t, const basic_pointer_oserializer * bpos_ptr)
393  {
394  typedef BOOST_DEDUCED_TYPENAME
395  mpl::eval_if<BOOST_DEDUCED_TYPENAME boost::serialization::type_info_implementation<T>::type::is_polymorphic,
396  mpl::identity<polymorphic<T>>, mpl::identity<non_polymorphic<T>>>::type typey;
397  typey::save(ar, const_cast<T &>(t), bpos_ptr);
398  }
399 
400  template<class T>
401  static void const_check(T & t)
402  {
403  BOOST_STATIC_ASSERT(!boost::is_const<T>::value);
404  }
405 
406  static void invoke(Archive & ar, const TPtr t)
407  {
408 #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
409  // if your program traps here, its because you tried to do
410  // something like ar << t where t is a pointer to a const value
411  // void f3(A const* a, text_oarchive& oa)
412  // {
413  // oa << a;
414  // }
415  // with a compiler which doesn't support remove_const
416  // const_check(* t);
417 #else
418  // otherwise remove the const
419 #endif
420  const basic_pointer_oserializer * bpos_ptr = register_type(ar, *t);
421  if(NULL == t)
422  {
423  basic_oarchive & boa = boost::smart_cast_reference<basic_oarchive &>(ar);
424  boa.save_null_pointer();
426  return;
427  }
428  save(ar, *t, bpos_ptr);
429  };
430 };
431 
432 template<class Archive, class T>
434 {
435  static void invoke(Archive & ar, const T & t)
436  {
437  // convert enum to integers on save
438  const int i = static_cast<int>(t);
439  ar << boost::serialization::make_nvp(NULL, i);
440  }
441 };
442 
443 template<class Archive, class T>
445 {
446  static void invoke(Archive & ar, const T & t)
447  {
449  // consider alignment
450  int count = sizeof(t)
451  / (static_cast<const char *>(static_cast<const void *>(&t[1]))
452  - static_cast<const char *>(static_cast<const void *>(&t[0])));
453  ar << BOOST_SERIALIZATION_NVP(count);
454  int i;
455  for(i = 0; i < count; ++i) ar << boost::serialization::make_nvp("item", t[i]);
456  }
457 };
458 
459 // note bogus arguments to workaround msvc 6 silent runtime failure
460 // declaration to satisfy gcc
461 template<class Archive, class T>
462 BOOST_DLLEXPORT const basic_pointer_oserializer & instantiate_pointer_oserializer(Archive * /* ar = NULL */,
463  T * /* t = NULL */
464  ) BOOST_USED;
465 // definition
466 template<class Archive, class T>
467 BOOST_DLLEXPORT const basic_pointer_oserializer & instantiate_pointer_oserializer(Archive * /* ar = NULL */,
468  T * /* t = NULL */
469 )
470 {
471  // note: reversal of order of arguments to work around msvc 6.0 bug
472  // that manifests itself while trying to link.
474 }
475 
476 } // namespace detail
477 
478 template<class Archive, class T>
479 inline void save(Archive & ar, const T & t)
480 {
481  typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
482  is_pointer<T>, mpl::identity<detail::save_pointer_type<Archive, T>>,
483  // else
484  BOOST_DEDUCED_TYPENAME mpl::eval_if<
485  is_enum<T>, mpl::identity<detail::save_enum_type<Archive, T>>,
486  // else
487  BOOST_DEDUCED_TYPENAME mpl::eval_if<is_array<T>, mpl::identity<detail::save_array_type<Archive, T>>,
488  // else
489  mpl::identity<detail::save_non_pointer_type<Archive, T>>>>>::type typex;
490  typex::invoke(ar, t);
491 }
492 
493 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
494 
495 template<class T>
497 {
498  typedef BOOST_DEDUCED_TYPENAME mpl::if_<
499  // if its never tracked.
500  BOOST_DEDUCED_TYPENAME mpl::equal_to<serialization::tracking_level<T>, mpl::int_<serialization::track_never>>,
501  // it better not be a pointer
502  mpl::not_<is_pointer<T>>,
503  // else
504  // otherwise if it might be tracked. So there shouldn't
505  // be any problem making a const
506  is_const<T>>::type typex;
507  BOOST_STATIC_CONSTANT(bool, value = typex::value);
508 };
509 
510 template<class Archive, class T>
511 inline void save(Archive & ar, T & t)
512 {
513  // if your program traps here, it indicates taht your doing one of the following:
514  // a) serializing an object of a type marked "track_never" through a pointer.
515  // b) saving an non-const object of a type not markd "track_never)
516  // Either of these conditions may be an indicator of an error usage of the
517  // serialization library and should be double checked. See documentation on
518  // object tracking.
519  // BOOST_STATIC_ASSERT(check_tracking<T>::value);
520  save(ar, const_cast<const T &>(t));
521 }
522 #endif
523 
524 } // namespace archive
525 } // namespace boost
526 
527 #endif // BOOST_ARCHIVE_OSERIALIZER_HPP
boost::archive::detail::save_pointer_type::register_type
static const basic_pointer_oserializer * register_type(Archive &ar, T &)
Definition: oserializer.hpp:326
boost::archive::detail::pointer_oserializer
Definition: oserializer.hpp:154
boost::archive::detail::save_non_pointer_type::save_conditional::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:259
boost::archive::detail::oserializer::tracking
virtual bool tracking(const unsigned int) const
Definition: oserializer.hpp:116
boost::archive::check_tracking::typex
BOOST_DEDUCED_TYPENAME mpl::if_< BOOST_DEDUCED_TYPENAME mpl::equal_to< serialization::tracking_level< T >, mpl::int_< serialization::track_never > >, mpl::not_< is_pointer< T > >, is_const< T > >::type typex
Definition: oserializer.hpp:506
boost::archive::detail::instantiate_pointer_oserializer
const BOOST_DLLEXPORT basic_pointer_oserializer & instantiate_pointer_oserializer(Archive *, T *) BOOST_USED
Definition: oserializer.hpp:467
boost::archive::detail::save_array_type::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:446
boost::archive::detail::save_pointer_type::non_abstract
Definition: oserializer.hpp:317
boost::archive::detail::save_pointer_type::non_abstract::register_type
static const basic_pointer_oserializer * register_type(Archive &ar)
Definition: oserializer.hpp:319
boost::archive::save_access
Definition: oserializer.hpp:81
boost::archive::detail::save_non_pointer_type::save_primitive::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:230
boost::archive::detail::save_non_pointer_type::save_standard::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:249
boost
Definition: oserializer.hpp:68
boost::archive::detail::save_non_pointer_type::save_only::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:238
boost::archive::detail::save_non_pointer_type::save_standard
Definition: oserializer.hpp:247
boost::archive::detail::oserializer::~oserializer
virtual ~oserializer()
Definition: oserializer.hpp:138
boost::archive::detail::save_pointer_type::non_polymorphic::save
static void save(Archive &ar, const T &t, const basic_pointer_oserializer *bpos_ptr)
Definition: oserializer.hpp:340
boost::archive::check_tracking
Definition: oserializer.hpp:496
boost::archive::detail::save_non_pointer_type::typex
BOOST_DEDUCED_TYPENAME mpl::eval_if< mpl::equal_to< boost::serialization::implementation_level< T >, mpl::int_< boost::serialization::primitive_type > >, mpl::identity< save_primitive >, BOOST_DEDUCED_TYPENAME mpl::eval_if< mpl::greater_equal< boost::serialization::implementation_level< T >, mpl::int_< boost::serialization::object_class_info > >, mpl::identity< save_standard >, BOOST_DEDUCED_TYPENAME mpl::eval_if< mpl::equal_to< boost::serialization::tracking_level< T >, mpl::int_< boost::serialization::track_never > >, mpl::identity< save_only >, mpl::identity< save_conditional > > > >::type typex
Definition: oserializer.hpp:287
boost::archive::detail::save_pointer_type::polymorphic
Definition: oserializer.hpp:348
boost::archive::save
void save(Archive &ar, const T &t)
Definition: oserializer.hpp:479
boost::archive::detail::oserializer::version
virtual unsigned int version() const
Definition: oserializer.hpp:124
boost::archive::detail::save_pointer_type::const_check
static void const_check(T &t)
Definition: oserializer.hpp:401
boost::archive::detail::pointer_oserializer::m
void(*const m)(Archive &, T &, const unsigned)
Definition: oserializer.hpp:174
boost::archive::detail::save_non_pointer_type::save_primitive
Definition: oserializer.hpp:228
boost::archive::detail::save_non_pointer_type::save_conditional
Definition: oserializer.hpp:257
boost::archive::detail::save_pointer_type::non_polymorphic
Definition: oserializer.hpp:338
boost::archive::detail::oserializer::is_polymorphic
virtual bool is_polymorphic() const
Definition: oserializer.hpp:128
boost::archive::detail::save_pointer_type::abstract
Definition: oserializer.hpp:306
boost::archive::detail::save_non_pointer_type::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:289
boost::archive::save_access::end_preamble
static void end_preamble(Archive &ar)
Definition: oserializer.hpp:85
boost::archive::detail::save_pointer_type::save
static void save(Archive &ar, const T &t, const basic_pointer_oserializer *bpos_ptr)
Definition: oserializer.hpp:392
boost::archive::detail::save_pointer_type::abstract::register_type
static const basic_pointer_oserializer * register_type(Archive &)
Definition: oserializer.hpp:308
boost::archive::detail::save_pointer_type::polymorphic::save
static void save(Archive &ar, const T &t, const basic_pointer_oserializer *bpos_ptr)
Definition: oserializer.hpp:350
boost::archive::save_access::save_primitive
static void save_primitive(Archive &ar, const T &t)
Definition: oserializer.hpp:90
boost::archive::detail::pointer_oserializer::instantiate
static const BOOST_DLLEXPORT pointer_oserializer & instantiate() BOOST_USED
Definition: oserializer.hpp:182
boost::archive::detail::oserializer::save_object_data
virtual BOOST_DLLEXPORT void save_object_data(basic_oarchive &ar, const void *x) const BOOST_USED
Definition: oserializer.hpp:142
boost::archive::detail::save_non_pointer_type::save_only
Definition: oserializer.hpp:236
boost::archive::detail::save_enum_type::invoke
static void invoke(Archive &ar, const T &t)
Definition: oserializer.hpp:435
boost::archive::check_tracking::BOOST_STATIC_CONSTANT
BOOST_STATIC_CONSTANT(bool, value=typex::value)
boost::archive::detail::save_enum_type
Definition: oserializer.hpp:433
boost::archive::save
void save(Archive &ar, T &t)
Definition: oserializer.hpp:511
boost::archive::detail::oserializer::class_info
virtual bool class_info() const
Definition: oserializer.hpp:112
boost::archive::detail::oserializer
Definition: oserializer.hpp:101
boost::archive::detail::save_pointer_type
Definition: oserializer.hpp:303
boost::archive::detail::save_pointer_type::invoke
static void invoke(Archive &ar, const TPtr t)
Definition: oserializer.hpp:406
boost::archive::detail::oserializer::instantiate
static oserializer & instantiate()
Definition: oserializer.hpp:133
boost::archive::detail::save_array_type
Definition: oserializer.hpp:444
boost::archive::detail::save_non_pointer_type
Definition: oserializer.hpp:224