Chris@16
|
1 #ifndef BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
|
Chris@16
|
2 #define BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
|
Chris@16
|
3
|
Chris@16
|
4 // MS compatible compilers support #pragma once
|
Chris@101
|
5 #if defined(_MSC_VER)
|
Chris@16
|
6 # pragma once
|
Chris@16
|
7 #endif
|
Chris@16
|
8
|
Chris@16
|
9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
Chris@16
|
10 // polymorphic_oarchive.hpp
|
Chris@16
|
11
|
Chris@16
|
12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
Chris@16
|
13 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
15 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
16
|
Chris@16
|
17 // See http://www.boost.org for updates, documentation, and revision history.
|
Chris@16
|
18
|
Chris@16
|
19 #include <cstddef> // size_t
|
Chris@16
|
20 #include <climits> // ULONG_MAX
|
Chris@16
|
21 #include <string>
|
Chris@16
|
22
|
Chris@16
|
23 #include <boost/config.hpp>
|
Chris@16
|
24 #if defined(BOOST_NO_STDC_NAMESPACE)
|
Chris@16
|
25 namespace std{
|
Chris@16
|
26 using ::size_t;
|
Chris@16
|
27 } // namespace std
|
Chris@16
|
28 #endif
|
Chris@16
|
29
|
Chris@16
|
30 #include <boost/cstdint.hpp>
|
Chris@16
|
31 #include <boost/serialization/pfto.hpp>
|
Chris@16
|
32 #include <boost/archive/detail/oserializer.hpp>
|
Chris@16
|
33 #include <boost/archive/detail/interface_oarchive.hpp>
|
Chris@16
|
34 #include <boost/serialization/nvp.hpp>
|
Chris@16
|
35 #include <boost/archive/detail/register_archive.hpp>
|
Chris@16
|
36
|
Chris@16
|
37 #include <boost/archive/detail/decl.hpp>
|
Chris@16
|
38 #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
|
Chris@16
|
39
|
Chris@16
|
40 namespace boost {
|
Chris@16
|
41 namespace serialization {
|
Chris@16
|
42 class extended_type_info;
|
Chris@16
|
43 } // namespace serialization
|
Chris@16
|
44 namespace archive {
|
Chris@16
|
45 namespace detail {
|
Chris@16
|
46 class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive;
|
Chris@16
|
47 class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer;
|
Chris@16
|
48 }
|
Chris@16
|
49
|
Chris@16
|
50 class polymorphic_oarchive;
|
Chris@16
|
51
|
Chris@16
|
52 class polymorphic_oarchive_impl :
|
Chris@16
|
53 public detail::interface_oarchive<polymorphic_oarchive>
|
Chris@16
|
54 {
|
Chris@16
|
55 #ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
|
Chris@16
|
56 public:
|
Chris@16
|
57 #else
|
Chris@16
|
58 friend class detail::interface_oarchive<polymorphic_oarchive>;
|
Chris@16
|
59 friend class save_access;
|
Chris@16
|
60 #endif
|
Chris@16
|
61 // primitive types the only ones permitted by polymorphic archives
|
Chris@16
|
62 virtual void save(const bool t) = 0;
|
Chris@16
|
63
|
Chris@16
|
64 virtual void save(const char t) = 0;
|
Chris@16
|
65 virtual void save(const signed char t) = 0;
|
Chris@16
|
66 virtual void save(const unsigned char t) = 0;
|
Chris@16
|
67 #ifndef BOOST_NO_CWCHAR
|
Chris@16
|
68 #ifndef BOOST_NO_INTRINSIC_WCHAR_T
|
Chris@16
|
69 virtual void save(const wchar_t t) = 0;
|
Chris@16
|
70 #endif
|
Chris@16
|
71 #endif
|
Chris@16
|
72 virtual void save(const short t) = 0;
|
Chris@16
|
73 virtual void save(const unsigned short t) = 0;
|
Chris@16
|
74 virtual void save(const int t) = 0;
|
Chris@16
|
75 virtual void save(const unsigned int t) = 0;
|
Chris@16
|
76 virtual void save(const long t) = 0;
|
Chris@16
|
77 virtual void save(const unsigned long t) = 0;
|
Chris@16
|
78
|
Chris@16
|
79 #if defined(BOOST_HAS_LONG_LONG)
|
Chris@16
|
80 virtual void save(const boost::long_long_type t) = 0;
|
Chris@16
|
81 virtual void save(const boost::ulong_long_type t) = 0;
|
Chris@16
|
82 #elif defined(BOOST_HAS_MS_INT64)
|
Chris@16
|
83 virtual void save(const __int64 t) = 0;
|
Chris@16
|
84 virtual void save(const unsigned __int64 t) = 0;
|
Chris@16
|
85 #endif
|
Chris@16
|
86
|
Chris@16
|
87 virtual void save(const float t) = 0;
|
Chris@16
|
88 virtual void save(const double t) = 0;
|
Chris@16
|
89
|
Chris@16
|
90 // string types are treated as primitives
|
Chris@16
|
91 virtual void save(const std::string & t) = 0;
|
Chris@16
|
92 #ifndef BOOST_NO_STD_WSTRING
|
Chris@16
|
93 virtual void save(const std::wstring & t) = 0;
|
Chris@16
|
94 #endif
|
Chris@16
|
95
|
Chris@16
|
96 virtual void save_null_pointer() = 0;
|
Chris@16
|
97 // used for xml and other tagged formats
|
Chris@16
|
98 virtual void save_start(const char * name) = 0;
|
Chris@16
|
99 virtual void save_end(const char * name) = 0;
|
Chris@16
|
100 virtual void register_basic_serializer(const detail::basic_oserializer & bos) = 0;
|
Chris@16
|
101
|
Chris@16
|
102 virtual void end_preamble() = 0;
|
Chris@16
|
103
|
Chris@16
|
104 // msvc and borland won't automatically pass these to the base class so
|
Chris@16
|
105 // make it explicit here
|
Chris@16
|
106 template<class T>
|
Chris@16
|
107 void save_override(T & t, BOOST_PFTO int)
|
Chris@16
|
108 {
|
Chris@16
|
109 archive::save(* this->This(), t);
|
Chris@16
|
110 }
|
Chris@16
|
111 // special treatment for name-value pairs.
|
Chris@16
|
112 template<class T>
|
Chris@16
|
113 void save_override(
|
Chris@16
|
114 #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
|
Chris@16
|
115 const
|
Chris@16
|
116 #endif
|
Chris@16
|
117 ::boost::serialization::nvp< T > & t, int
|
Chris@16
|
118 ){
|
Chris@16
|
119 save_start(t.name());
|
Chris@16
|
120 archive::save(* this->This(), t.const_value());
|
Chris@16
|
121 save_end(t.name());
|
Chris@16
|
122 }
|
Chris@16
|
123 protected:
|
Chris@16
|
124 virtual ~polymorphic_oarchive_impl(){};
|
Chris@16
|
125 public:
|
Chris@16
|
126 // utility functions implemented by all legal archives
|
Chris@16
|
127 virtual unsigned int get_flags() const = 0;
|
Chris@16
|
128 virtual library_version_type get_library_version() const = 0;
|
Chris@16
|
129 virtual void save_binary(const void * t, std::size_t size) = 0;
|
Chris@16
|
130
|
Chris@16
|
131 virtual void save_object(
|
Chris@16
|
132 const void *x,
|
Chris@16
|
133 const detail::basic_oserializer & bos
|
Chris@16
|
134 ) = 0;
|
Chris@16
|
135 virtual void save_pointer(
|
Chris@16
|
136 const void * t,
|
Chris@16
|
137 const detail::basic_pointer_oserializer * bpos_ptr
|
Chris@16
|
138 ) = 0;
|
Chris@16
|
139 };
|
Chris@16
|
140
|
Chris@16
|
141 // note: preserve naming symmetry
|
Chris@16
|
142 class polymorphic_oarchive :
|
Chris@16
|
143 public polymorphic_oarchive_impl
|
Chris@16
|
144 {
|
Chris@16
|
145 public:
|
Chris@16
|
146 virtual ~polymorphic_oarchive(){};
|
Chris@16
|
147 };
|
Chris@16
|
148
|
Chris@16
|
149 } // namespace archive
|
Chris@16
|
150 } // namespace boost
|
Chris@16
|
151
|
Chris@16
|
152 // required by export
|
Chris@16
|
153 BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_oarchive)
|
Chris@16
|
154
|
Chris@16
|
155 #include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
|
Chris@16
|
156
|
Chris@16
|
157 #endif // BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
|