| 1 | diff -Naur ../boost_1_42_0-orig//boost/archive/detail/archive_cast.hpp ./boost/archive/detail/archive_cast.hpp
|
|---|
| 2 | --- ../boost_1_42_0-orig//boost/archive/detail/archive_cast.hpp 1969-12-31 19:00:00.000000000 -0500
|
|---|
| 3 | +++ ./boost/archive/detail/archive_cast.hpp 2010-03-20 22:01:49.000000000 -0400
|
|---|
| 4 | @@ -0,0 +1,113 @@
|
|---|
| 5 | +#ifndef BOOST_ARCHIVE_DETAIL_ARCHIVE_CAST_HPP
|
|---|
| 6 | +#define BOOST_ARCHIVE_DETAIL_ARCHIVE_CAST_HPP
|
|---|
| 7 | +
|
|---|
| 8 | +// MS compatible compilers support #pragma once
|
|---|
| 9 | +#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|---|
| 10 | +# pragma once
|
|---|
| 11 | +#endif
|
|---|
| 12 | +
|
|---|
| 13 | +// archive_cast.hpp
|
|---|
| 14 | +
|
|---|
| 15 | +// (C) Copyright 2007 Kim Barrett - kab@irobot.com
|
|---|
| 16 | +// Use, modification and distribution is subject to the Boost Software
|
|---|
| 17 | +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|---|
| 18 | +// http://www.boost.org/LICENSE_1_0.txt)
|
|---|
| 19 | +
|
|---|
| 20 | +#include <boost/config.hpp>
|
|---|
| 21 | +#include <boost/serialization/smart_cast.hpp>
|
|---|
| 22 | +#include <boost/type_traits/is_base_and_derived.hpp>
|
|---|
| 23 | +
|
|---|
| 24 | +#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
|
|---|
| 25 | +
|
|---|
| 26 | +// helper for [i,o]serializers, allowing them to route operation to the
|
|---|
| 27 | +// appropriate specialized archive class. the purpose of archive_cast is to
|
|---|
| 28 | +// provide the serializer with a means of converting a reference to the
|
|---|
| 29 | +// basic_[i,o]archive to the appropriate archive class for further
|
|---|
| 30 | +// serialization.
|
|---|
| 31 | +//
|
|---|
| 32 | +// the Archive type must be the same type for all serialization calls
|
|---|
| 33 | +// applied to a given archive. if the archive is non-polymorphic, the Archive
|
|---|
| 34 | +// type must always be the most derived type of the archive. if the archive
|
|---|
| 35 | +// is polymorphic, the Archive type should always be the polymorphic archive
|
|---|
| 36 | +// type, else there would be little point in using a polymorphic archive type.
|
|---|
| 37 | +//
|
|---|
| 38 | +// in the non-polymorphic case, because Archive is the most derived archive
|
|---|
| 39 | +// type, which is (indirectly) derived from the basic archive class, the
|
|---|
| 40 | +// operation is a (supposedly safe) downcast.
|
|---|
| 41 | +//
|
|---|
| 42 | +// in the polymorphic case, Archive is the polymorphic archive class (or
|
|---|
| 43 | +// possibly something derived from it), and the obvious conversion is a
|
|---|
| 44 | +// dynamic_cast. however, in this case that dynamic_cast is a cross-cast,
|
|---|
| 45 | +// because the polymorphic archive class and the basic archive class are not
|
|---|
| 46 | +// in a base and derived relationship (in either order). cross-casts may be
|
|---|
| 47 | +// extremely expensive on some platforms, so a different approach is desired.
|
|---|
| 48 | +//
|
|---|
| 49 | +// archive_caster provides deferrable conversion of a basic_[i,o]archive to
|
|---|
| 50 | +// Archive. the cast function returns the result of that conversion as a
|
|---|
| 51 | +// void*. the conversion to void* permits the value to be stored in a location
|
|---|
| 52 | +// that has no information about Archive, with a later static cast from that
|
|---|
| 53 | +// void* to Archive*.
|
|---|
| 54 | +//
|
|---|
| 55 | +// archive_cast_pointer provides the customization point for the
|
|---|
| 56 | +// basic_[i,o]archive classes. the intended implementation is to cache the
|
|---|
| 57 | +// result of the caster in the basic archive on the first call, and use the
|
|---|
| 58 | +// previously cached result thereafter.
|
|---|
| 59 | +//
|
|---|
| 60 | +// archive_cast_impl provides a level of indirection so that archive_cast
|
|---|
| 61 | +// only instantiates the archive_caster template when actually needed, and
|
|---|
| 62 | +// not in the case where Archive is derived from From.
|
|---|
| 63 | +
|
|---|
| 64 | +namespace boost {
|
|---|
| 65 | +namespace archive {
|
|---|
| 66 | +namespace detail {
|
|---|
| 67 | +
|
|---|
| 68 | +template<class Archive, class From>
|
|---|
| 69 | +struct BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_caster {
|
|---|
| 70 | + // out of line implementation in impl/archive_cast.ipp.
|
|---|
| 71 | + static void* cast(From& ar);
|
|---|
| 72 | +};
|
|---|
| 73 | +
|
|---|
| 74 | +template<class From>
|
|---|
| 75 | +struct BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_cast_pointer {
|
|---|
| 76 | + // out of line implementations for each relevant From class
|
|---|
| 77 | + static void* get(From& ar, void* (*caster)(From& ar));
|
|---|
| 78 | +};
|
|---|
| 79 | +
|
|---|
| 80 | +template<class From, bool is_derived>
|
|---|
| 81 | +struct BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_cast_impl;
|
|---|
| 82 | +
|
|---|
| 83 | +template<class From>
|
|---|
| 84 | +struct archive_cast_impl<From, true> { // Archive derived from From
|
|---|
| 85 | + template<class Archive>
|
|---|
| 86 | + static Archive& cast(From& ar) {
|
|---|
| 87 | + return boost::serialization::smart_cast_reference<Archive&>(ar);
|
|---|
| 88 | + }
|
|---|
| 89 | +};
|
|---|
| 90 | +
|
|---|
| 91 | +template<class From>
|
|---|
| 92 | +struct archive_cast_impl<From, false> { // Archive not derived from From
|
|---|
| 93 | + template<class Archive>
|
|---|
| 94 | + static Archive& cast(From& ar) {
|
|---|
| 95 | + return *static_cast<Archive*>(
|
|---|
| 96 | + archive_cast_pointer<From>::get(
|
|---|
| 97 | + ar,
|
|---|
| 98 | + archive_caster<Archive, From>::cast));
|
|---|
| 99 | + }
|
|---|
| 100 | +};
|
|---|
| 101 | +
|
|---|
| 102 | +template<class Archive, class From>
|
|---|
| 103 | +inline Archive& archive_cast(From& ar) {
|
|---|
| 104 | + // select implementation based on whether Archive is derived from From
|
|---|
| 105 | + return archive_cast_impl<
|
|---|
| 106 | + From,
|
|---|
| 107 | + boost::is_base_and_derived<From, Archive>::value
|
|---|
| 108 | + >::template cast<Archive>(ar);
|
|---|
| 109 | +}
|
|---|
| 110 | +
|
|---|
| 111 | +} // namespace detail
|
|---|
| 112 | +} // namespace archive
|
|---|
| 113 | +} // namespace boost
|
|---|
| 114 | +
|
|---|
| 115 | +#include <boost/archive/detail/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
|
|---|
| 116 | +
|
|---|
| 117 | +#endif // include guard
|
|---|
| 118 | diff -Naur ../boost_1_42_0-orig//boost/archive/detail/basic_iarchive.hpp ./boost/archive/detail/basic_iarchive.hpp
|
|---|
| 119 | --- ../boost_1_42_0-orig//boost/archive/detail/basic_iarchive.hpp 2009-12-14 18:52:51.000000000 -0500
|
|---|
| 120 | +++ ./boost/archive/detail/basic_iarchive.hpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 121 | @@ -25,6 +25,7 @@
|
|---|
| 122 | #include <boost/type_traits/broken_compiler_spec.hpp>
|
|---|
| 123 | #include <boost/serialization/tracking_enum.hpp>
|
|---|
| 124 | #include <boost/archive/basic_archive.hpp>
|
|---|
| 125 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 126 | #include <boost/archive/detail/decl.hpp>
|
|---|
| 127 | #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
|
|---|
| 128 |
|
|---|
| 129 | @@ -44,6 +45,7 @@
|
|---|
| 130 | class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive :
|
|---|
| 131 | private boost::noncopyable
|
|---|
| 132 | {
|
|---|
| 133 | + friend class archive_cast_pointer<basic_iarchive>;
|
|---|
| 134 | friend class basic_iarchive_impl;
|
|---|
| 135 | // hide implementation of this class to minimize header conclusion
|
|---|
| 136 | // in client code. I couldn't used scoped pointer with borland
|
|---|
| 137 | diff -Naur ../boost_1_42_0-orig//boost/archive/detail/basic_oarchive.hpp ./boost/archive/detail/basic_oarchive.hpp
|
|---|
| 138 | --- ../boost_1_42_0-orig//boost/archive/detail/basic_oarchive.hpp 2009-12-05 01:32:01.000000000 -0500
|
|---|
| 139 | +++ ./boost/archive/detail/basic_oarchive.hpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 140 | @@ -26,6 +26,7 @@
|
|---|
| 141 | // #include <boost/scoped_ptr.hpp>
|
|---|
| 142 |
|
|---|
| 143 | #include <boost/archive/basic_archive.hpp>
|
|---|
| 144 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 145 | #include <boost/serialization/tracking_enum.hpp>
|
|---|
| 146 |
|
|---|
| 147 | #include <boost/archive/detail/abi_prefix.hpp> // must be the last header
|
|---|
| 148 | @@ -46,6 +47,7 @@
|
|---|
| 149 | class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive :
|
|---|
| 150 | private boost::noncopyable
|
|---|
| 151 | {
|
|---|
| 152 | + friend class archive_cast_pointer<basic_oarchive>;
|
|---|
| 153 | friend class basic_oarchive_impl;
|
|---|
| 154 | // hide implementation of this class to minimize header conclusion
|
|---|
| 155 | // in client code. note: borland can't use scoped_ptr
|
|---|
| 156 | diff -Naur ../boost_1_42_0-orig//boost/archive/detail/iserializer.hpp ./boost/archive/detail/iserializer.hpp
|
|---|
| 157 | --- ../boost_1_42_0-orig//boost/archive/detail/iserializer.hpp 2009-12-14 18:52:51.000000000 -0500
|
|---|
| 158 | +++ ./boost/archive/detail/iserializer.hpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 159 | @@ -85,6 +85,7 @@
|
|---|
| 160 | // the following is need only for dynamic cast of polymorphic pointers
|
|---|
| 161 | #include <boost/archive/archive_exception.hpp>
|
|---|
| 162 | #include <boost/archive/detail/basic_iarchive.hpp>
|
|---|
| 163 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 164 | #include <boost/archive/detail/basic_iserializer.hpp>
|
|---|
| 165 | #include <boost/archive/detail/basic_pointer_iserializer.hpp>
|
|---|
| 166 | #include <boost/archive/detail/archive_serializer_map.hpp>
|
|---|
| 167 | @@ -180,7 +181,7 @@
|
|---|
| 168 | // make sure call is routed through the higest interface that might
|
|---|
| 169 | // be specialized by the user.
|
|---|
| 170 | boost::serialization::serialize_adl(
|
|---|
| 171 | - boost::serialization::smart_cast_reference<Archive &>(ar),
|
|---|
| 172 | + archive_cast<Archive>(ar),
|
|---|
| 173 | * static_cast<T *>(x),
|
|---|
| 174 | file_version
|
|---|
| 175 | );
|
|---|
| 176 | @@ -293,8 +294,7 @@
|
|---|
| 177 | const unsigned int file_version
|
|---|
| 178 | ) const
|
|---|
| 179 | {
|
|---|
| 180 | - Archive & ar_impl =
|
|---|
| 181 | - boost::serialization::smart_cast_reference<Archive &>(ar);
|
|---|
| 182 | + Archive & ar_impl = archive_cast<Archive>(ar);
|
|---|
| 183 |
|
|---|
| 184 | auto_ptr_with_deleter<T> ap(heap_allocator<T>::invoke());
|
|---|
| 185 | if(NULL == ap.get())
|
|---|
| 186 | diff -Naur ../boost_1_42_0-orig//boost/archive/detail/oserializer.hpp ./boost/archive/detail/oserializer.hpp
|
|---|
| 187 | --- ../boost_1_42_0-orig//boost/archive/detail/oserializer.hpp 2009-12-05 01:32:01.000000000 -0500
|
|---|
| 188 | +++ ./boost/archive/detail/oserializer.hpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 189 | @@ -61,6 +61,7 @@
|
|---|
| 190 |
|
|---|
| 191 | #include <boost/archive/archive_exception.hpp>
|
|---|
| 192 | #include <boost/archive/detail/basic_oarchive.hpp>
|
|---|
| 193 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 194 | #include <boost/archive/detail/basic_oserializer.hpp>
|
|---|
| 195 | #include <boost/archive/detail/basic_pointer_oserializer.hpp>
|
|---|
| 196 | #include <boost/archive/detail/archive_serializer_map.hpp>
|
|---|
| 197 | @@ -146,7 +147,7 @@
|
|---|
| 198 | // be specialized by the user.
|
|---|
| 199 | BOOST_STATIC_ASSERT(boost::is_const<T>::value == false);
|
|---|
| 200 | boost::serialization::serialize_adl(
|
|---|
| 201 | - boost::serialization::smart_cast_reference<Archive &>(ar),
|
|---|
| 202 | + archive_cast<Archive>(ar),
|
|---|
| 203 | * static_cast<T *>(const_cast<void *>(x)),
|
|---|
| 204 | version()
|
|---|
| 205 | );
|
|---|
| 206 | @@ -191,8 +192,7 @@
|
|---|
| 207 | // be specialized by the user.
|
|---|
| 208 | T * t = static_cast<T *>(const_cast<void *>(x));
|
|---|
| 209 | const unsigned int file_version = boost::serialization::version<T>::value;
|
|---|
| 210 | - Archive & ar_impl
|
|---|
| 211 | - = boost::serialization::smart_cast_reference<Archive &>(ar);
|
|---|
| 212 | + Archive & ar_impl = archive_cast<Archive>(ar);
|
|---|
| 213 | boost::serialization::save_construct_data_adl<Archive, T>(
|
|---|
| 214 | ar_impl,
|
|---|
| 215 | t,
|
|---|
| 216 | diff -Naur ../boost_1_42_0-orig//boost/archive/impl/archive_cast.ipp ./boost/archive/impl/archive_cast.ipp
|
|---|
| 217 | --- ../boost_1_42_0-orig//boost/archive/impl/archive_cast.ipp 1969-12-31 19:00:00.000000000 -0500
|
|---|
| 218 | +++ ./boost/archive/impl/archive_cast.ipp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 219 | @@ -0,0 +1,23 @@
|
|---|
| 220 | +// archive_cast.ipp
|
|---|
| 221 | +
|
|---|
| 222 | +// (C) Copyright 2007 Kim Barrett - kab@irobot.com
|
|---|
| 223 | +// Use, modification and distribution is subject to the Boost Software
|
|---|
| 224 | +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
|---|
| 225 | +// http://www.boost.org/LICENSE_1_0.txt)
|
|---|
| 226 | +
|
|---|
| 227 | +#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
|
|---|
| 228 | +
|
|---|
| 229 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 230 | +
|
|---|
| 231 | +namespace boost {
|
|---|
| 232 | +namespace archive {
|
|---|
| 233 | +namespace detail {
|
|---|
| 234 | +
|
|---|
| 235 | +template<class Archive, class From>
|
|---|
| 236 | +void* archive_caster<Archive, From>::cast(From& ar) {
|
|---|
| 237 | + return & dynamic_cast<Archive &>(ar);
|
|---|
| 238 | +}
|
|---|
| 239 | +
|
|---|
| 240 | +} // namespace detail
|
|---|
| 241 | +} // namespace archive
|
|---|
| 242 | +} // namespace boost
|
|---|
| 243 | diff -Naur ../boost_1_42_0-orig//libs/serialization/src/basic_iarchive.cpp ./libs/serialization/src/basic_iarchive.cpp
|
|---|
| 244 | --- ../boost_1_42_0-orig//libs/serialization/src/basic_iarchive.cpp 2009-12-14 18:48:21.000000000 -0500
|
|---|
| 245 | +++ ./libs/serialization/src/basic_iarchive.cpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 246 | @@ -38,6 +38,7 @@
|
|---|
| 247 | #include <boost/archive/detail/basic_iserializer.hpp>
|
|---|
| 248 | #include <boost/archive/detail/basic_pointer_iserializer.hpp>
|
|---|
| 249 | #include <boost/archive/detail/basic_iarchive.hpp>
|
|---|
| 250 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 251 |
|
|---|
| 252 | #include <boost/archive/detail/auto_link_archive.hpp>
|
|---|
| 253 |
|
|---|
| 254 | @@ -49,8 +50,11 @@
|
|---|
| 255 |
|
|---|
| 256 | class basic_iarchive_impl {
|
|---|
| 257 | friend class basic_iarchive;
|
|---|
| 258 | + friend class archive_cast_pointer<basic_iarchive>;
|
|---|
| 259 | version_type m_archive_library_version;
|
|---|
| 260 | unsigned int m_flags;
|
|---|
| 261 | + void* (*m_cached_archive_caster)(basic_iarchive&);
|
|---|
| 262 | + void* m_cached_archive_cast_pointer;
|
|---|
| 263 |
|
|---|
| 264 | //////////////////////////////////////////////////////////////////////
|
|---|
| 265 | // information about each serialized object loaded
|
|---|
| 266 | @@ -164,6 +168,8 @@
|
|---|
| 267 | basic_iarchive_impl(unsigned int flags) :
|
|---|
| 268 | m_archive_library_version(BOOST_ARCHIVE_VERSION()),
|
|---|
| 269 | m_flags(flags),
|
|---|
| 270 | + m_cached_archive_caster(NULL),
|
|---|
| 271 | + m_cached_archive_cast_pointer(NULL),
|
|---|
| 272 | moveable_objects_start(0),
|
|---|
| 273 | moveable_objects_end(0),
|
|---|
| 274 | moveable_objects_recent(0),
|
|---|
| 275 | @@ -581,6 +587,31 @@
|
|---|
| 276 | return pimpl->m_flags;
|
|---|
| 277 | }
|
|---|
| 278 |
|
|---|
| 279 | +// this is identical to the corresponding basic_oarchive function.
|
|---|
| 280 | +// it would be nice if they could be merged into one parameterized definition,
|
|---|
| 281 | +// but doing so seems more work than accepting and noting the duplication.
|
|---|
| 282 | +template<>
|
|---|
| 283 | +BOOST_ARCHIVE_DECL(void*)
|
|---|
| 284 | +archive_cast_pointer<basic_iarchive>::get(
|
|---|
| 285 | + basic_iarchive& ar, void* (*caster)(basic_iarchive&))
|
|---|
| 286 | +{
|
|---|
| 287 | + void* result = ar.pimpl->m_cached_archive_cast_pointer;
|
|---|
| 288 | + if (result) {
|
|---|
| 289 | + // already cached.
|
|---|
| 290 | + // if debug build, verify called with same caster.
|
|---|
| 291 | + assert(caster == ar.pimpl->m_cached_archive_caster);
|
|---|
| 292 | + // if debug build, verify cached result matches caster result.
|
|---|
| 293 | + // otherwise, assume it does and skip expensive cast
|
|---|
| 294 | + assert(result == caster(ar));
|
|---|
| 295 | + } else {
|
|---|
| 296 | + // on first call, use the caster's result and cache for later reuse.
|
|---|
| 297 | + result = caster(ar);
|
|---|
| 298 | + ar.pimpl->m_cached_archive_caster = caster;
|
|---|
| 299 | + ar.pimpl->m_cached_archive_cast_pointer = result;
|
|---|
| 300 | + }
|
|---|
| 301 | + return result;
|
|---|
| 302 | +}
|
|---|
| 303 | +
|
|---|
| 304 | } // namespace detail
|
|---|
| 305 | } // namespace archive
|
|---|
| 306 | } // namespace boost
|
|---|
| 307 | diff -Naur ../boost_1_42_0-orig//libs/serialization/src/basic_oarchive.cpp ./libs/serialization/src/basic_oarchive.cpp
|
|---|
| 308 | --- ../boost_1_42_0-orig//libs/serialization/src/basic_oarchive.cpp 2009-12-05 01:34:10.000000000 -0500
|
|---|
| 309 | +++ ./libs/serialization/src/basic_oarchive.cpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 310 | @@ -27,6 +27,7 @@
|
|---|
| 311 | #include <boost/archive/detail/basic_oserializer.hpp>
|
|---|
| 312 | #include <boost/archive/detail/basic_pointer_oserializer.hpp>
|
|---|
| 313 | #include <boost/archive/detail/basic_oarchive.hpp>
|
|---|
| 314 | +#include <boost/archive/detail/archive_cast.hpp>
|
|---|
| 315 | #include <boost/archive/archive_exception.hpp>
|
|---|
| 316 | #include <boost/serialization/extended_type_info.hpp>
|
|---|
| 317 |
|
|---|
| 318 | @@ -43,7 +44,10 @@
|
|---|
| 319 |
|
|---|
| 320 | class basic_oarchive_impl {
|
|---|
| 321 | friend class basic_oarchive;
|
|---|
| 322 | + friend class archive_cast_pointer<basic_oarchive>;
|
|---|
| 323 | unsigned int m_flags;
|
|---|
| 324 | + void* (*m_cached_archive_caster)(basic_oarchive&);
|
|---|
| 325 | + void* m_cached_archive_cast_pointer;
|
|---|
| 326 |
|
|---|
| 327 | //////////////////////////////////////////////////////////////////////
|
|---|
| 328 | // information about each serialized object saved
|
|---|
| 329 | @@ -138,6 +142,8 @@
|
|---|
| 330 |
|
|---|
| 331 | basic_oarchive_impl(unsigned int flags) :
|
|---|
| 332 | m_flags(flags),
|
|---|
| 333 | + m_cached_archive_caster(NULL),
|
|---|
| 334 | + m_cached_archive_cast_pointer(NULL),
|
|---|
| 335 | pending_object(NULL),
|
|---|
| 336 | pending_bos(NULL)
|
|---|
| 337 | {}
|
|---|
| 338 | @@ -459,6 +465,31 @@
|
|---|
| 339 | basic_oarchive::end_preamble(){
|
|---|
| 340 | }
|
|---|
| 341 |
|
|---|
| 342 | +// this is identical to the corresponding basic_iarchive function.
|
|---|
| 343 | +// it would be nice if they could be merged into one parameterized definition,
|
|---|
| 344 | +// but doing so seems more work than accepting and noting the duplication.
|
|---|
| 345 | +template<>
|
|---|
| 346 | +BOOST_ARCHIVE_DECL(void*)
|
|---|
| 347 | +archive_cast_pointer<basic_oarchive>::get(
|
|---|
| 348 | + basic_oarchive& ar, void* (*caster)(basic_oarchive&))
|
|---|
| 349 | +{
|
|---|
| 350 | + void* result = ar.pimpl->m_cached_archive_cast_pointer;
|
|---|
| 351 | + if (result) {
|
|---|
| 352 | + // already cached.
|
|---|
| 353 | + // if debug build, verify called with same caster.
|
|---|
| 354 | + assert(caster == ar.pimpl->m_cached_archive_caster);
|
|---|
| 355 | + // if debug build, verify cached result matches caster result.
|
|---|
| 356 | + // otherwise, assume it does and skip expensive cast
|
|---|
| 357 | + assert(result == caster(ar));
|
|---|
| 358 | + } else {
|
|---|
| 359 | + // on first call, use the caster's result and cache for later reuse.
|
|---|
| 360 | + result = caster(ar);
|
|---|
| 361 | + ar.pimpl->m_cached_archive_caster = caster;
|
|---|
| 362 | + ar.pimpl->m_cached_archive_cast_pointer = result;
|
|---|
| 363 | + }
|
|---|
| 364 | + return result;
|
|---|
| 365 | +}
|
|---|
| 366 | +
|
|---|
| 367 | } // namespace detail
|
|---|
| 368 | } // namespace archive
|
|---|
| 369 | } // namespace boost
|
|---|
| 370 | diff -Naur ../boost_1_42_0-orig//libs/serialization/src/polymorphic_iarchive.cpp ./libs/serialization/src/polymorphic_iarchive.cpp
|
|---|
| 371 | --- ../boost_1_42_0-orig//libs/serialization/src/polymorphic_iarchive.cpp 2009-08-01 19:32:25.000000000 -0400
|
|---|
| 372 | +++ ./libs/serialization/src/polymorphic_iarchive.cpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 373 | @@ -18,11 +18,15 @@
|
|---|
| 374 | #include <boost/archive/impl/archive_serializer_map.ipp>
|
|---|
| 375 | #include <boost/archive/polymorphic_iarchive.hpp>
|
|---|
| 376 |
|
|---|
| 377 | +#include <boost/archive/impl/archive_cast.ipp>
|
|---|
| 378 | +#include <boost/archive/detail/basic_iarchive.hpp>
|
|---|
| 379 | +
|
|---|
| 380 | namespace boost {
|
|---|
| 381 | namespace archive {
|
|---|
| 382 | namespace detail {
|
|---|
| 383 |
|
|---|
| 384 | template class archive_serializer_map<polymorphic_iarchive>;
|
|---|
| 385 | +template class archive_caster<polymorphic_iarchive, basic_iarchive>;
|
|---|
| 386 |
|
|---|
| 387 | } // detail
|
|---|
| 388 | } // archive
|
|---|
| 389 | diff -Naur ../boost_1_42_0-orig//libs/serialization/src/polymorphic_oarchive.cpp ./libs/serialization/src/polymorphic_oarchive.cpp
|
|---|
| 390 | --- ../boost_1_42_0-orig//libs/serialization/src/polymorphic_oarchive.cpp 2009-09-19 22:18:02.000000000 -0400
|
|---|
| 391 | +++ ./libs/serialization/src/polymorphic_oarchive.cpp 2010-03-20 21:53:40.000000000 -0400
|
|---|
| 392 | @@ -18,11 +18,15 @@
|
|---|
| 393 | #include <boost/archive/impl/archive_serializer_map.ipp>
|
|---|
| 394 | #include <boost/archive/polymorphic_oarchive.hpp>
|
|---|
| 395 |
|
|---|
| 396 | +#include <boost/archive/impl/archive_cast.ipp>
|
|---|
| 397 | +#include <boost/archive/detail/basic_oarchive.hpp>
|
|---|
| 398 | +
|
|---|
| 399 | namespace boost {
|
|---|
| 400 | namespace archive {
|
|---|
| 401 | namespace detail {
|
|---|
| 402 |
|
|---|
| 403 | template class archive_serializer_map<polymorphic_oarchive>;
|
|---|
| 404 | +template class archive_caster<polymorphic_oarchive, basic_oarchive>;
|
|---|
| 405 |
|
|---|
| 406 | } // detail
|
|---|
| 407 | } // archive
|
|---|