Compare commits

...

1534 Commits

Author SHA1 Message Date
Peter Dimov 91c265be64 Merge branch '#315-fix-for-reverse-include-logic-in-throw_exception.hpp' of https://github.com/gaspardpetit/serialization into feature/issue-315 2026-06-28 16:16:06 +03:00
Peter Dimov 863528b341 Add a smoke test for <exception-handling>off. Refs #315. Refs #316. 2026-06-28 16:14:58 +03:00
Peter Dimov 9030e357d9 Disable std::variant testing under Clang 6.0 2026-06-28 15:06:57 +03:00
Peter Dimov 47b7f7297d Add CMake tests 2026-06-28 13:24:13 +03:00
Peter Dimov acc30bc8a0 Avoid visit ambiguity in test_variant.cpp 2026-06-28 12:54:10 +03:00
Peter Dimov 8322195a39 Define _CRT_SECURE_NO_WARNINGS for Clang-cl as well 2026-06-28 11:44:57 +03:00
Peter Dimov ddc98ca384 Add import testing to test/Jamfile 2026-06-27 21:38:04 +03:00
Peter Dimov a842484cd3 Replace ci.yml 2026-06-27 21:08:35 +03:00
Peter Dimov 097a6c63a1 Merge pull request #340 from Lastique/feature/remove_static_assert
Remove dependencies on Boost.StaticAssert
2026-04-25 21:31:13 +03:00
Andrey Semashev 635c447262 Remove dependencies on Boost.StaticAssert.
Boost.StaticAssert has been merged into Boost.Config, so remove
the dependency.
2026-01-22 22:40:52 +03:00
Robert Ramey 8a8c62864f Merge pull request #317 from grafikrobot/modular
Add support for modular build structure.
2024-08-18 11:53:35 -07:00
Rene Rivera 03f542ab4e Change math dep real target math/tr1. 2024-08-11 09:23:25 -05:00
Rene Rivera 36f1ea6374 Split b2 dependencies into public and private. 2024-07-26 17:46:20 -05:00
Rene Rivera aaaa80d148 Move inter-lib dependencies to a project variable and into the build targets. 2024-07-23 22:34:22 -05:00
Rene Rivera 6e84870afd Update copyright dates. 2024-07-20 22:52:03 -05:00
Rene Rivera 3fa840faa7 Bump B2 require to 5.2 2024-06-14 11:33:56 -05:00
Rene Rivera 2a33d54843 Sync from upstream. 2024-06-10 21:39:41 -05:00
Robert Ramey 0c53f8e5bd Merge commit '46165e3514e2b82e3073ddb5ff231b348fdc0ad5' into develop
* commit '46165e3514e2b82e3073ddb5ff231b348fdc0ad5':
  Remove no longer necessary command line options from build/Jamfile, util/test.jam
2024-06-08 10:48:33 -07:00
Robert Ramey 38a3cd5420 Merge commit '2a2973183824e1ab35efd8f536491cdd7bd316ed' into develop
* commit '2a2973183824e1ab35efd8f536491cdd7bd316ed':
  Fix -Wsign-compare warnings in variant.hpp; also catches the case when `which` is negative
2024-06-08 10:48:22 -07:00
Gaspard Petit 9d9b0f4cfa Fixed include logic when BOOST_NO_EXCEPTIONS is defined 2024-06-07 21:21:17 -04:00
Rene Rivera caa3806dcb Update dependencies. 2024-05-13 21:47:19 -05:00
Rene Rivera a08d9d54cc Add requires-b2 check to top-level build file. 2024-05-05 09:00:01 -05:00
Rene Rivera 58c43bc283 Remove import-search from non-project jam file. 2024-05-05 08:09:42 -05:00
Rene Rivera 1209707581 Add missing import-search for cconfig/predef checks. 2024-05-04 23:32:31 -05:00
Rene Rivera 4310637105 Add missing NO_LIB usage requirements. 2024-04-28 20:16:45 -05:00
Rene Rivera ab0b5d6154 Fix cross lib relative build ref. 2024-04-26 23:15:22 -05:00
Peter Dimov 46165e3514 Remove no longer necessary command line options from build/Jamfile, util/test.jam 2024-04-11 03:08:14 +03:00
Peter Dimov 2a29731838 Fix -Wsign-compare warnings in variant.hpp; also catches the case when which is negative 2024-04-11 02:40:21 +03:00
Peter Dimov d8e072a78d Add break statements inadvertently omitted in #310 2024-04-10 22:11:51 +03:00
Rene Rivera 098bcad5d5 Sync from upstream. 2024-04-10 07:56:24 -05:00
Rene Rivera 6b64c89e2b Switch to library requirements instead of source. As source puts extra source in install targets. 2024-03-29 21:15:59 -05:00
Robert Ramey a32906b8e6 changes to serialization of variants to support boost/variant, boost/variant2 and std::variant 2024-03-23 16:08:17 -07:00
Rene Rivera 2e54522f1a Sync from upstream. 2024-03-23 15:40:59 -05:00
Robert Ramey 2e044c7384 Merge pull request #310 from boostorg/feature/va-start
Restore removed va_start calls; add missing va_end as reported in #264.
2024-03-23 13:19:52 -07:00
Peter Dimov d52537a5ad Restore removed va_start calls; add missing va_end as reported in #264. 2024-03-14 19:04:57 +02:00
Rene Rivera f3a9811740 Make the library modular usable. 2024-03-11 08:38:17 -05:00
Robert Ramey 2805bc3faa removed test dependency on lexical cast 2024-01-08 22:20:18 -08:00
Robert Ramey a20c4d97c3 removed C++03 dependency from test 2023-11-12 21:05:11 -08:00
Robert Ramey 9aa208d9be made C++ 11 the default 2023-11-02 20:23:32 -07:00
Robert Ramey ff0a5f9f4a corrected inclusion of <optional> 2023-11-02 20:17:08 -07:00
Robert Ramey e01b988e70 Merge branch 'develop'
* develop: (108 commits)
  removed unordered tests
  tests have been taken over by developers of boost unordered
  uploading changes regarding unordered ... uploading tweaks to CMakeLists.txt so accommodate static linking
  imported/implemented boost/serialization/variant  and test_variant
  Remove serialization support from Boost.Unordered containers
  Fix invalid vptr access in extended_type_info_no_rtti constructor
  Fix invalid downcast in ~xml_oarchive_impl
  altered boost optional to depend only public interface functions declared in std::optional. adjusted test_optional to test serialization of both boost::optional and std::optional
  Revert "Add serialization for std::optional"
  fix new requirement - if assigment is not defaulted, copy can't be either
  Fix clang-cl regression introduced by #282
  correction in previous merge
  Remove debug output from util/test.jam
  Fix Sub::operator== signature to avoid ambiguity errors in C++20
  Remove C++03 from GHA, because Variant and LexicalCast no longer compile under C++03
  incremement archive version number fix PR 274 fix PR 283
  committing most pending PRs
  Replace static_cast with reinterpet_cast in interface_oarchive
  Update xml_escape::fill() to default assign bstart, bend to an empty string
  Use the first instance of bos during serialization (for the case when there are multiple instances)
  ...
2023-11-01 14:17:27 -07:00
Robert Ramey e4756b71b5 removed unordered tests 2023-11-01 14:16:26 -07:00
Robert Ramey f3eaf91ca1 tests have been taken over by developers of boost unordered 2023-10-31 14:32:34 -07:00
Robert Ramey a2f93247e2 uploading changes regarding unordered ...
uploading tweaks to CMakeLists.txt so accommodate static linking
2023-10-20 15:20:43 -07:00
Robert Ramey 01c26ba107 Merge pull request #292 from cmazakas/ubsan-fixes-v2
ubsan fixes v2
2023-10-20 13:42:37 -07:00
Robert Ramey 404e0a31ae Merge pull request #289 from cmazakas/unordered-serialization
Remove serialization support from Boost.Unordered containers
2023-10-13 12:48:01 -07:00
Robert Ramey 90e3ce2fb9 cleanup of files which shouldn't be there. 2023-10-10 12:42:47 -07:00
Robert Ramey 897dec4c01 imported/implemented boost/serialization/variant and test_variant
imported/implemented boost/serialization/variant now contains code for serialization of boost::variant, boost::variant2 and std::variant. Care has been taken to depend only on the public interfaces of these types. Hence, it is reasonable to hope that the archives are compatible in that one type could be saved and subsequently loaded into a compatible type.  Hopefully this will be useful in some way.  At a minimum it minimizes code duplication.
2023-09-18 10:49:21 -07:00
Christian Mazakas f28482232d Remove serialization support from Boost.Unordered containers
Unordered now supports its Serialization functions so the headers just need to be updated to keep backwards compatibility
2023-09-11 14:52:51 -07:00
Christian Mazakas 6388138a0c Fix invalid vptr access in extended_type_info_no_rtti constructor
Initializing a base class in the initializer list with a member function in the derived is invalid in gcc as the object isn't fully-formed

We instead just inline the body of `get_key()` which avoids the issue.
2023-09-11 13:59:51 -07:00
Christian Mazakas 8d0fbb79f3 Fix invalid downcast in ~xml_oarchive_impl
The destructor of the xml_oarchive_impl winds up calling `this->windup()` which in turn invokes `this->This()->...` which essentially static_cast's to a Archive, which by this point in time is long-since destructed.

By simply inlining the implementation of windup(), we avoid the UB and minimize the required code changes
2023-09-11 13:59:51 -07:00
Robert Ramey 61a2b12076 altered boost optional to depend only public interface functions declared in std::optional.
adjusted test_optional to test serialization of both boost::optional and std::optional
2023-09-08 09:54:14 -07:00
Robert Ramey 5ba9e77ad6 Merge pull request #299 from boostorg/revert-163-add-std-optional-support
Revert "Add serialization for std::optional"
2023-09-03 14:37:14 -07:00
Robert Ramey 74c46ec43c Revert "Add serialization for std::optional" 2023-09-03 14:36:59 -07:00
Robert Ramey 1af820b02e Merge pull request #163 from sdebionne/add-std-optional-support
Add serialization for std::optional
2023-09-03 14:19:57 -07:00
Robert Ramey cb729f5d88 Merge pull request #148 from sdebionne/add-std-variant-support
Add support for C++17 std::variant
2023-09-03 13:06:00 -07:00
Robert Ramey ae305113ff Merge pull request #287 from olologin/fix_for_multiple_bos_in_process
Use the first instance of bos during serialization
2023-09-01 15:14:12 -07:00
Robert Ramey c241d3485c fix new requirement - if assigment is not defaulted, copy can't be either 2023-08-30 13:16:20 -07:00
Robert Ramey 9cd8257b08 Merge commit '6bf961f31e7e13c18548b553070e132347d2b58b' into develop
* commit '6bf961f31e7e13c18548b553070e132347d2b58b':
  Guard MSVC pragmas from clang-cl
2023-08-29 15:05:10 -07:00
Peter Dimov 030b627dce Fix clang-cl regression introduced by #282 2023-08-28 17:37:15 +03:00
Robert Ramey 14b10185de correction in previous merge 2023-08-27 07:40:09 -07:00
Robert Ramey 0e15a5984b Merge commit 'f395fa35faf32a89de4673fa54635eeb5eb39f0c' into develop
* commit 'f395fa35faf32a89de4673fa54635eeb5eb39f0c':
  Remove debug output from util/test.jam
2023-08-26 22:27:29 -07:00
Robert Ramey dfe5c018f8 Merge commit '48a60a2bbb6b214d3c295fc2943aff22db63a944' into develop
* commit '48a60a2bbb6b214d3c295fc2943aff22db63a944':
  Remove C++03 from GHA, because Variant and LexicalCast no longer compile under C++03
2023-08-26 22:27:05 -07:00
Peter Dimov f395fa35fa Remove debug output from util/test.jam 2023-08-26 00:27:50 +03:00
Peter Dimov 52bcaffa8c Fix Sub::operator== signature to avoid ambiguity errors in C++20 2023-08-26 00:08:48 +03:00
Peter Dimov 48a60a2bbb Remove C++03 from GHA, because Variant and LexicalCast no longer compile under C++03 2023-08-25 20:57:19 +03:00
Robert Ramey 9a72e5407b incremement archive version number
fix PR 274
fix PR 283
2023-08-24 11:47:59 -07:00
Robert Ramey ab1da83f40 committing most pending PRs 2023-08-23 15:49:25 -07:00
Robert Ramey 60a28371c5 Merge pull request #288 from cmazakas/xml-ubsan-fixes
XML ubsan fixes
2023-08-23 11:58:32 -07:00
Robert Ramey 2cda20b221 Merge pull request #285 from SilverPlate3/BOOT_CLASS_EXPORT__Issue222
Change BOOT_CLASS_EXPORT to BOOST_CLASS_EXPORT
2023-08-23 11:55:32 -07:00
Robert Ramey ae69bf4ba9 Merge pull request #284 from mborland/gha
Use containers to supported deprecated OS with GHA
2023-08-23 11:53:50 -07:00
Robert Ramey f3c564c1fd Merge pull request #282 from boostorg/better_config
Simplify no wstreambuf support.
2023-08-23 11:52:32 -07:00
Robert Ramey 5e8c130c5e Merge pull request #280 from ecatmur/deprecated-copy
Declare non-ODR-used copy constructor
2023-08-23 11:51:24 -07:00
Robert Ramey bb4d07e874 Merge pull request #277 from TobiasLange75443/develop
add ':' (colon) as valid char for an XML tag
2023-08-23 11:50:08 -07:00
Robert Ramey cc2d5dc850 Merge pull request #276 from Romain-Geissler-1A/fix-deprecated-copy-warning
Fix clang -Wdeprecated-copy warning when using -std=gnu++2b in boost/archive/detail/helper_collection.hpp
2023-08-23 11:47:41 -07:00
Robert Ramey 7d0e15503f Merge pull request #275 from josch/document-archive-version-19
src/basic_archive.cpp: improve docs for archive version 19
2023-08-23 11:43:46 -07:00
Christian Mazakas d56e16b391 Replace static_cast with reinterpet_cast in interface_oarchive
There's no inheritance so static_cast'ing to a base is incorrect, instead we use reinterpret_cast with the common initial sequence to avoid ubsan failures
2023-08-22 12:44:58 -07:00
Christian Mazakas 0e64d96019 Update xml_escape::fill() to default assign bstart, bend to an empty string
This avoids an extraneous warning when running Serialization code through ubsan which flags increments to a nullptr

The relevant condtional check (`++m_bnext < m_bend`) still passes with this change
2023-08-22 12:43:39 -07:00
olologin b83e440efe Use the first instance of bos during serialization (for the case when there are multiple instances) 2023-07-20 16:35:37 +03:00
SilverPlate3 2aabad74cc Change BOOT_CLASS_EXPORT to BOOST_CLASS_EXPORT 2023-07-08 14:35:34 +03:00
Matt Borland 5b08b01437 Add clang-win and MSVC 14.3 2023-07-07 10:03:06 +02:00
Matt Borland 9bd9550ad1 Suppress additional polymorphic UB warning 2023-07-06 10:39:00 +02:00
Matt Borland be9421f80f Suppress UB warning 2023-07-05 17:27:02 +02:00
Matt Borland cf5d908a8b Add msvc-14.0 2023-07-05 17:06:07 +02:00
Matt Borland 856eb3a567 Reduce UBSAN runs 2023-07-05 11:23:05 +02:00
Matt Borland efddba7b8f Change concurrency to support multiple workflows 2023-07-05 11:19:50 +02:00
Matt Borland ef7e8c4ca5 Change tested language standards 2023-06-30 15:19:25 +02:00
Matt Borland a0d30cbb18 Add null check 2023-06-30 13:58:34 +02:00
Matt Borland a278309f29 Update windows version and add concurrency feature 2023-06-29 13:03:57 +02:00
Matt Borland 85cb258dd2 Fix package being installed 2023-06-29 13:01:33 +02:00
Matt Borland 87e657de24 Change shell to bash 2023-06-29 09:38:51 +02:00
Matt Borland 7a70b2fca2 Increase timeout time 2023-06-28 18:14:06 +02:00
Matt Borland b7b504829f Use containers to supported deprecated OS with GHA 2023-06-28 08:23:07 +02:00
jzmaddock 3a58de12d5 Simplify no wstreambuf support.
See https://github.com/boostorg/serialization/pull/224.
2023-04-29 13:38:11 +01:00
Ed Catmur 58d722996e Also: remove redundant copy assignment operator
since it deprecates the compiler-provided copy constructor

the compiler-provided copy assignment operator is identical
2023-02-22 23:01:21 +00:00
Ed Catmur a456d33e25 Declare non-ODR-used copy constructor
The compiler-generated copy constructor is deprecated since C++11 on classes with user-declared copy assignment operator.

This change allows clean compilation with the -Wdeprecated-copy/-Wdeprecated-copy-with-user-provided-ctor flag.
2023-02-22 19:59:38 +00:00
Tobias Lange c977d4e623 add ':' (colon) as valid char for an XML tag 2023-01-12 10:05:53 +01:00
Romain Geissler a7a8704438 Fix clang -Wdeprecated-copy warning when using -std=gnu++2b in boost/archive/detail/helper_collection.hpp
In file included from magadm/CmdGetInfoHTHSession.cpp:24:
In file included from /remote/users/mlamesch/CloneFromPlatinum/SI_Pack23-2/common/include/si/common/HTHSegmentationCacheInfoSerialization.h:19:
In file included from /data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/text_iarchive.hpp:24:
In file included from /data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/basic_text_iarchive.hpp:30:
In file included from /data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/detail/common_iarchive.hpp:21:
In file included from /data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/detail/basic_iarchive.hpp:28:
/data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/detail/helper_collection.hpp:58:44: error: definition of implicit copy constructor for 'predicate' is deprecated because it has a user-declared copy assignment operator [-Werror,-Wdeprecated-copy]
        BOOST_DELETED_FUNCTION(predicate & operator=(const predicate & rhs))
                                           ^
/opt/1A/toolchain/x86_64-v23.0.2/lib64/gcc/x86_64-1a-linux-gnu/13.0.0/../../../../include/c++/13.0.0/bits/predefined_ops.h:325:37: note: in implicit copy constructor for 'boost::archive::detail::helper_collection::predicate' first required here
    { return _Iter_pred<_Predicate>(_GLIBCXX_MOVE(__pred)); }
                                    ^
/opt/1A/toolchain/x86_64-v23.0.2/lib64/gcc/x86_64-1a-linux-gnu/13.0.0/../../../../include/c++/13.0.0/bits/move.h:167:30: note: expanded from macro '_GLIBCXX_MOVE'
                             ^
/opt/1A/toolchain/x86_64-v23.0.2/lib64/gcc/x86_64-1a-linux-gnu/13.0.0/../../../../include/c++/13.0.0/bits/stl_algo.h:3923:26: note: in instantiation of function template specialization '__gnu_cxx::__ops::__pred_iter<boost::archive::detail::helper_collection::predicate>' requested here
                            __gnu_cxx::__ops::__pred_iter(__pred));
                                              ^
/data/mwrep/res/osp/Boost/23-0-0-0/include/boost/archive/detail/helper_collection.hpp:75:18: note: in instantiation of function template specialization 'std::find_if<__gnu_cxx::__normal_iterator<std::pair<const void *, boost::shared_ptr<void>> *, std::vector<std::pair<const void *, boost::shared_ptr<void>>>>, boost::archive::detail::helper_collection::predicate>' requested here
            std::find_if(
                 ^
2023-01-08 16:28:49 +00:00
Johannes Schauer Marin Rodrigues 48d47e4ed6 src/basic_archive.cpp: improve docs for archive version 19 2022-12-08 15:08:05 +01:00
Robert Ramey 3f322d4adc fix address sanitizer exception when loading corrupted XML archive. GitHub issue #257 2022-09-16 16:15:50 -07:00
Robert Ramey df2e6703c3 iserializer should throw when file_version > version() #258 2022-09-15 15:34:25 -07:00
Robert Ramey 670648f276 Merge pull request #256 from BrianWeed/develop
Use rehash(count) instead of rehash(bucket_count), to avoid excessive pre-allocation.
2022-09-15 14:08:31 -07:00
Robert Ramey 88d270543b Merge pull request #241 from alxrmorozov/mb_from_wchar-copy-ctor
Fix mb_from_wchar copy constructor
2022-09-15 13:43:28 -07:00
Robert Ramey 2012f8c184 Merge pull request #245 from jngrad/spellchecker
Documentation maintenance
2022-09-15 13:41:36 -07:00
Antony Polukhin 8cdb837bb9 Fix misleading indentation warning (#262) 2022-09-11 12:46:46 -07:00
Antony Polukhin b87d54da86 Modernize throw specifications (#263) 2022-09-11 12:35:48 -07:00
Robert Ramey 473e02755f updateing git ignore 2022-09-10 14:20:20 -07:00
Robert Ramey 3f46a64ff4 change to CI files to eliminate non working platforms 2022-09-09 10:37:41 -07:00
BrianWeed 532a1c5e26 Update unordered_collections_load_imp.hpp 2022-05-04 15:02:04 -04:00
Robert Ramey a8bbb11cd2 updated version of ubuntu from 16 to 18
made sure ubuntu versions are installed
2022-03-07 12:22:06 -08:00
Robert Ramey b7ae64e95c backout previous change 2022-03-02 10:06:48 -08:00
Robert Ramey 08b257f927 iadjust exception handling
:w
:q
:wq
2022-02-25 12:10:05 -08:00
jzmaddock b4412f2867 Missing #include in throw_exception.hpp
boost/serialization/throw_exception.hpp does not include the header which defines boost::throw_exception leading to compiler errors unless that header just happens to be #included elsewhere.  See this message thread: https://lists.boost.org/boost-users/2022/01/91144.php

Likewise the std lib header <exception> is *not* required since we use nothing from that here.
2022-01-12 16:31:16 +00:00
Jean-Noël Grad 358b3e0894 Fix HTML escape codes 2021-12-31 18:17:22 +01:00
Jean-Noël Grad 3fa5669d72 Spellcheck documentation and code comments 2021-12-31 18:16:03 +01:00
Jean-Noël Grad bef84802a2 Spellcheck help messages 2021-12-28 15:05:06 +01:00
Alexander Morozov d1390bb7b6 Fix mb_from_wchar copy constructor 2021-09-14 02:28:20 +03:00
Robert Ramey e4852c641c remove extraneous b2.log file 2021-08-06 21:51:14 -07:00
Robert Ramey 0fd717cc88 Merge branch 'develop' of https://github.com/boostorg/serialization into develop
* 'develop' of https://github.com/boostorg/serialization:
  Do not define BOOST_SERIALIZATION_SOURCE in CMakeLists.txt

remove extraneous b2.log file
2021-08-06 21:50:16 -07:00
Robert Ramey 52fa997bb8 Merge commit '0ca603daf99888bf059c01ae1bab1b27dbc35ebe' into develop
* commit '0ca603daf99888bf059c01ae1bab1b27dbc35ebe':
  Do not define BOOST_SERIALIZATION_SOURCE in CMakeLists.txt
  Only install under CMake 3.13 or later, otherwise dependencies have no install support
  Fix boost_install call to install both targets
  Add CMakeLists.txt

# Conflicts:
#	CMakeLists.txt
2021-08-06 15:41:17 -07:00
Robert Ramey 45b0789b1a Merge branch 'master' into develop
* master:
  squash merge all changes in develop into master
  squash merge into next boost release
  merge into next boost release
  changes made in the hope of eliminated “stable” error for functions previously defined in the header.  Moved those function to codecvt_null.cpp
  Squash-merge develop

# Conflicts:
#	test/testfile2
2021-06-28 10:08:24 -07:00
Peter Dimov 0ca603daf9 Do not define BOOST_SERIALIZATION_SOURCE in CMakeLists.txt 2021-06-09 19:01:03 +03:00
Peter Dimov 09e40888f5 Do not define BOOST_SERIALIZATION_SOURCE in CMakeLists.txt 2021-06-09 18:57:02 +03:00
Robert Ramey 78ee5d14a9 Remove accidently loaded temporary files. 2021-06-01 11:52:21 -07:00
Peter Dimov b42c138206 Only install under CMake 3.13 or later, otherwise dependencies have no install support 2021-05-29 01:06:18 +03:00
Peter Dimov f13c963569 Fix boost_install call to install both targets 2021-05-29 01:06:05 +03:00
Peter Dimov ff6cc13040 Add CMakeLists.txt 2021-05-29 01:05:48 +03:00
Robert Ramey bcc0bfe073 squash merge all changes in develop into master 2021-05-02 18:31:57 -07:00
Robert Ramey 337b3fbc7c Merge branch 'develop' of https://github.com/boostorg/serialization into develop
* 'develop' of https://github.com/boostorg/serialization:
  Only install under CMake 3.13 or later, otherwise dependencies have no install support
  Fix boost_install call to install both targets
  Add CMakeLists.txt
2021-03-28 23:45:23 -07:00
Robert Ramey f540ab6c78 Merge commit 'fa6b395b54bf851768a4d91bd73b8ede57deebca' into develop
* commit 'fa6b395b54bf851768a4d91bd73b8ede57deebca':
  still making corrections to floating point tests
  still making corrections to floating point tests
  still making corrections to floating point tests
  still making corrections to floating point tests
  correct test correction for floating point numbers
  in the previous update, a couple of #pragmas were not properly suppressed for specific compilers.  This fixes this so number of warnings under gcc is now a reasonable number.
  some tests use math/special functions to compare floating point numbers used generated by test results.  math/special functions recently changed so now it requires C++11 or above.   That is, usage under C++03 and less is deprecated.  In order to continue to support the serialization library in C++03 and later I had to make some changes.  After looking at the alternatives, I decide just to suppress some tests related to floating point numbers.  Overall, even though it skips over some tests for C++03 platforms, it was the easiest to implement.  C++03 is not widely used these days so it wasn’t worth the effort to replace reliance on math/special functions.
  added flush to a couple of tests which use stringstream
  Guard MSVC pragmas from clang-cl #230 - once more with feeling.
  Guard MSVC pragmas from clang-cl #230

# Conflicts:
#	include/boost/archive/detail/check.hpp
#	include/boost/archive/detail/iserializer.hpp
#	include/boost/archive/detail/oserializer.hpp
2021-03-28 23:45:11 -07:00
Robert Ramey ef69de1981 Merge commit '6bf961f31e7e13c18548b553070e132347d2b58b' into develop
* commit '6bf961f31e7e13c18548b553070e132347d2b58b':
  Guard MSVC pragmas from clang-cl

# Conflicts:
#	include/boost/archive/detail/check.hpp
#	include/boost/archive/detail/iserializer.hpp
#	include/boost/archive/detail/oserializer.hpp
2021-03-28 23:36:03 -07:00
Peter Dimov 6ddac39d4b Only install under CMake 3.13 or later, otherwise dependencies have no install support 2021-03-19 20:15:21 +02:00
Peter Dimov a34e423069 Fix boost_install call to install both targets 2021-03-18 23:26:04 +02:00
Peter Dimov 9f1fc77d46 Add CMakeLists.txt 2021-03-18 18:41:25 +02:00
Robert Ramey fa6b395b54 still making corrections to floating point tests 2021-03-11 18:36:48 -08:00
Robert Ramey 63cf849d7f still making corrections to floating point tests 2021-03-11 15:20:21 -08:00
Robert Ramey 520cf46d31 still making corrections to floating point tests 2021-03-11 11:52:22 -08:00
Robert Ramey 1839f7b37e still making corrections to floating point tests 2021-03-10 15:35:22 -08:00
Robert Ramey 47119842b7 correct test correction for floating point numbers 2021-03-10 13:43:01 -08:00
Robert Ramey 35ccd63f56 in the previous update, a couple of #pragmas were not properly suppressed for specific compilers. This fixes this so number of warnings under gcc is now a reasonable number. 2021-03-10 11:43:03 -08:00
Robert Ramey 781dd9f0f2 some tests use math/special functions to compare floating point numbers used generated by test results. math/special functions recently changed so now it requires C++11 or above. That is, usage under C++03 and less is deprecated. In order to continue to support the serialization library in C++03 and later I had to make some changes. After looking at the alternatives, I decide just to suppress some tests related to floating point numbers. Overall, even though it skips over some tests for C++03 platforms, it was the easiest to implement. C++03 is not widely used these days so it wasn’t worth the effort to replace reliance on math/special functions. 2021-03-10 11:41:15 -08:00
Robert Ramey 7c2229df8c added flush to a couple of tests which use stringstream 2021-03-09 10:32:16 -08:00
Robert Ramey cd7f64e0d7 Guard MSVC pragmas from clang-cl #230 - once more with feeling. 2021-03-02 08:40:01 -08:00
Robert Ramey 4b851994d6 Guard MSVC pragmas from clang-cl #230 2021-03-01 16:10:04 -08:00
Peter Dimov 6bf961f31e Guard MSVC pragmas from clang-cl 2021-02-28 04:04:15 +02:00
Robert Ramey 3ab4da85f2 squash merge into next boost release 2021-02-22 16:33:33 -08:00
Sam Darwin 9b9e21625f add drone config [ci skip] (#225) 2021-01-22 11:42:54 -08:00
Edward Diener aba637361a [skip ci] Add "cxxstd" json field. The "cxxstd" json field is being added to each Boost library's meta json information for libraries in order to specify the minumum C++ standard compilation level. The value of this field matches one of the values for 'cxxstd' in Boost.Build. The purpose of doing this is to provide information for the Boost website documentation for each library which will specify the minimum C++ standard compilation that an end-user must employ in order to use the particular library. This will aid end-users who want to know if they can successfully use a Boost library based on their C++ compiler's compilation level, without having to search the library's documentation to find this out. (#227) 2021-01-21 10:45:10 -08:00
Marian Klymov b7e454f52f Add missing #pragma warning (pop) (#218) 2021-01-20 10:42:03 -08:00
Giovanni Mascellani e4727d0c23 Fix typo in copyright headers. (#223) 2021-01-20 10:41:17 -08:00
NamaNamazu 886080ef55 Fix typo in include guard. (#226) 2021-01-20 10:39:41 -08:00
nevilad 11ab51f97c Correct build errors when building serialization with (#224)
BOOST_NO_STD_LOCALE defined

Signed-off-by: Alexey Romko <nevilad@yahoo.com>
2021-01-19 13:13:50 -08:00
Robert Ramey e7e5978a54 corrected over zealous trimming of hash_map include files
bumped archive version # just in case I broke something
cleaned up test set hashed and test map hashed.
2021-01-01 14:00:37 -08:00
Robert Ramey c5d199837b minor adjustments to config files in the hopes of passing all git hub actions tests. 2020-12-23 11:27:58 -08:00
Robert Ramey ddf65a2666 made adjustments to hash set and map testing with the aim of correctly handling elimination of BOOST_HASH … 2020-12-21 19:00:33 -08:00
Robert Ramey 6296d56682 Add support for continuous integration testing via git hub actions. 2020-12-16 09:43:48 -08:00
Robert Ramey 447445837f remove erroneous added files 2020-11-20 12:08:36 -08:00
Robert Ramey 07de314975 merge into next boost release 2020-11-17 22:18:38 -08:00
Robert Ramey 8899617fba mixup some pragmas to suppress warnings 2020-11-08 15:16:35 -08:00
Robert Ramey 07c99b8649 removed unused file collection_size_type copy.hpp
I have no idea where this came from!
2020-09-30 21:52:04 -07:00
Robert Ramey 6dc1b1be94 Removed obsolete comment describing the workaround for compilers which fail to properly support Partial Template Function Ordering 2020-09-27 10:52:59 -07:00
Robert Ramey f72b9fc8d9 included library_version.hpp in all appropriate places.
This should permit any header to be compiled without including any other headers.
2020-09-26 22:55:18 -07:00
Robert Ramey 1eb86f8c41 loose end from effort to separate serialization from archive. 2020-09-08 11:00:55 -07:00
Vassil Vassilev e94aebed7a Add missing include (#211)
This patch allows the header to be built standalone, as part of clang C++ modules builds.
2020-07-17 12:02:44 -07:00
Vassil Vassilev bd2b756986 Add missing include (#212)
This patch allows the header to be built standalone, as part of clang C++ modules builds.
2020-07-17 12:02:18 -07:00
Robert Ramey 8acf32935b clean up by removing unused headers
add version.hpp which might be needed
2020-07-15 15:58:11 -07:00
Robert Ramey ed44fcd268 changes made in the hope of eliminated “stable” error for functions previously defined in the header. Moved those function to codecvt_null.cpp 2020-07-11 12:02:39 -07:00
Robert Ramey 812ef99dea changes made in the hope of eliminated “stable” error for functions previously defined in the header. Moved those function to codecvt_null.cpp 2020-07-10 11:24:31 -07:00
Robert Ramey 17fb465af1 Squash-merge develop 2020-07-03 17:11:10 -07:00
Robert Ramey cfed656eb0 removed some in appropriate files
made adjustments regarding visibility macros in the hope of pacifying MSVC compilers
2020-06-29 13:40:09 -07:00
Robert Ramey 4dd4895246 remove erroneous added library status html file 2020-06-26 19:07:01 -07:00
Robert Ramey 676722671e create alias in namespace boost::archive to support older user code. new location is in boost::serialization. 2020-06-26 17:30:44 -07:00
Robert Ramey b672e87f9d use boost/uint_least16 rather than the standard one. A previous “fix” fixed this, so now I’m fixing it back. Coincidently, looks like the serialization library is backward compatible to C++98 2020-06-26 14:20:06 -07:00
Robert Ramey 4fb556f9c4 merged in refactoring designed to diminish dependencies 2020-06-25 09:18:38 -07:00
Hans Dembinski f4c6d58bb5 fix compile error (#208) 2020-06-24 10:32:33 -07:00
Robert Ramey 6af3783a2c remove unused headers 2020-06-19 15:53:59 -07:00
Robert Ramey c7761f2335 improvements in serialization library
a) fixed up CMake Build so it does everything the B2 Build does.  They give the same results.
b) made adjustments so that any code which depends upon serialization depends only upon files in the serialization folder/namespace.  This should permit one to add serialization to his library without ending up importing the whole damn world.
2020-06-19 00:04:31 -07:00
Andrey Semashev 4dc4ba018c Update no_exceptions_support.hpp header location to avoid deprecated warnings. (#204)
boost/detail/no_exceptions_support.hpp is deprecated and will be removed in a
future release.
2020-06-08 16:47:29 -07:00
EugeneZelenko 753c157497 Use BOOST_OVERRIDE to fix GCC -Wsuggest-override and Clang-tidy modernize-use-override warnings. (#200)
Fix Clang -Wextra-semi and Clang-tidy modernize-redundant-void-arg and readability-redundant-control-flow warnings.
Also fix some misspellings in comments.
2020-05-30 12:37:53 -07:00
Samuel Debionne 97f7767505 Add support for Boost.Variant2 2020-05-05 19:49:01 +02:00
Samuel Debionne 2bbb0577a9 Add serialialization for std::optional 2020-05-05 11:02:50 +02:00
Samuel Debionne f19034cc9e Add serialize for std::monostate 2020-05-05 11:00:59 +02:00
Samuel Debionne aa4b6422db Fix name clash with boost::variant serialization
Allow serialization of non-copy-constructible types (use move instead)
2020-05-05 11:00:59 +02:00
Samuel Debionne 2dbe7b8005 Require variant header using Boost.Config 2020-05-05 11:00:59 +02:00
Samuel Debionne 1a13d6e552 Add cxxstd=17 to the std::variant test requirements 2020-05-05 11:00:59 +02:00
Samuel Debionne f914a185c3 Add support for std::variant 2020-05-05 11:00:59 +02:00
Edward Diener 0eec916ab2 Changes for Embarcadero C++ clang-based compilers, targeting Boost 1.74 (#198)
* Change __BORLANDC__ to BOOST_BORLANDC, which is defined in Boost config for the Embarcadero non-clang-based compilers.

* More changes of __BORLANDC__ to BOOST_BORLANDC, which is defined in Boost config for the Embarcadero non-clang-based compilers.

* Embarcadero C++ clang-based compilers use chdir instead of _chdir on Windows. This was reported to them as a bug.

* Revert "Embarcadero C++ clang-based compilers use chdir instead of _chdir on Windows. This was reported to them as a bug."

This reverts commit d00a21f736.

* Put back the chdir definition change to exclude Embarcadero clang-based compilers.
2020-04-21 21:37:34 -07:00
Robert Ramey 88094d44b6 Merge pull request #191 from joaquintides/patch-1
avoided misleading indentation warning
2020-03-03 20:16:59 -08:00
joaquintides 53047f6356 updated to option 1) as requested by Robert 2020-03-03 13:21:46 +01:00
joaquintides 7e0708ea5d avoided misleading indentation warning
Clang 10.0 says:

`../boost/archive/basic_text_oprimitive.hpp:169:13: warning: misleading indentation;
statement is not part of the previous 'if' [-Wmisleading-indentation]`

(see https://www.boost.org/development/tests/develop/output/teeks99-dkr-dc10-2a-multi_index-clang-linux-10~c++2a-warnings.html#test_serialization)
2020-02-24 09:28:20 +01:00
Robert Ramey d0509483ed fixing template parameter in boost unordered map
bumping archive library version.
2020-01-21 14:14:05 -08:00
Robert Ramey d95a1df37a moved archive init call to most derived archive class so that we avoid down casting while in a ctor . The previous behavior was undefined behavior and emits errors when the address sanitizer is enabled. 2020-01-15 23:20:07 -08:00
Robert Ramey eac306d8a6 fixing template parameters for hash_map - used for older compilers. 2020-01-15 15:16:36 -08:00
Robert Ramey 998e6c3d59 corrected template parameter passing for hashed/unordered collections. 2020-01-15 13:18:44 -08:00
Robert Ramey b22ffc63da Fixed some MACRO constants to be consistent with Boost Guidelines. 2019-12-16 06:43:53 -08:00
Robert Ramey 489eef0e17 Merge pull request #184 from kanje/develop
Fix base class offset calculation in void_cast.hpp.
2019-12-12 08:51:43 -08:00
Antons Jeļkins 443dea34ab Fix base class offset calculation in void_cast.hpp.
The current approach generates warnings with ASAN and UBSAN as it features
a magic address which does not hold an object. This change addresses this
issue. The new code produces the same assembly and does not cause any
warnings.

Example:

==72613==ERROR: AddressSanitizer: SEGV on unknown address 0x0000000ffff8
               (pc 0x0000004012d9 bp 0x7ffd5b3eecf0 sp 0x7ffd5b3eece0 T0)
2019-12-10 14:02:05 +01:00
Robert Ramey 76df6df23f Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2019-10-20 14:10:14 -07:00
Robert Ramey 643cce2a9c new test - needs refinement - for pointer adjustment by reset object address 2019-10-20 14:10:04 -07:00
Robert Ramey 098019d074 fixed subtle bug in reset_object_address. Turns out that the address anything loaded as a pointer should not be altered. 2019-10-20 14:08:13 -07:00
Robert Ramey ece3187e24 Merge pull request #181 from HDembinski/strip_trailing_ws
stripping white space
2019-10-20 14:05:54 -07:00
Hans Dembinski c813db7ad7 stripping white space 2019-10-20 22:49:29 +02:00
Robert Ramey f04a8cbe90 shortened name of test in the hopes it fix a test failure one windows with gcc - minnow
removed last references to pfto in documentation
2019-10-11 16:07:10 -07:00
Robert Ramey 0f0409a2ad corrections to last updates.
nvp and make_nvp now back in serialization namespace
corrected removal of array wrapper from array types.
2019-10-05 11:14:56 -07:00
Robert Ramey 6bd667a5bb Merge pull request #172 from TaWeiTu/develop
"reference binding to null pointer" results in an undefined behaviour
2019-09-29 07:53:23 -07:00
Robert Ramey 5dd938f4f1 Merge pull request #173 from glenfe/develop
Use boost::nvp from Boost.Core
2019-09-27 21:37:22 -07:00
Glen Fernandes 4ed898b1d3 Use boost::nvp from Boost.Core 2019-09-27 23:07:06 -04:00
Robert Ramey 7300ff02b9 overlooked files from last commit 2019-09-27 18:19:26 -07:00
Robert Ramey fd8186018b moved nvp into boost core in the hope of curtailing the dependency chain for boost libraries which declare serialization but don’t invoke it. 2019-09-27 15:37:42 -07:00
Robert Ramey c32a663c99 Initial cut on moving declaration/definition of nvp to boost core. 2019-09-15 15:21:55 -07:00
TaWeiTu 48f0844fda reference binding to null pointer is an undefined behaviour 2019-09-02 05:58:06 +08:00
Robert Ramey 84e9ab57a7 Merge pull request #151 from HDembinski/fix_warning
fix for warning regarding use of strerror
2019-03-20 08:17:23 -07:00
Hans Dembinski 0034b070bd fix for warning regarding use of strerror 2019-03-20 08:42:59 +01:00
Robert Ramey 1b11637b1c Merge pull request #146 from MarcelRaad/extra_semi
Fix -Wextra-semi clang warning
2019-03-14 10:19:00 -07:00
Robert Ramey 7d79dc7146 last minute fixes requested by users. Mostly to avoid warnings 2019-03-02 09:39:18 -08:00
Marcel Raad 8d4b2136d2 Fix -Wextra-semi clang warning
Remove superfluous semicolon.
2019-02-25 11:52:18 +01:00
Robert Ramey 7adafcbf01 final? fix for dll tests. Due to quirk in boost build, we can run these tests with static versions of boost. 2018-12-27 09:51:33 -08:00
Robert Ramey 669d266ec7 complete corrections for import/export/visitbility 2018-12-26 13:49:33 -08:00
Robert Ramey 361ed95f4c suppress static library tests for test_dll_exported. B2 generated invalid command line in this case. 2018-12-26 11:40:20 -08:00
Robert Ramey b6d26f9a58 Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2018-12-24 11:19:24 -08:00
Robert Ramey cd8a989be4 update Appveyor files 2018-12-24 11:18:54 -08:00
Robert Ramey ee50f8c911 adjustments to fix “exported” tests. 2018-12-24 08:52:50 -08:00
Robert Ramey d526c0f80e Merge pull request #125 from Kojoley/use-endian-macros-from-predef
Use endian macros from Predef
2018-12-20 08:58:20 -08:00
Robert Ramey a61f5d2563 clean up tests using export/import 2018-12-19 14:40:55 -08:00
Robert Ramey 03c6d23ce8 changes to support more correct import/export for DLL based tests 2018-12-18 13:05:25 -08:00
Robert Ramey 9c770604dc Merge pull request #140 from Lastique/use_uncaught_exceptions
Use uncaught_exceptions from Boost.Core to avoid C++17 warnings
2018-12-17 18:08:52 -08:00
Andrey Semashev b78cd872ec Use uncaught_exceptions from Boost.Core to avoid C++17 warnings.
In C++17, std::uncaught_exception is deprecated in favor of
std::uncaught_exceptions. Use portable uncaught_exceptions implementation
from Boost.Core, which is also available for C++03.
2018-12-17 18:42:53 +03:00
Robert Ramey 6e3d1a89f7 trying to fix visibility issue for imported symbols 2018-12-13 20:44:44 -08:00
Robert Ramey 854dd12473 correction for import/export base and derived types 2018-12-13 10:42:38 -08:00
Robert Ramey f01148e421 minor adjustments to suppress assertions on free psd unix platforms. It seems that this platform doesn't guarantee that static variables aren't destroyed in reverse order of creation. 2018-11-19 10:54:46 -08:00
Robert Ramey cc2a996384 Added in more singleton tests 2018-11-17 13:21:31 -08:00
Robert Ramey 9e98df0a0d Corrected various tests.
improved build under CMake and B2
passes all tests on clang 03 and g++ 6.2
2018-11-14 14:27:46 -08:00
Robert Ramey feb53726e1 improvements to make test_dll_exported and test_exported function as desired. 2018-11-11 18:33:06 -08:00
Robert Ramey b97bcdfeb3 adjustments to address visibility/import/export issues on windows gcc platforms 2018-11-11 04:56:11 -08:00
Robert Ramey 723bd44abd corrections to address issues on test_dll_exported on MSVC platforms 2018-11-09 11:47:27 -08:00
Robert Ramey f297d80d6e Fixed errors in singleton
removed superfluous comma to avoid warning
2018-11-08 21:07:09 -08:00
Robert Ramey efcd46eb1b Just discovered that registering type via EXPORT doesn't work with polymorphic archives !!!
Corrected this.
2018-11-03 06:23:22 -07:00
Robert Ramey 5778b99fd2 fix typo in Jamfile.v2 which breaks Appveyor 2018-10-30 13:17:39 -07:00
Robert Ramey c5549b2d6b adjusted tests to properly handle visibility in DLLS
improvements in CMake files
2018-10-30 02:29:15 -07:00
Robert Ramey 237ff81ac6 added test files for test_mult_shared_lib 2018-10-26 10:42:11 -07:00
Robert Ramey 65f05dc209 Fix of test_dll_exported by altering syntax to accommodate "visibility=hidden"
update for CMakeList.txt files for serialization library - still pending but I'm the only one who uses it.
inclusion of "test" from Alexander Gruber - temporary
2018-10-26 09:56:23 -07:00
Robert Ramey 86996d0637 Merge commit '5c19264436cb257041a9f63f245186bea4490edf' into develop 2018-10-26 09:28:18 -07:00
Peter Dimov 5c19264436 Add clang++-libc++, xcode10, link=static,shared to Travis 2018-10-21 01:19:56 +03:00
Robert Ramey af46ac2da3 removed superfluous header 2018-10-19 14:22:20 -07:00
Robert Ramey e1893dd28c made base grammar visible
made changes in singleton.hpp to address running issue regarding test_dll_exported
fixed integer overflow so that UBAN tests pass
2018-10-11 22:03:51 -07:00
Nikita Kniazev da9c3059f2 Use endian macros from Predef
The `boost/detail/endian.hpp` header is deprecated.
2018-10-04 20:33:10 +03:00
Robert Ramey 28c333ce65 Merge pull request #115 from jmairboeck/fix-trac7240
fix Trac issue 7240 by applying the patch from there

Looks OK to me.
2018-10-03 11:28:31 -07:00
Robert Ramey 5edc5acf27 Merge pull request #124 from Kojoley/tests-fix-catch-by-value
Fixed catch by value warnings in tests
2018-10-03 11:26:06 -07:00
Nikita Kniazev c5120dfd11 Fixed catch by value warnings in tests
warning: catching polymorphic type 'class boost::archive::archive_exception' by value [-Wcatch-value=]
2018-10-02 17:08:10 +03:00
Joachim Mairboeck 87c50e75fa fix Trac issue 7240 by applying the patch from there 2018-08-29 10:16:43 +02:00
Robert Ramey 738695b707 correct msvc version number 2018-05-23 13:28:56 -07:00
Robert Ramey 08455abe23 Reverse previous commit.
Export base class.
Ignore windows warning that base class isn't exported.
2018-05-08 14:08:25 -07:00
Robert Ramey 90e22bb58b adjustments to test_dll_exported to make it pass tests 2018-05-07 10:03:07 -07:00
Robert Ramey 449e659de3 adjust workaround for msvc problem 2018-05-05 13:02:47 -07:00
Robert Ramey 4986fc2097 moved level trait for variant to the correct namespace 2018-05-04 23:30:02 -07:00
Robert Ramey 52cbea8c16 fix gcc warning
bump library version number to 17
2018-05-03 22:56:07 -07:00
Robert Ramey ed435d5a31 Address PR s and issues
a) eliminate warning on narrowing of int to char in unescape
b) eliminate warning on cast of version types
c) fix error which appears when serializing collections of boost::variant
2018-05-03 15:20:08 -07:00
Robert Ramey a362331b93 Merge pull request #106 from res2k/feature/fix-run-tests
Fix tests
2018-04-30 19:14:28 -07:00
Frank Richter b430b6d674 Disable 'test_dll_plugin' - needs more work before it can pass 2018-05-01 01:00:06 +02:00
Frank Richter 2792359662 util/test: Fixes for rules signature change 2018-04-30 23:57:20 +02:00
Frank Richter 7a078733a1 Merge changes from upstream 2018-04-30 22:37:49 +02:00
Robert Ramey 75c224103d Merge pull request #92 from oxygene/patch-1
Use unique header guards for boost_array.hpp
2018-04-30 13:32:55 -07:00
Robert Ramey 297b7c3b52 Merge pull request #94 from res2k/travis-tweaks
Various Appveyor & Travis improvements
2018-04-30 13:30:27 -07:00
Robert Ramey 8ca532a4d5 include test for singleton
update Jamfile
2018-04-30 12:46:23 -07:00
Frank Richter 226af45461 Travis: Enable ccache 2018-04-30 17:25:20 +02:00
Frank Richter b4b8cbab00 Travis: Add at least some tests with static linking 2018-02-07 14:38:59 +01:00
Christof Krüger 3c438dfddb Use unique header guards for boost_array.hpp
Previously boost_array.hpp used the same header guards as array.hpp.

Fixes https://svn.boost.org/trac10/ticket/13437#ticket.
2018-02-06 01:58:38 +01:00
Frank Richter 2b61be1285 Produce distinct jobs for static, shared tests 2018-01-31 09:25:40 +01:00
Frank Richter d3bb8d0e50 Appveyor VMs provide two cores, use them 2018-01-31 08:19:18 +01:00
Frank Richter 89dc4a26b1 Add MSVC to Appveyor build matrix 2018-01-30 13:43:42 +01:00
Frank Richter 6477759341 Try to tweak void_cast to work around ICE on MinGW 2018-01-30 12:45:08 +01:00
Frank Richter 69d1b26937 Pull container_hash git submodule
Needed after move from functional.
2018-01-30 12:44:35 +01:00
Frank Richter bc0279429b Merge upstream changes 2018-01-30 11:52:31 +01:00
Robert Ramey b73329fe45 Merge pull request #81 from masterleinad/improve_appveyor
Improve appveyor setup for MinGW
2017-12-06 09:21:19 -08:00
Daniel Arndt 63b6ffa765 Improve appveyor setup 2017-12-02 13:50:01 +01:00
Robert Ramey 24024425f1 fix failing tests 2017-11-28 10:56:37 -08:00
Robert Ramey 4ee479a03e corrections for dll linkage and testing 2017-11-24 15:51:46 -08:00
Robert Ramey 8378c75f32 corrections to singleton - tested on on all platforms 2017-11-23 12:05:46 -08:00
Robert Ramey 7d216b4761 corrected singleton and ran test_dll_exported on unix,mingv,windows and osx 2017-11-22 21:53:19 -08:00
Robert Ramey f94da2c724 correct error detected in MSVC regarding singleton initialization 2017-11-13 14:06:10 -08:00
Robert Ramey fea1826e06 fix for singleton. This simplifies the visibility for the singleton class.
tested on my own machine for Clang/OSX, gcc on ubuntu and on mingw
2017-11-11 12:14:30 -08:00
Robert Ramey 8eb388fe39 Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2017-11-09 12:54:34 -08:00
Robert Ramey 8bbcca5341 fixed addressor fiasco
simplified singleton visibility
Jamfile
added boost/system to requirements
corrected inclusion tests to include link to serialization library
2017-11-09 12:54:10 -08:00
Peter Dimov 0676016ce3 Simplify .travis.yml 2017-11-09 01:46:54 +02:00
Peter Dimov be2846e2d1 Update .travis.yml 2017-11-09 01:06:08 +02:00
Robert Ramey b87dc62e69 alter visibility to try to address failure to link "common" archive for clang-gnu-linux 3.0 compilers. 2017-11-08 12:08:21 -08:00
Robert Ramey 2c2a4a53d0 add missing test_inclusion2.cpp 2017-11-08 11:26:20 -08:00
Robert Ramey eb35302b76 altered visibility settings for polymorphic_base. Hopefully this should fix text failures for test_dll_exported 2017-11-08 11:03:14 -08:00
Robert Ramey a2a8890dfb fix overload of & when taking address 2017-11-08 08:31:04 -08:00
Robert Ramey f4be906175 Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2017-11-07 15:24:57 -08:00
Robert Ramey 2e8e91a5cc Merge pull request #74 from masterleinad/avoid_nullptr_dereferencing
Avoid dereferencing a nullptr
2017-11-07 15:24:45 -08:00
Robert Ramey 089d57b855 Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2017-11-07 15:08:21 -08:00
Robert Ramey 0ba417dd1c addressed user complaint and rolled back change which called desstructor 2017-11-07 15:08:12 -08:00
Robert Ramey 9e90f233a1 Merge pull request #73 from masterleinad/fix_memory_leaks_tests_1
Fix some memory leaks in tests
2017-11-07 15:04:47 -08:00
Daniel Arndt 9e7cd200e7 Avoid dereferencing a nullptr 2017-11-03 01:02:00 +01:00
Daniel Arndt d327f90bd8 Fix some memory leaks in tests 2017-11-03 00:57:02 +01:00
Robert Ramey 8d0b0db5de alter macro definition to avoid undefined behavior 2017-10-31 16:03:37 -07:00
Robert Ramey daf20da064 address boost serialization test matrix errors
export of test_polymorphic_a
cland/gcc earlier versions don't find private virtual function implementations
2017-10-23 10:48:36 -07:00
Robert Ramey 71851223c3 changes to correct problems found on mingw and cygwin tests 2017-10-22 13:32:38 -07:00
Robert Ramey 64dc620992 remove dependency on <codecvt>
This header seems to have errors in some environments.
It has been deprecated by the C++ committe.
For these reasons, we'll rely solely on Ron Garcia's code convert facet for utf.
2017-10-17 10:55:47 -07:00
Robert Ramey 40314f94df try to fix wide character archives by making ~codecvt_null() non virtual 2017-10-11 14:13:53 -07:00
Robert Ramey d21a064a69 corrected mistakes in codecvt_null affecting visibility 2017-10-06 11:54:34 -07:00
Robert Ramey 3d179caaec correct extraneous BOOST_ARCHIVE_DECL 2017-10-05 12:45:32 -07:00
Robert Ramey cd2f77defb Trying to fix three issues
a) appveyor for mingw
b) usage of macros "defined" in iserializer.hpp
c) extra decl... in codecvt_null
d) get_lock not found in singleton.hpp
2017-10-05 11:40:00 -07:00
Robert Ramey 621a3ea8a3 Merge pull request #62 from masterleinad/avoid_dereferencing_nullptr
Avoid dereferencing a nullptr in save_pointer_type::register_type
2017-10-04 22:03:12 -07:00
Robert Ramey 8b4e08490b Merge pull request #63 from masterleinad/fix_appveyor
Fix appveyor setup
2017-10-04 22:02:09 -07:00
Daniel Arndt f44dc8da2c Fix appveyor setup 2017-09-20 17:40:29 +02:00
Daniel Arndt 480a8c94b0 Avoid dereferencing a nullptr in save_pointer_type::register_type 2017-09-20 14:17:14 +02:00
Robert Ramey 2557639490 try to address problem where singleton is dropped by linker 2017-08-13 14:48:20 -07:00
Robert Ramey 932b4221ff Merge pull request #57 from Flast/patch-2
Fixed incorrect slist test.
2017-08-11 06:17:44 -07:00
Robert Ramey a5cb34ff8e Merge pull request #58 from yuri-kilochek/develop
Fix conversion operators of injected primitive types
2017-08-11 06:13:39 -07:00
Robert Ramey 0bccdf6da7 Merge pull request #59 from vtnerd/bugfix/null_pointer_serializer
Fixed bug where pointer iserializer can be NULL
2017-08-11 06:13:13 -07:00
Robert Ramey ad1e1e5d5a attempt to fix mingw failures 2017-08-11 06:12:24 -07:00
Lee Clagett dd09b03d33 Fixed bug where pointer iserializer can be NULL 2017-08-04 23:04:42 -04:00
Yuri Kilochek 96f818ee03 Use archive::object_id_type::base_type as type of archive::object_id_type's conversion operators for consistency with other injected types. 2017-07-25 17:27:51 +03:00
Yuri Kilochek 791f1bde64 Use same type for both input and output conversion operators of archive::class_id_type. 2017-07-25 17:25:00 +03:00
Kohei Takahashi d1ed17a656 Fixed incorrect use of slist, back v.s. front. 2017-07-12 11:39:26 +09:00
Kohei Takahashi 8b7e756746 Fixed incorrect slist test. 2017-07-12 11:10:36 +09:00
Robert Ramey eaf85795f3 adjustment to export codecvt_null<wchar_t> 2017-06-14 15:25:49 -07:00
Robert Ramey 81b44504c5 adjustments to address failing "optional", Failure on FSD expand.hpp ininitlalization, and another attempt to fix linking failure related to singleton get_lock. 2017-06-13 13:11:24 -07:00
Robert Ramey bebea0fda9 make test optional correct.
attempt to fixe singleton: locked problem for mingw
2017-06-04 11:36:14 -07:00
Robert Ramey 0c8a1d615a fix as described in PR #53.
fixes warnings

Seen with all versions of msvc from (at least) 9.0 up to 14.1.
Signed-off-by: Daniela Engert dani@ngrt.de

fixed pr #53, #52, #50, #49, #34, #29, #23, #25, #20, #14, #7
2017-05-24 06:32:39 -07:00
Robert Ramey 632df7aab5 correct implementation of serialization for boost::optional 2017-05-08 09:18:36 -07:00
Robert Ramey 49f8f59da2 address recent Trac items 2017-05-04 14:33:19 -07:00
Robert Ramey 0a87904d14 Merge branch 'master' of https://github.com/boostorg/serialization 2017-05-03 12:33:29 -07:00
Robert Ramey b0a794da38 Trying to get minGW to function for serialization library
simplify singleton.hpp and singleton.cpp
alter appveyor.yml
2017-02-23 13:25:27 -08:00
Robert Ramey 62bf8fc1e1 attempt to get appveyor to work 2017-02-03 22:10:19 -08:00
Robert Ramey 09730b8741 attempt to make appveyor work 2017-02-03 15:17:49 -08:00
Robert Ramey 1d86261581 correct error which appeared when compiling non c++ compliant code for arrays 2017-02-01 16:43:59 -08:00
Robert Ramey 6456a6d18f attempt to get appveyor to build with mingw in order to produce an error listing 2017-01-26 14:30:26 -08:00
Robert Ramey c936a94c1a attempt to get appveyor to build with mingw in order to produce an error listing 2017-01-26 11:28:51 -08:00
Robert Ramey 4dc778270a Merge branch 'develop' of https://github.com/boostorg/serialization into develop
* 'develop' of https://github.com/boostorg/serialization:
  Remove --depth 1 from git submodule update
2017-01-26 10:15:11 -08:00
Robert Ramey 4bd64df332 attempt to get appveyor to build with mingw in order to produce an error listing 2017-01-26 10:09:50 -08:00
Peter Dimov acbd1f88f9 Merge branch 'develop' 2017-01-07 15:51:21 +02:00
Peter Dimov aba55e6180 Remove --depth 1 from git submodule update 2017-01-07 14:36:45 +02:00
Robert Ramey 51b1df323b fix warning 2016-12-26 20:47:48 -08:00
Robert Ramey 247f223d82 attempt to address compilation errors win MNGW tests 2016-12-17 13:46:36 -08:00
Robert Ramey 619250c93a merged in correction breaking backward compatibility 2016-12-05 14:16:54 -08:00
Robert Ramey 66ccdc00f1 adjustments to get test_dll_exported to pass on MSVC platforms 2016-11-30 15:31:02 -08:00
Robert Ramey a8bbbea4e7 latest attempt to permit test_dll_exported to compile under MSVC compilers 2016-11-30 12:31:24 -08:00
Robert Ramey c3552e1d03 remove visibility attributes from exported/imported class function implementations per microsoft instructions 2016-11-29 08:08:12 -08:00
Robert Ramey c518afa8ad remove visibility attributes from exported/imported class function implementations per microsoft instructions 2016-11-28 20:51:51 -08:00
Robert Ramey 29593efac2 corrected pragmas used to track import/export attributes 2016-11-27 20:42:40 -08:00
Robert Ramey 5986edcfd3 Add pragma messages to display import/exports at compile time 2016-11-25 21:59:57 -08:00
Robert Ramey d558b6da91 adjustments to make test_dll_simple pass 2016-11-25 13:39:18 -08:00
Robert Ramey 4d11c54e60 adjustments shorten appveyor load
make A_DLL symbol unique to avoid confusion and conflict
2016-11-24 12:30:31 -08:00
Robert Ramey 1fda900179 correct path in bootstrap and b2 2016-11-23 13:19:12 -08:00
Robert Ramey 0c7141fb78 add appveyor.yml to get testing of windows version 2016-11-23 10:52:22 -08:00
Robert Ramey 6e24d1eb48 addressing mdvc failure on test_dll_exported 2016-11-22 09:52:58 -08:00
Robert Ramey fceaca0a34 attempt to correct failure of test_dll_export on microsoft platforms 2016-11-21 15:30:11 -08:00
Robert Ramey b98b458293 Role back changes in valarray due to failures on microsoft platform
Adjust visibility for singleton in the hope of passing mngw tests.
2016-11-20 13:22:47 -08:00
Robert Ramey 26366fecb5 attempt to fix linking problems with singleton module 2016-11-18 09:33:32 -08:00
Robert Ramey 058f1fed43 fix utf8 convert selection - looks like msvc <codecvt> doesn't properly work with uff8_codecvt
Adjust val array to see if it can be made to acceptable to intel compiler
2016-11-17 23:22:50 -08:00
Robert Ramey 6b33d1cd4e refactor various tests related to arrays and lists 2016-11-14 23:39:14 -08:00
Robert Ramey ec74c5a143 Merge branch 'develop' of https://github.com/boostorg/serialization into develop 2016-11-14 14:30:43 -08:00
Robert Ramey 58b4f73c70 corrections to test invocation for lists 2016-11-14 14:30:01 -08:00
Peter Dimov 06fe1b7154 Enumerate dependencies explicitly in .travis.yml 2016-11-09 04:17:42 +02:00
Peter Dimov e653bfe110 Add .travis.yml 2016-11-08 23:03:20 +02:00
Robert Ramey 682c371e11 corrections to forward_list 2016-11-07 12:03:11 -08:00
Robert Ramey 5b47212c01 improve collection serialization with boost::move 2016-11-06 17:22:35 -08:00
Robert Ramey f09c9b197e correction to optional<T> serialization 2016-11-06 15:01:33 -08:00
Robert Ramey 3bc713367e eliminated binary_function from tests to conform to C++17 2016-11-05 15:18:29 -07:00
Robert Ramey 7f801c3d85 remove auto linking from shared_ptr_132 2016-11-05 11:01:30 -07:00
Robert Ramey 3e0f302eee fix error in forward_list serialization 2016-11-04 12:43:00 -07:00
Robert Ramey 19e2ef234b fixed serialization of optional.hpp to prevent it from calling load_construct ... 2016-11-04 12:28:03 -07:00
Robert Ramey a1ffe9b19b Removed emplace in array serialization. I concluded that it didn't do what I hoped it would and couldn't do so without changing the library API which I was reluctant to so. Changing this use more traditional reference copying functions should have no impact on performance but should improve portability to other compilers such as Intel. 2016-11-02 15:32:10 -07:00
Robert Ramey c90e97eb1e adjustment in array serialization hoping to pass intel tests 2016-11-02 14:32:37 -07:00
Robert Ramey fe8b390588 adjustments to tests of <forward_list> 2016-11-02 11:03:20 -07:00
Robert Ramey 8e26bc59db fixed GCC seg fault problem 2016-10-30 20:56:03 -07:00
Robert Ramey 9a2c1f11ab blackout making serialization source dependent on archive source 2016-07-23 14:00:04 -07:00
Robert Ramey df38b48016 after carefully checking with the master - making changes to address compilation on gcc 2016-07-05 11:02:40 -07:00
Robert Ramey 7c97ddd99e update jam files 2016-07-03 11:28:32 -07:00
Robert Ramey d1b5c47e16 another attempt to make visibility work 2016-06-25 14:06:17 -07:00
Robert Ramey 3765166f4b altered visibility attributes 2016-06-25 08:21:02 -07:00
Robert Ramey 03865e70cb correct test_strong_type
back out breaking change for gcc i/o
2016-06-03 22:28:50 -07:00
Robert Ramey 0458a89fc3 adjustments to strong type test 2016-05-29 13:33:49 -07:00
Robert Ramey 49f84d7d7a Merge commit '1bfecdfc82b9491b370c2157af4f5afcb05a44dc' into develop
# Conflicts:
#	include/boost/serialization/strong_typedef.hpp
2016-05-29 10:44:57 -07:00
Robert Ramey 5203ecdd65 strong typedef changes 2016-05-29 10:42:20 -07:00
Robert Ramey 1bfecdfc82 Merge pull request #40 from praetorian20/noexcept_strong_typedef
`noexcept` specifications for `BOOST_STRONG_TYPEDEF`
2016-05-29 10:26:27 -07:00
Robert Ramey e9ed873275 reverse commit suspected of breaking all gcc tests on develop branch 2016-05-07 18:50:49 -07:00
Ashish Sadanandan e32c5c5e28 noexcept specifications for BOOST_STRONG_TYPEDEF
`BOOST_STRONG_TYPEDEF` now detects whether the type being wrapped is
nothrow default/copy constructible and nothrow assignable. The wrapped
type is given its own `noexcept` specifications accordingly.
2016-05-04 00:12:51 -06:00
Robert Ramey e15ca7257f attempt to remove test_utf8_codecvt
updated jam files accordingly
2016-05-02 10:30:50 -07:00
Robert Ramey 8f7b3be1d2 made headers stand alone 2016-04-24 22:25:12 -07:00
Robert Ramey c545c1fa60 test moved to boost/detail 2016-04-24 17:26:03 -07:00
Robert Ramey 3eb2bda80b correction in trailer of xml archives 2016-04-21 12:32:14 -07:00
Robert Ramey 42b5b6859b added missing header 2016-04-18 21:40:00 -07:00
Robert Ramey fc9d311df9 changes to address some test failures 2016-04-15 12:53:16 -07:00
Robert Ramey 69ecae6919 cleaned up commented out code related to new operators 2016-03-29 18:38:34 -07:00
Robert Ramey b65e29cb5f upload newly created test files for forward_list 2016-03-29 18:37:43 -07:00
Robert Ramey 9e2541b030 a) suppress warnings in some tests
b) break out test_forward_list
c) fixe test operator new for mdvc
2016-03-28 14:41:53 -07:00
Robert Ramey 73ec60764a use std::codecvt facet if available 2016-03-21 00:04:22 -07:00
Robert Ramey e40ae62ced tweak visitoiity to eliminate linker warnings 2016-03-21 00:02:06 -07:00
Robert Ramey d25475da16 correction to visibility attribute highlighted by minnow tests 2016-03-20 22:26:34 -07:00
Robert Ramey 1a65a19c20 blackout changes to istream iterator 2016-03-15 14:51:57 -07:00
Robert Ramey e629008d55 changes to test_iterators and others to pass tests 2016-03-11 18:26:34 -08:00
Robert Ramey 5988a816f9 correct dereference of iterator incremented past end() 2016-03-08 12:34:51 -08:00
Robert Ramey c0f17d6934 corrected iterator test. 2016-03-07 09:53:53 -08:00
Robert Ramey 5fe6471b6f tweaked visibility in a test 2016-03-04 12:52:07 -08:00
Robert Ramey 00459350f0 use explicit namespace in the hope of fixing test failure for intel 2016-03-03 22:37:45 -08:00
Robert Ramey ec0c2a2ba1 adjustment to auto link for utf8_codecvt_facit.hpp
minor improvements in map.hp
adjustment to auto link for polymorphic tests
2016-03-03 13:46:50 -08:00
Robert Ramey 6128dfce37 adjustment in auto linking of utf8 codecvt facet 2016-02-28 10:21:53 -08:00
Robert Ramey 1dcca5b67b make sure utf8 works with wide char archives 2016-02-27 21:05:21 -08:00
Robert Ramey 150b7e8a5f various adjustments to
a) correct error in loading set / map for C++11+
b) more refinements of visibility
2016-02-14 21:22:35 -08:00
Robert Ramey d9ad787f70 replace insert with emplace where appropriate
remove workarounds for mdvc 7.1
2016-02-13 10:42:07 -08:00
Robert Ramey 7ae4087c05 fix visibility error for at least mdvc 2016-02-12 12:01:29 -08:00
Robert Ramey 72ef8bf59a correction of visibility setup 2016-01-23 22:29:04 -08:00
Robert Ramey 0040321a7c another attempt to fix codecvt facet 2016-01-20 22:58:29 -08:00
Robert Ramey 00ede57216 fixing visibility for utf8_codecvt 2016-01-19 22:58:45 -08:00
Robert Ramey d330deb82c return utf8 back to state of 22 ocober 2016-01-18 11:41:22 -08:00
Robert Ramey 2006c1633b fix compile errors in tests related to export 2016-01-17 10:33:06 -08:00
Robert Ramey c5c233d857 correct placement of header 2016-01-17 10:05:40 -08:00
Robert Ramey ccdb32bfe5 attempted to eliminate visibility warnings when building as a static library with clang
fixed compile error on polymorphic_derived2
2016-01-17 09:06:11 -08:00
Robert Ramey 6facb61510 fixed a couple of trac items 2016-01-15 09:49:34 -08:00
Robert Ramey eb6faaf428 minor adjustments to fix errors with gcc 6.0 2016-01-14 22:18:51 -08:00
Robert Ramey 587b081d1d backing out dependence on boost locale.
revert to boost/detail/utf8_codecvt
2016-01-14 13:48:16 -08:00
Robert Ramey 67b16f8a9d explicitly initialized m_mbs (std::mbstate_t) in utf8 transform iterators.
adjusted tests to be sure that wchar arrays/strings are null terminated.
2015-11-24 10:48:03 -08:00
Robert Ramey 9bb75492ff added back in test_utf8_codecvt 2015-11-22 16:55:58 -08:00
Robert Ramey 533dba12d7 corrections in visibility specs for tests 2015-11-15 13:30:25 -08:00
Robert Ramey 2783e07993 adjustments for mdvc visibility 2015-11-14 22:59:42 -08:00
Robert Ramey 4083f81e3c Corrections to visibility for MSVC 2015-11-04 08:00:01 -08:00
Robert Ramey ead783cfe8 added missing test files 2015-11-03 11:00:36 -08:00
Robert Ramey e4b18d9379 corrections to visibility issues which breaks tests on mdvc 2015-11-01 14:10:52 -08:00
Robert Ramey e3b67eb299 changes to correct errors in usage of codecvt for utf8
Key change is to change utf8 codecvt facet to use Boost.Locale rather than boost/detail.  This fixed an issue with gcc.
2015-10-30 16:26:11 -07:00
Robert Ramey 41fd59b77b fixed erroneous visibility attribute 2015-10-27 09:26:28 -07:00
Robert Ramey 194ff67a05 attempt to make codecvt_null table visible 2015-10-26 12:37:01 -07:00
Robert Ramey a76a511c95 adjustments for clang visibility 2015-10-25 21:02:44 -07:00
Robert Ramey 494fa31e1c make singleton module lock/unlock work across mainline and all DLL code
fix warnings in binary primitives
fixup bjam test
make sure all codecvt facets are are serialization DLL
2015-10-24 23:49:00 -07:00
Robert Ramey edf1dffd70 fixing codecvt for libstc++ broke things for libc++
This should work for everything
2015-10-24 22:14:27 -07:00
Robert Ramey ae4c2321af Finally? found error in recovery of codecvt facet? 2015-10-24 21:42:34 -07:00
Robert Ramey 160a3369db made improvements in codecvt handling.
Fails two tests on gcc
2015-10-24 13:28:02 -07:00
Robert Ramey a64bf6e4d5 isolated one problem with codecvt facets 2015-10-22 04:42:22 -07:00
Robert Ramey 53a0388fec adjust to account for the fact that utf8 codecvt facet is used by users of serialization.dll 2015-10-20 09:57:32 -07:00
Robert Ramey c05c59ca88 explicitly set stack depth for compilers 2015-10-20 07:48:35 -07:00
Robert Ramey 13f794d953 corrected changes 2015-10-19 21:42:47 -07:00
Robert Ramey e4219b35eb Merge pull request #31 from jzmaddock/msvc-linkage
Changes to get things linking correctly with msvc:
2015-10-18 10:46:26 -06:00
jzmaddock d53d3159b4 Changes to get things linking correctly with msvc:
1) Move the two facets utf8_codecvt_facet and codecvt_null into
the main serialization archive as they get referenced from xml_oarchive.obj.
2) Add DLL-interface to utf8_codecvt_facet.
3) Change codecvt_null to use narrow character DLL interface macros.
2015-10-18 11:51:26 +01:00
Robert Ramey 72530c408d re-installed streambuf_saver so that "imbue" is reversed when the archive is destroyed 2015-10-17 23:09:34 -07:00
Robert Ramey 62c975820d fixed conversion of string -> wasting and vice versa
made data flow iterator which uses codecvt facet - need to generalize this.
expanded test of this
looks like fixed visibility issues - except for one test.
2015-10-16 22:20:44 -07:00
Robert Ramey d1d6a4a100 Update examples and verify that the work 2015-10-11 12:36:32 -07:00
Robert Ramey 5e6f0bd271 simplification of codecvt facets.
This fixed bug of unknown origin in test_array_xml_archive
2015-10-07 12:09:13 -07:00
Robert Ramey 348a916a81 simplification of codecvt facets.
This fixed bug of unknown origin in test_array_xml_archive
2015-10-07 10:57:35 -07:00
Robert Ramey 54a68ca9de adding test case 2015-10-05 21:00:18 -07:00
Robert Ramey 42512bc128 fixted https://svn.boost.org/trac/boost/ticket/11520 2015-10-05 09:11:01 -07:00
Robert Ramey 88a4156aaa Corrections in C++03 support and update of build files 2015-10-04 10:47:11 -07:00
Robert Ramey 619f30aa8d added messing files from unordered collections refactor 2015-10-03 23:51:17 -07:00
Robert Ramey 153e7e635c added serialization of Boost/unordered_set and boost/unordered_map and create new tests 2015-10-03 23:48:52 -07:00
Robert Ramey 40f6cfcc84 Fixed problems with new wchar/mbchar conversion
bumped archive version number
2015-10-02 15:03:02 -07:00
Robert Ramey 4d9fccbee5 Merge pull request #22 from NuxiNL/develop
Don't use thread unsafe wide character processing functions.
2015-10-02 13:29:48 -06:00
Robert Ramey 763f204e80 resolution of issue related to private base classes 2015-10-02 08:22:03 -07:00
Robert Ramey d8c26789e0 fixed leaking definition of STD 2015-09-30 08:37:17 -07:00
Robert Ramey e0b4403d61 more tweaks to fix visibility errors and avoid warnings 2015-09-29 13:55:23 -07:00
Robert Ramey 45610e25e4 changes to support visibility - by Edward Diener 2015-09-29 12:32:23 -07:00
Robert Ramey ae22245b28 Merge pull request #17 from jhunold/virtual
classes with virtual function must have virtual destructors.
2015-09-29 00:56:45 -06:00
Robert Ramey 4f83fc163a Miscellaneous fixes 2015-09-28 23:52:47 -07:00
Robert Ramey e3129464dc Merge branch 'master' into develop 2015-09-28 15:05:31 -07:00
Robert Ramey 9542a9f78e modify comment
eliminate regenerated files
2015-09-28 14:59:06 -07:00
Robert Ramey f6f040a7eb added separate tests for hashed and unordered 2015-09-27 21:35:15 -07:00
Robert Ramey 2d09112b24 separated tests for map and set for C++ 11 and C++ 03 2015-09-27 21:34:21 -07:00
Ed Schouten 599c53c5d0 Don't use thread unsafe wide character processing functions.
The mbtowc(), wctomb() and mblen() functions are not supposed to be
thread-safe, as they have to keep parsing state in a global variable.
The mbrtowc(), wcrtomb() and mbrlen() functions should be used instead.

This change also simplifies how wchar_from_mb<Base>::drain() works.
There is no need to first iterate over the input using mblen().
mbrtowc() can store the partially parsed multibyte character in its
mbstate_t.
2015-08-27 16:08:53 +02:00
Jürgen Hunold 6795c81995 classes with virtual function must have virtual destructors.
The warning is not "bogus" and not only gcc warns.
clang will warn too, but defines __GNUC__ for gcc compatibility.
msvc issues "warning C4265: 'boost::serialization::<foo>' :
class has virtual functions, but destructor is not virtual"
The msvc warning could be suppressed, but it is much cleaner to simply
make the destructors virtual as they are with gcc and clang.
2015-06-15 10:38:57 +02:00
Robert Ramey d779a5d127 Merge develop to master 2015-05-23 11:51:06 -07:00
Robert Ramey 45752f1207 replace test_z with a vestigial program which will always compile and run and pass.
This "empty" program is used for experiments.
2015-05-23 08:53:46 -07:00
Robert Ramey bee3377881 Improved loading of collections
fixed problems with loading types with private constructors
diminished need for reset object address
2015-05-22 08:59:11 -07:00
Robert Ramey f527700804 more compile time errors for mdvc 2015-05-09 18:17:33 -07:00
Robert Ramey 1fb23d124d correction to support visibility for MSVC 2015-05-09 08:24:46 -07:00
Robert Ramey 18992fb13d fixed warnin 2015-04-27 21:40:15 -07:00
Robert Ramey 794c19b2a5 remove comment no longer relevant 2015-04-27 17:14:36 -07:00
Robert Ramey 2e2fac9291 Revert "removed dead code from vector.hpp"
This reverts commit 423c6d8076.
2015-04-27 17:12:31 -07:00
Robert Ramey 423c6d8076 removed dead code from vector.hpp 2015-04-27 16:58:51 -07:00
Robert Ramey b3a02cf2b1 eliminated dead code in vector.hp
changed spelling from constructable to constructible in test_z.cpp
2015-04-27 16:56:21 -07:00
Robert Ramey e25f595656 changed to use custom implementation of is_default_constructible 2015-04-27 16:44:36 -07:00
Robert Ramey 4a80b0f089 passing vector test 2015-04-27 16:32:45 -07:00
Robert Ramey 751155614c fix visibility errors 2015-04-27 16:29:21 -07:00
Robert Ramey d76884319c make constructor public rather than protected in order to address MSVC/32 13 quirk 2015-04-27 16:28:35 -07:00
Robert Ramey 73d2494dde updated vector test to test for types without default constructor which are handled differently 2015-04-25 09:37:12 -07:00
Robert Ramey ae41d09039 correct error in export macro for wide types 2015-04-25 08:09:31 -07:00
Robert Ramey f90de55927 leave test_z blank - it's used to paste tests into the IDE 2015-04-24 16:59:49 -07:00
Robert Ramey 50d59842c2 fixed error in loading of non empty instances of vector.hp 2015-04-24 16:44:38 -07:00
Robert Ramey 2d898f7db8 replace std::min with (std::min) in order to avoid problems with compilers which use min macros 2015-04-24 15:28:46 -07:00
Robert Ramey 50ecbd1f28 Remove last of support for compilers which don't support function template ordering 2015-04-24 15:24:30 -07:00
Robert Ramey 0100558166 correction in shared_ptr_helper
permit pass values by const & to output interface
2015-04-24 15:12:22 -07:00
Robert Ramey 83c1373a4d fixed warning in clang smart_cast.hp 2015-04-24 13:49:56 -07:00
Robert Ramey 1f94b5276b minor adjustments to visibility 2015-04-24 13:28:24 -07:00
Robert Ramey 70206bf4ef Revert "enhancement to support gcc visibility."
This reverts commit 23b012ef66.
2015-04-24 13:12:10 -07:00
Robert Ramey 23b012ef66 enhancement to support gcc visibility.
These changes are meant to support gcc visibility on mingw platforms - which is basically gcc with windows attributes.
2015-04-22 22:02:56 -07:00
Robert Ramey 7565de4008 transitory changes attempting to resolve visibility for minnow 2015-04-22 09:32:58 -07:00
Robert Ramey 750080c20e added polymorphic helper tests
removed obsolete information from documentation
2015-04-11 10:14:37 -07:00
Robert Ramey a32549c25f fixed problem with helper on polymorphic archives
added test_polymorphic_helper
2015-04-10 14:24:33 -07:00
Vladimir Prus ee3560ad83 Revert "first cut in fixing up visibility"
This reverts commit 94dbfcfc4f.
2015-04-06 12:48:24 +03:00
Vladimir Prus e525cb560f Revert "simplified visibility"
This reverts commit 4c0590737e.
2015-04-06 12:48:22 +03:00
Vladimir Prus 57da005e5f Revert "add BOOST_SYMBOL_VISIBLE to otherwise invisible classes and implement BOOST_NOEXCEPT where needed"
This reverts commit e7a7ee8018.
2015-04-06 12:48:20 +03:00
Vladimir Prus d5aaa3801a Revert "fix a couple of gcc warnings"
This reverts commit 79e73a715c.
2015-04-06 12:48:06 +03:00
Robert Ramey 0d9dd64a66 Marcel s changes to fix import/export on MSVC 2015-04-05 13:53:55 -07:00
Robert Ramey bb6f23bd92 Merge pull request #12 from MarcelRaad/fix_msvc
Fix DLL compilation on MSVC
2015-04-05 11:00:33 -07:00
Robert Ramey 38a69e729b Adjustments trying to get correct MSVC compilation for dll 2015-04-05 09:30:15 -07:00
Marcel Raad e66f38a702 Fix DLL compilation on MSVC 2015-04-05 16:47:56 +02:00
Robert Ramey 49f34b5810 Trying to get archive exception to compile 2015-04-04 15:49:27 -07:00
Robert Ramey 831a6e26b4 minor changes to clean up some warnings and to try and get the library to build on MSVC compilers 2015-04-04 12:57:50 -07:00
Robert Ramey aedbb5da8e tweak to address compilation error on MSVC 2015-04-03 08:26:29 -07:00
Robert Ramey 61b81fad46 many small adjustments to get visibility working correctly on GCC and Clang.
Tested pretty extensively in release/debug shared/linked.
I don't have MSVC on me - so I'll have to upload without testing this.
One pending issue is that test_utf8_codecvt fails.  I'm guessing that the copy in detail needs to be tweaked.
I'll get this fixed up separately.
2015-04-02 13:02:33 -07:00
Robert Ramey e16e3ed0dc corrected visibility for MSVC compilers 2015-03-31 16:52:41 -07:00
Robert Ramey 92e104060d enabled visibility=hidden for gcc compiler to diminish symbols in executable 2015-03-29 22:15:24 -07:00
Robert Ramey c3fbfb3cad made adjustments to suppress bogus warnings with MSVC so we could see error messages in test matrix 2015-03-29 21:34:46 -07:00
Robert Ramey 434b7c3a6d make changes to see if I can get MSVC platforms to compile/link 2015-03-27 14:43:59 -07:00
Robert Ramey 94d2e495ca corrected pfto in polymorphic_?archive.hpp
fixed visibility for singleton
corrected error in test_utf8_codecvt
2015-03-24 18:02:06 -07:00
Robert Ramey 8dd74ab095 bumped archive version in case I break something 2015-03-23 15:38:53 -07:00
Robert Ramey 5a94e5e4eb removed pfto 2015-03-23 15:29:57 -07:00
Robert Ramey 5c7e17b715 removed support for borland compilers 2015-03-23 13:43:59 -07:00
Robert Ramey 7067bdb263 simplifing visibility/autolink 2015-03-23 13:20:05 -07:00
Robert Ramey 1baeb11a7f cleanup visibiliy / auto link macros throughout project - still more to be done 2015-03-23 12:46:02 -07:00
Robert Ramey 79e73a715c fix a couple of gcc warnings 2015-03-22 16:16:42 -07:00
Robert Ramey e7a7ee8018 add BOOST_SYMBOL_VISIBLE to otherwise invisible classes and implement BOOST_NOEXCEPT where needed 2015-03-22 15:25:45 -07:00
Robert Ramey 4c0590737e simplified visibility 2015-03-21 18:38:41 -07:00
Robert Ramey 94dbfcfc4f first cut in fixing up visibility 2015-03-21 17:56:57 -07:00
Robert Ramey cf0d7de91e Merge pull request #9 from akumta/patch-1
Update register_archive.hpp
2015-03-04 15:05:42 -08:00
akumta 768145d01d Update register_archive.hpp
Per boost ticket# 11004
2015-03-04 14:49:58 -08:00
Robert Ramey 594541b6d7 Merge pull request #4 from danieljames/metadata
Create metadata file.
2015-01-09 14:44:05 -08:00
Robert Ramey aa18f80439 fix some minor header inclusion 2014-12-18 17:34:55 -08:00
Robert Ramey a838b0821f tweaked tests to suppress some warning noise
fixed sequential lists to handle types without default constructors
adjusted CMakeLists.txt to correctly generate c++ selection for Xcode
2014-12-16 15:40:24 -08:00
Robert Ramey df8dec38fc fixed check for default constructible in std containers serialization 2014-12-15 15:22:33 -08:00
Robert Ramey aa6ca846a4 fixed collection loading to be backwards compatible. Unforunately this breaks the fix I intended to make. Need to update docs so that users specialize boost::has_default_constructor<T> for item type 2014-12-15 10:17:27 -08:00
Robert Ramey 523f9baca2 correct last minute error in collection simplification 2014-12-13 22:02:57 -08:00
Robert Ramey 3d8d73f0d0 fixes in attributes to permit Visual Studio compatibility 2014-12-13 14:12:34 -08:00
Robert Ramey a702dcb76f finally?! fixed problem with failing xml_warchive 2014-12-12 15:55:02 -08:00
Robert Ramey fb61aeea5c still trying to fix xml_warchive 2014-12-12 07:53:31 -08:00
Robert Ramey e70a2bb9b3 fixed issues related to codecvt facets 2014-12-10 12:51:30 -08:00
Robert Ramey 61b8c96e23 attempt to address failure of gcc standard library to properly handle codecvt.
now I have problem in local state saver - commented out for now
2014-12-08 17:01:23 -08:00
Robert Ramey 567bccc026 fixed problem serialization vector<vector<?> >
improved memory management using autoptr where scoped_ptr is called for.  Note: condition usage of unique_ptr for newer platforms.
added tests to verify that interruption of serialization handles exception handling gracefully
2014-12-06 13:10:12 -08:00
Robert Ramey 6ba97066f4 fixed error where vector<vector<dummy>> doesn't serialize properly
improved loading of sequential containers
2014-12-02 00:02:54 -08:00
Robert Ramey b0f63a710f removed deprecated version of strong_typedef.hpp from boost directory 2014-11-13 10:06:58 -08:00
Robert Ramey 02fff0a69e fixed shared_ptr_helper include 2014-11-11 22:13:05 -08:00
Robert Ramey 5712994137 made is_whitespace explicitly inline 2014-09-26 10:50:50 -07:00
Robert Ramey c2f9a6c3f4 type in docs
add default parameter value to get_helper_support
2014-09-13 06:52:40 -07:00
Robert Ramey 7f80632617 fixed case for compilers where type specific new operator doesn't work 2014-09-02 15:09:01 -07:00
Robert Ramey d75a4416d7 minor adjustments to helper collection and tests.
update documentation for helper collection
2014-08-25 13:17:11 -07:00
Daniel James 46ec3ad75f Add metadata file. 2014-08-18 15:10:21 +01:00
Robert Ramey c13b89c8f9 added missing headers to shared_ptr_helper.
note - failed to show up in tests.  probably included superfluously in other headers.
2014-08-12 09:05:54 -07:00
Robert Ramey 8ce1ff884a Corrected error in std::shared_ptr serialization.
Adjusted so that there is one instance of shared_ptr_helper per archive instance.  Before it was accidentally making one instance per pointer type which was not properly "matching up" shared/weak pointers.
2014-08-10 10:07:58 -07:00
Robert Ramey c034aa1055 Fixed up helper implementation so that it properly accounts for help instances 2014-08-08 21:49:20 -07:00
Robert Ramey 2b5f6e7a8f Merge pull request #2 from MarcelRaad/patch-1
Fix variable shadowing warning
2014-07-04 08:38:42 -07:00
Marcel Raad 16621745f8 Fix variable shadowing warning
MSVC 14 gives the following warning:
"warning C4456: declaration of 'result' hides previous local declaration".
2014-07-03 19:20:46 +02:00
Robert Ramey 32bb9f82ae Added size() to class_name_type to permit checking to maximum permitted size
Simplified calculation of number of elements
added check for too long class names
added {} to array initialization to avoid bogus warning
2014-07-01 12:50:38 -07:00
Robert Ramey d912153782 corrections to shared pointer support and implementation of helper collection 2014-06-26 07:25:22 -07:00
Robert Ramey 2183deba45 trapped error with failed void_upcast.
helper collection improved - still not done yet
update shared pointer to handle C++11
removed old shared pointer helper from portable binary archive
2014-06-19 14:28:47 -07:00
Robert Ramey 421c1f2590 changes to eliminate dependence on shared_ptr 2014-06-16 11:24:43 -07:00
Robert Ramey ca438959cd Merge pull request #1 from insideoutclub/develop
Develop
2014-06-12 18:04:11 -07:00
insideoutclub 740d662757 Fixing typos. 2014-05-26 22:34:32 -07:00
insideoutclub 3e7c5fde99 Fixing typos. 2014-05-26 22:31:44 -07:00
insideoutclub 622a95dd81 Fixing typos.
Please check line 130.
2014-05-26 22:27:35 -07:00
insideoutclub 521589af07 Fixing typos. 2014-05-26 22:22:46 -07:00
insideoutclub 9e1a619324 Fixing typos.
Please check lines 52 and 102.
2014-05-26 22:19:23 -07:00
insideoutclub f5a31ae7c0 Fixing typos. 2014-05-26 22:12:15 -07:00
insideoutclub 819f5649ad Fixing typos. 2014-05-26 22:08:39 -07:00
insideoutclub b0e263e52a Fixing typos. 2014-05-26 12:11:43 -07:00
insideoutclub 60b9ab6a5a Fixing typos. 2014-05-26 11:59:20 -07:00
insideoutclub 806ed33010 Fixing typos. 2014-05-26 11:53:32 -07:00
insideoutclub 335424ca6e Fixing typos. 2014-05-26 08:39:34 -07:00
insideoutclub ee4b0d4d1e Fixing typos. 2014-05-26 08:37:06 -07:00
insideoutclub 4dd2f9ce04 Fixing typos. 2014-05-26 08:34:09 -07:00
insideoutclub c5c15b15bd Update extended_type_info.html
Fixing typos. Line 225 needs review.
2014-05-26 08:31:27 -07:00
insideoutclub f509e1dc67 Update derivation.html
Fixing typos.
2014-05-26 08:15:00 -07:00
insideoutclub 0f260d5d9b Update simple_log.html
Fixing typos.
2014-05-26 08:07:21 -07:00
insideoutclub 8353999a2e Update pimpl.html
Fixing typos. Line 48 still needs some work.
2014-05-26 08:04:58 -07:00
insideoutclub a809ed7254 Update shared_ptr.html
Fixing typos.
2014-05-26 07:56:54 -07:00
insideoutclub 4d6f05642c Update headers.html
Fixing typos. Line 348 still needs some work.
2014-05-26 07:46:26 -07:00
insideoutclub dda3b3431e Update implementation.html
Fixing typos. Line 257 still needs a cross-reference.
2014-05-26 07:23:42 -07:00
insideoutclub 1817cdfa4f Update archive_reference.html
Fixing typos.
2014-05-25 22:26:40 -07:00
insideoutclub 68fcb21365 Update exception_safety.html
Fixing typos.
2014-05-25 12:27:26 -07:00
insideoutclub 99696d9c18 Update archive_exception.hpp
Fixing typos.
2014-05-25 12:03:19 -07:00
insideoutclub 256e8dd794 Update exceptions.html
Fixing typos.
2014-05-25 11:53:39 -07:00
insideoutclub d5d9a3a5a3 Update special.html
Fixing typos.
2014-05-25 11:41:48 -07:00
insideoutclub 21ec29f991 Update wrappers.html
Fixing typos.
2014-05-24 07:58:21 -07:00
insideoutclub 7c35aa79d0 Update traits.html
This line either needs to be deleted or it needs to be a link to version.hpp.
2014-05-24 07:46:15 -07:00
insideoutclub d34508689e Update traits.html
Fixing typos.
2014-05-24 07:14:21 -07:00
insideoutclub c74430bbc7 Update traits.html
Fixing typos.
2014-05-23 22:53:53 -07:00
insideoutclub a58d835291 Update serialization.html
Fixing typos.
2014-05-23 11:56:25 -07:00
insideoutclub 3c6c241bd7 Update archives.html
Fixed a typo. Changed "thier" to "their".
2014-05-23 11:27:39 -07:00
insideoutclub c957250757 Update tutorial.html
Fixed a typo. Changed "implemenations" to "implementations".
2014-05-23 11:19:32 -07:00
Robert Ramey 8e4248285a fix hoping to get mdvc 8.0 to pass 2014-04-14 16:08:28 -07:00
Robert Ramey e65f25fce1 fixed error for microsoft compilers 2014-03-21 21:57:15 -07:00
Robert Ramey 3fc172b3fb BOOST_DEDUCED_TYPENAME <- typename 2014-03-19 18:35:13 -07:00
Robert Ramey 4fff20dff4 address MSVC shared_ptr helper problem
attempt yet again to address MSVC 8.0 issues
2014-03-19 18:00:55 -07:00
Robert Ramey 1d07e1dd57 Merge branch 'develop' 2014-03-17 12:32:01 -07:00
Robert Ramey f3d5bc52bb attempt to make tests pass on mdvc 8.0 2014-03-12 20:58:08 -07:00
Robert Ramey 673135a41e changes to support msvc 8.0
reversion problems created by s kelly project
2014-03-06 08:24:28 -08:00
Robert Ramey 168671c1c3 Fix failures for msvc 8.0
back out more MSVC workaround "fixes"
fix shared_ptr_helper load template declaration
2014-03-04 14:26:19 -08:00
Robert Ramey b8bf2de47d Merge branch 'develop' 2014-03-02 11:03:01 -08:00
Robert Ramey a9a4f6da0b fixed interface to dynamic_cast<shared_ptr>
tweaked archives to use/restore original local rather than the global "classic" one
2014-02-28 10:50:19 -08:00
Robert Ramey 818333c7fd added #if def to skip std::shared_ptr test when compiler doesn't support C++11 2014-02-23 11:21:13 -08:00
Robert Ramey c8cb85339d corrected test in the absence of C++11 support for smart pointers 2014-02-22 11:11:29 -08:00
Robert Ramey ed0ba055c8 correction for shared_ptr_helper and test_unique_ptr 2014-02-20 08:33:32 -08:00
Robert Ramey fb559afd0d fix various trac items 2014-02-19 13:11:33 -08:00
Robert Ramey 3c9fe377f3 merge develop to master 2014-02-17 18:55:24 -08:00
Robert Ramey 57e6da40e9 added unique_ptr.hpp 2014-02-17 14:56:19 -08:00
Robert Ramey a5f7c7850b added test_unique_ptr.cpp 2014-02-17 14:21:33 -08:00
Robert Ramey 484874f0c2 Merge branch 'stl_pointers' into develop 2014-02-17 12:30:00 -08:00
Robert Ramey 7f604fa7ff minor corrections to pass full suite of test 2014-02-17 12:28:07 -08:00
Robert Ramey 606093112f both std and boost versions of shared / weak pointer passing tests 2014-02-16 21:38:28 -08:00
Robert Ramey c9443fba24 intermediate version 2014-02-16 00:06:04 -08:00
Robert Ramey f5168e15a4 new shared_ptr_helper
passed a couple of tests
removed naked-... versions of archive classes
2014-02-15 14:47:26 -08:00
Robert Ramey f7ad9e8d07 fixed shared_helper implementation 2014-02-13 15:55:05 -08:00
Robert Ramey 679c9ee7ef minor adjustments to testing 2014-02-13 09:17:33 -08:00
Robert Ramey 75f09afc89 moved shared_helper to mixin of common base
updated shared_ptr serialization accordingly
2014-02-13 08:52:58 -08:00
Robert Ramey c19a1e737e tweak test 2014-02-09 21:22:21 -08:00
Robert Ramey 59e822de4a fixed tests to condition on C11 compatibility 2014-02-07 20:47:44 -08:00
Robert Ramey da757049e5 misc fixes in tests to condition of C++11 support
another fix for S Kelly fiasco.
2014-02-07 10:01:12 -08:00
Robert Ramey 2140063d82 added support for missing collections in the standard library
forward_list
array
stack
queue
priority_queue
2014-02-06 13:12:39 -08:00
Robert Ramey a95d415155 types in CMake file 2014-02-03 14:40:40 -08:00
Robert Ramey e7dad5da18 stop tracking accidentally checked cmake build directory 2014-01-31 09:17:46 -08:00
Robert Ramey 5244401101 fix for cycle error 2014-01-30 23:07:47 -08:00
Robert Ramey 4156bd15e6 fixed to avoid testing of utf characters > 21 bits which aren’t required to be supported by standards.
This was creating a false test failure.
Boost’s code convert facets don’t check for this so they pass the original test.
2014-01-27 12:54:25 -08:00
Robert Ramey 200cb3019c added comments to build serialization project 2014-01-26 13:55:17 -08:00
Robert Ramey f9c6d2a7ac refined CMake to generate shared vs static builds 2014-01-26 09:45:57 -08:00
Robert Ramey 1efe4813f8 Upgraded to include most library tests 2014-01-24 08:49:17 -08:00
Robert Ramey 6c7f48543e added in cache variables for 32/64 selection 2014-01-23 10:40:54 -08:00
Robert Ramey f4cc516809 initial checkin 2014-01-22 21:13:16 -08:00
Robert Ramey b454953f27 merge trunk to release
[SVN r86727]
2013-11-16 20:13:39 +00:00
Robert Ramey bda94d16d1 merge trunk to release
[SVN r86724]
2013-11-16 19:41:12 +00:00
Robert Ramey 8af0e20bb0 merge trunk to release
[SVN r86723]
2013-11-16 19:31:12 +00:00
Robert Ramey 7ee0f95b23 corrected usage of codecvt_utf8
[SVN r86618]
2013-11-11 15:41:01 +00:00
Robert Ramey ecaccd36a5 correct usage of codecvt_utf8
[SVN r86617]
2013-11-11 15:40:12 +00:00
Robert Ramey e14e2de4ae changed codecvt_utf8 so that serialization uses the standard one if available. If there is no standard one available, it uses the one in boost/utility.
[SVN r86611]
2013-11-11 01:57:48 +00:00
Robert Ramey 76f231dc92 changed codecvt_utf8 so that serialization uses the standard one if available. If there is no standard one available, it uses the one in boost/utility.
[SVN r86610]
2013-11-11 01:56:19 +00:00
Robert Ramey f29bdab128 changed codecvt_utf8 so that serialization uses the standard one if available. If there is no standard one available, it uses the one in boost/utility.
[SVN r86609]
2013-11-11 01:55:39 +00:00
Robert Ramey 3812a98455 fix up of issues created by removal of support for older compilers
[SVN r86589]
2013-11-08 21:23:37 +00:00
Robert Ramey 1fdf760fba fix up of issues created removal of support for older compilers
[SVN r86588]
2013-11-08 21:08:55 +00:00
Robert Ramey f8b7769f74 increased template instantiation depth for clang to 255
[SVN r86520]
2013-10-30 03:57:39 +00:00
Robert Ramey 49d47f76d0 corrected # digits - next attempt
[SVN r86507]
2013-10-28 21:38:15 +00:00
Robert Ramey ff6e816b98 corrected # digits
corrected tests which compare floating point numbers to require max 1 digit difference

[SVN r86501]
2013-10-28 15:39:01 +00:00
Robert Ramey 61e32a782b corrected # digits
corrected tests which compare floating point numbers to require max 1 digit difference

[SVN r86500]
2013-10-28 15:36:41 +00:00
Robert Ramey 1bded4af0c corrected # digits
[SVN r86499]
2013-10-28 15:34:58 +00:00
Robert Ramey 599c58825b correct rounding
fix memory leak for constructor failure in load_construct_data
fix another bug in loading pointers

[SVN r86487]
2013-10-27 20:50:26 +00:00
Robert Ramey aad837cf20 correct rounding
fix memory leak for constructor failure in load_construct_data
fix another bug in loading pointers

[SVN r86486]
2013-10-27 20:38:43 +00:00
John Maddock 127db4d189 Remove all references to now defunct (and removed) header.
[SVN r86438]
2013-10-26 10:13:38 +00:00
Stephen Kelly 77ec94abf1 Remove use of obsolete BOOST_TT_BROKEN_COMPILER_SPEC
[SVN r86250]
2013-10-11 23:23:26 +00:00
Stephen Kelly 800a233152 Remove remaining occurances of BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
These evaded scripting.

[SVN r86249]
2013-10-11 23:22:36 +00:00
Stephen Kelly 4da869a1e2 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#else...#endif blocks.

[SVN r86245]
2013-10-11 23:17:48 +00:00
Stephen Kelly e3fe03c675 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#endif conditions.

[SVN r86244]
2013-10-11 23:15:00 +00:00
Robert Ramey d57978411e corrected test_array.cpp
[SVN r86217]
2013-10-09 17:04:12 +00:00
Robert Ramey 86dcaaba03 replaced delete t where t is a void * with free(t)
[SVN r86195]
2013-10-07 19:38:26 +00:00
Robert Ramey 875a37f915 fixed memory leak on load_object_ptr and other changes
[SVN r86156]
2013-10-04 00:36:37 +00:00
Robert Ramey 33d737eb4c fixed memory leak on load_object_ptr and other changes
[SVN r86155]
2013-10-04 00:26:49 +00:00
Stephen Kelly 50181d8a1d Serialization: Remove obsolete GCC version checks.
[SVN r86121]
2013-10-01 09:53:25 +00:00
Stephen Kelly d982935ea0 Serialization: Remove obsolete MSVC version checks.
[SVN r86120]
2013-10-01 09:53:08 +00:00
Stephen Kelly ee2284e28f Serialization: Remove obsolete GCC version check.
[SVN r86064]
2013-09-30 15:57:33 +00:00
Stephen Kelly 8ced07c640 Archive: Remove obsolete MSVC version checks.
[SVN r86052]
2013-09-30 11:22:56 +00:00
Stephen Kelly f735d967ec Serialization: Remove use of obsolete NNTP macro.
[SVN r85960]
2013-09-26 14:09:38 +00:00
Stephen Kelly f260c15935 Remove obsolete MSVC check from pragma guard
git grep -h -B1 "^#\s*pragma once" | grep -v pragma | sort | uniq

is now clean.

[SVN r85952]
2013-09-26 13:02:51 +00:00
Stephen Kelly f06e89cefb Serialization: Remove obsolete MSVC version checks.
[SVN r85911]
2013-09-25 21:12:23 +00:00
John Maddock ce2855e559 Suppress msvc warnings.
[SVN r85243]
2013-08-08 18:05:37 +00:00
Robert Ramey 3d7ac026c6 sync with release branch
[SVN r84077]
2013-04-28 20:23:10 +00:00
Robert Ramey 3c92534d7c to suppress warning?
[SVN r84069]
2013-04-28 16:20:28 +00:00
Robert Ramey 18d774a18b accumulated changes that effect warnings and performance bug fix
[SVN r84068]
2013-04-28 16:07:27 +00:00
Robert Ramey 138634c667 revert previous change - waaayy to risky
[SVN r84067]
2013-04-28 15:55:56 +00:00
Robert Ramey 01c103ab36 very minor change - don't remember what provoked it!
[SVN r84066]
2013-04-28 15:46:02 +00:00
Robert Ramey a789ad849a fixed reset_object_address inefficiency. This resulted in trying to deep move pointers. This didn't cause any bugs but resulted in very long times when loading indexed collections of pointers. The time saved by this change is huge in these rare cases.
[SVN r83440]
2013-03-15 17:53:21 +00:00
Robert Ramey 096b13ef3a remove warnings
[SVN r82969]
2013-02-18 06:03:37 +00:00
Robert Ramey ab40aa9605 remove warnings
[SVN r82968]
2013-02-18 06:02:29 +00:00
Robert Ramey c809abe05d merge to release
[SVN r82352]
2013-01-04 16:39:43 +00:00
Robert Ramey 791c458e9a corrections for exception specs
[SVN r82202]
2012-12-24 18:33:01 +00:00
Robert Ramey 2d0c881502 fixed problem with base64 iterators
[SVN r82201]
2012-12-24 18:23:49 +00:00
Robert Ramey 225b1e326b update test_utf8_codecvt test to use std::istream_iterator.
update other tests for improvements in base64_from_binary
tweak test_complex to play nice with PGI library.

[SVN r82200]
2012-12-24 18:12:43 +00:00
Robert Ramey de0b48247d adjustment for PGI compiler header
[SVN r82199]
2012-12-24 17:59:38 +00:00
Robert Ramey 204b817694 tweak to permit pgi compiler to pass
[SVN r81944]
2012-12-14 18:14:38 +00:00
Robert Ramey 4fda311951 altered test to use std::istream_iterator rather than serialization version of same
[SVN r81881]
2012-12-12 19:06:51 +00:00
Robert Ramey d7a32be2ed made tests and documentation consistent with correct exception throw specs
[SVN r81848]
2012-12-11 05:36:04 +00:00
Robert Ramey 59a18411ba corrected throw exception in smart cast
[SVN r81847]
2012-12-11 05:33:45 +00:00
Robert Ramey 2d11a99e4d fixed problem where base64 read un initialized memory
made sure base64 zero filled.
made base64 lines 76 char wide in accordance with the standard
fixed gcc error message re looser throw constaints

[SVN r81846]
2012-12-11 05:32:06 +00:00
Robert Ramey 483301ed4e made grafics 50% bigger
[SVN r80422]
2012-09-06 17:24:34 +00:00
Robert Ramey de0d30d99c merge to release
[SVN r79994]
2012-08-13 01:42:43 +00:00
Robert Ramey a8f5b80422 merge to release
[SVN r79993]
2012-08-13 01:41:48 +00:00
Robert Ramey 1dba4d5027 fixes for static/dll library build/test
[SVN r79981]
2012-08-12 16:47:07 +00:00
Robert Ramey ca8cb19e53 adjustment for QNX
altered Jamfiles to fix test with DLLS on static builds

[SVN r79951]
2012-08-10 01:39:53 +00:00
Robert Ramey 6f0659a8e8 adjustment for QNX
altered Jamfiles to fix test with DLLS on static builds

[SVN r79950]
2012-08-10 01:38:54 +00:00
Robert Ramey eeda582b13 merge to release
[SVN r79542]
2012-07-15 17:41:24 +00:00
Robert Ramey 475ee011bd merge to release
[SVN r79541]
2012-07-15 17:35:09 +00:00
Robert Ramey 943ce757ed merge to release
[SVN r79540]
2012-07-15 17:21:50 +00:00
Robert Ramey 7755c58905 added ar & to example to correct minor error
[SVN r79535]
2012-07-15 15:47:59 +00:00
Robert Ramey 428a88820f undefined STD at the end of the header
[SVN r79028]
2012-06-21 20:23:01 +00:00
Robert Ramey 10e65dccae patch for IBM VCAPP
[SVN r78731]
2012-05-28 19:08:51 +00:00
Dave Abrahams 6fb0089323 Replace all uses of boost/utility.hpp with more-granular includes. Solves modularization dependency nightmare.
[SVN r78502]
2012-05-18 04:44:04 +00:00
Dave Abrahams b344e4b3c1 Summary: Moved libs/detail/utf8_codecvt_facet.cpp to boost/detail/utf……8_codecvt_facet.ipp
Author: Dave Abrahams <dave@boostpro.com>


[SVN r78119]
2012-04-21 22:36:59 +00:00
Dave Abrahams b6aafd86f4 Summary: Moved libs/detail/utf8_codecvt_facet.cpp to boost/detail/utf8_codecvt_facet.ipp
Author: Dave Abrahams <dave@boostpro.com>


[SVN r78081]
2012-04-19 18:19:20 +00:00
Robert Ramey 6382705450 Merge trunk to release
[SVN r77577]
2012-03-26 22:49:45 +00:00
Robert Ramey 96084a1ecc Merged trunk to release
[SVN r77576]
2012-03-26 22:45:17 +00:00
Robert Ramey bae58915cf Merged trunk to release
[SVN r77575]
2012-03-26 22:34:17 +00:00
Robert Ramey 7a2f41a221 Modified vc ide soln
[SVN r77574]
2012-03-26 22:12:35 +00:00
Robert Ramey 5f8f8dcbc8 moved #include <boost/limits.hpp> higher in the include
[SVN r76954]
2012-02-09 05:50:29 +00:00
Robert Ramey 35cbf61982 some tests included <limits> rather than <boost/limits.hpp>
This made tests for platforms which don't have <limits> fail - specifically PGI.
So we fixed those tests to use <boost/limits.hpp>

[SVN r76945]
2012-02-07 20:53:56 +00:00
Robert Ramey 2d17291ca8 small changes resulting from fixing track items
[SVN r76666]
2012-01-24 19:31:17 +00:00
Robert Ramey 46b543fd46 reverted last change which broke vector test
[SVN r76665]
2012-01-24 19:29:53 +00:00
Hartmut Kaiser 7fe90f58b7 Phoenix: merging changes from trunk (as requested by heller)
[SVN r76496]
2012-01-14 20:18:36 +00:00
Matthias Troyer fbaaecd941 Attempting to fix #5640
[SVN r76292]
2012-01-03 18:00:59 +00:00
Thomas Heller 5464abd586 added full qualification to enable_if for the member pointer operator
[SVN r75050]
2011-10-18 16:09:48 +00:00
Gennadiy Rozental c37657d102 eliminated unit_test/test_tools
[SVN r74730]
2011-10-05 09:49:27 +00:00
Robert Ramey 354989d6a7 syncronize release with trunk
[SVN r74706]
2011-10-04 19:22:51 +00:00
Robert Ramey 2d1b4f8721 syncronize release with trunk
[SVN r74705]
2011-10-04 19:22:28 +00:00
Robert Ramey fe4a01eb73 fix pragma warning
[SVN r74703]
2011-10-04 18:22:08 +00:00
Robert Ramey edab484451 update vc projects
[SVN r74659]
2011-10-02 20:46:52 +00:00
Robert Ramey 0898d2157e change in comment
[SVN r74658]
2011-10-02 20:44:26 +00:00
Robert Ramey 55cf704082 corrections
[SVN r74657]
2011-10-02 20:43:39 +00:00
Robert Ramey 42d9df67b3 changed char to signed char
[SVN r74656]
2011-10-02 20:42:46 +00:00
Robert Ramey 023f0f155e sync projects
[SVN r72721]
2011-06-23 04:19:56 +00:00
Robert Ramey 5d6e366240 merge to release
[SVN r71427]
2011-04-22 23:43:18 +00:00
Robert Ramey 42275e1769 merge to release
[SVN r71426]
2011-04-22 23:42:29 +00:00
Robert Ramey 63f4076bbb added const to version<t> static variable
[SVN r71197]
2011-04-12 03:54:22 +00:00
Robert Ramey 980c36e6eb small fixes to address track items
[SVN r71184]
2011-04-11 03:51:35 +00:00
Robert Ramey ea4e72c7da small fixes to address track items
[SVN r71183]
2011-04-11 03:46:26 +00:00
Robert Ramey a343776194 correct bug in test
[SVN r71165]
2011-04-10 17:26:06 +00:00
Robert Ramey 20f7ac0307 fix for "delete virtual function" bug
[SVN r71164]
2011-04-10 17:25:39 +00:00
Robert Ramey 663b1ba184 backward compatibility fix
[SVN r68401]
2011-01-23 20:28:05 +00:00
Robert Ramey a7bd7ef6c2 improve compatibility with older archive versions
[SVN r68388]
2011-01-23 16:28:10 +00:00
Robert Ramey 7c7b067dfe Merge from trunk to release
[SVN r68305]
2011-01-19 18:31:02 +00:00
Robert Ramey 1014408275 merge trunk into 1.46 release
[SVN r68302]
2011-01-19 17:39:47 +00:00
Robert Ramey 995422e23a Merge to 1.46 release
[SVN r68300]
2011-01-19 17:33:55 +00:00
Robert Ramey 2b530fec86 bump archive version #
[SVN r68297]
2011-01-19 17:04:19 +00:00
Robert Ramey 797cf25d5a Update docs for 1.46
[SVN r68296]
2011-01-19 17:03:23 +00:00
Steven Watanabe b7a4b7202a Revert [67111] (addition of boost/detail/iomanip.hpp) and all the commits that depend on it. ([68137], [68140], [68141], [68154], and [68165]).
[SVN r68168]
2011-01-15 08:11:51 +00:00
Robert Ramey 73523aaad2 fix for binary archive version 1.44 & and 1.43 item_version compatibility
[SVN r68160]
2011-01-14 22:22:49 +00:00
Bryce Adelstein-Lelbach e8a11574c7 Replacing the use of <iomanip> with <boost/detail/iomanip.hpp> across Boost.
On Linux, GNU's libstdc++, which is the default stdlib for icc and clang,
cannot parse the <iomanip> header in version 4.5+ (which thankfully neither
compiler advises the use of yet), as it's original C++98-friendly
implementation has been replaced with a gnu++0x implementation.
<boost/detail/iomanip.hpp> is a portable implementation of <iomanip>, providing
boost::detail::setfill, boost::detail::setbase, boost::detail::setw,
boost::detail::setprecision, boost::detail::setiosflags and
boost::detail::resetiosflags. 



[SVN r68140]
2011-01-14 02:35:58 +00:00
Hartmut Kaiser efa33adb99 Wave: merging from trunk
[SVN r68004]
2011-01-11 23:19:22 +00:00
Bryce Adelstein-Lelbach f210151ac0 Support for PathScale EKOPath Compiler Suite, version 4.0.0.
[SVN r67707]
2011-01-06 02:38:20 +00:00
Robert Ramey 46198abb47 attempt to make binary archive created with versions < 1.42 readable
[SVN r67440]
2010-12-24 01:26:58 +00:00
Robert Ramey 6d9926c138 shorten names of temporary files
[SVN r67439]
2010-12-23 22:34:54 +00:00
Robert Ramey 7b609deb80 attempt to make binary archive created with versions < 1.42 readable
[SVN r67438]
2010-12-23 22:33:45 +00:00
Robert Ramey 2fe3c19dec tests now require filesystem v3
[SVN r67345]
2010-12-19 17:36:00 +00:00
Robert Ramey f568824c94 fix for testing - avoid mktemp.
Note, Now depends on boost file system and boost system !!!

[SVN r67306]
2010-12-18 19:28:20 +00:00
Hartmut Kaiser 0f48842fa6 Spirit: merging from trunk
[SVN r67274]
2010-12-16 13:39:55 +00:00
Robert Ramey 8ac1c19a7f updated version # explanation
[SVN r67074]
2010-12-06 19:18:14 +00:00
Robert Ramey 01d51bf2f4 updated library generation to 1.45
[SVN r67073]
2010-12-06 19:17:31 +00:00
Robert Ramey dd26871f3e fixed import declaration on inline function
change tracking type from bool

[SVN r67072]
2010-12-06 19:16:34 +00:00
Bryce Adelstein-Lelbach 6ca19892be assert -> BOOST_ASSERT
[SVN r66514]
2010-11-12 03:56:29 +00:00
Bryce Adelstein-Lelbach 4f74f0a34c Fix for https://svn.boost.org/trac/boost/ticket/4809; fixed includes for Spirit
Classic. 



[SVN r66459]
2010-11-08 17:12:38 +00:00
Robert Ramey a436398622 merge to release branch
[SVN r66424]
2010-11-06 20:35:35 +00:00
Robert Ramey 1edfe234c2 merge to release branch
[SVN r66423]
2010-11-06 20:34:23 +00:00
Robert Ramey 17e169b578 merge to release branch
[SVN r66422]
2010-11-06 20:06:00 +00:00
Robert Ramey 16b1306c1d merge to release branch
[SVN r66421]
2010-11-06 20:03:52 +00:00
Robert Ramey 6d27e1ef55 merge to release branch
[SVN r66420]
2010-11-06 20:00:50 +00:00
Robert Ramey 4de1aa686c merge to release branch
[SVN r66419]
2010-11-06 20:00:11 +00:00
Robert Ramey c66e364994 merge to release branch
[SVN r66418]
2010-11-06 19:59:37 +00:00
Robert Ramey 24fdc3c458 merge to release branch
[SVN r66417]
2010-11-06 19:58:23 +00:00
Robert Ramey 8ab4d7d51b merge to release branch
[SVN r66415]
2010-11-06 16:41:35 +00:00
Robert Ramey 445295b9a7 merge to release branch
[SVN r66414]
2010-11-06 16:31:31 +00:00
Robert Ramey df196d8883 minor correction which avoids spurious warning
[SVN r66393]
2010-11-03 23:35:54 +00:00
Robert Ramey fd39ca31ae Temporarily backout changes to xml_archive until after next release
[SVN r66392]
2010-11-03 23:34:11 +00:00
Robert Ramey e22fdfac68 Temporarily backout changes to xml_archive until after next release
[SVN r66391]
2010-11-03 23:33:31 +00:00
Bryce Adelstein-Lelbach 5cf894db0f Fixes for building Serialization with mingw.
[SVN r66123]
2010-10-20 20:50:52 +00:00
Bryce Adelstein-Lelbach b136fee2e3 Removing -fvisibility-hidden from gcc build. Serialization build breaks on Linux
GCC with this. -fvisibility-* stuff only works with code carefully crafted to
work with it's intricacies.



[SVN r66115]
2010-10-20 11:29:59 +00:00
Bryce Adelstein-Lelbach 21809d6e0d Broken compiler fix for MSVC-7.1; shamelessly added myself to the acknowledgements page.
[SVN r66114]
2010-10-20 00:44:17 +00:00
Robert Ramey b0342c4f11 fix compatibility with archive versions 1.41-, 1.42, 1.43,1.44+
and a bunch of miscelleneas stuff

[SVN r66107]
2010-10-19 19:45:11 +00:00
Robert Ramey bc7ba5556f fix compatibility with archive versions 1.41-, 1.42, 1.43,1.44+
[SVN r66106]
2010-10-19 19:43:09 +00:00
Matthias Troyer 83df60972b Moved Boost.MPI fixes for the 1.45 release to the release branch
[SVN r66067]
2010-10-18 06:22:09 +00:00
Bryce Adelstein-Lelbach 285ced858f Removed an extra ; after a IS_BITWISE macro; it breaks things on older gcc
compilers.



[SVN r66033]
2010-10-17 08:36:44 +00:00
Bryce Adelstein-Lelbach 883d965008 Rewrite of the Boost.Serialization XML grammar using Spirit.Qi.
[SVN r66030]
2010-10-16 21:33:22 +00:00
Matthias Troyer 907ca349c1 Fixes for homogenous MPI when using new version of the serialization library
[SVN r65965]
2010-10-14 20:08:27 +00:00
Robert Ramey ea526b4944 added fix_six.cpp to fix 143 problem
[SVN r65503]
2010-09-21 06:34:17 +00:00
Robert Ramey 183e3bafcd documentation correction - especially fix for 1.42/1.43 binary archive problem
[SVN r65499]
2010-09-21 04:41:48 +00:00
Robert Ramey c0050d7558 first increment in concept update
[SVN r65498]
2010-09-21 04:12:28 +00:00
Robert Ramey 51f672f8df use full namespace qualification to try to fix test failure with xml archives
on darwin 4.4 with intel 1.1 compiler

[SVN r65333]
2010-09-07 16:19:45 +00:00
Robert Ramey c0bde7203a reverse overzealous fix for basic_archive checkin
[SVN r64960]
2010-08-23 01:21:35 +00:00
Robert Ramey 1cfc69fb7c fixed STATIC_ASSERT for size of tracking_type - bool
[SVN r64937]
2010-08-20 17:04:59 +00:00
Robert Ramey 7109f65472 added #include for NVP
[SVN r64925]
2010-08-19 15:44:21 +00:00
Robert Ramey f56194f926 removed warning causing superfluous const
[SVN r64910]
2010-08-19 05:36:09 +00:00
Robert Ramey 46a0869f2d fixed inclusion of basic_archive which was causing superfluous dependency
[SVN r64909]
2010-08-19 05:35:29 +00:00
Robert Ramey 440f91b6e5 removed warning causing superfluous const
[SVN r64908]
2010-08-19 05:34:16 +00:00
Robert Ramey 7cc8f7f20a merge final difference to release
[SVN r64555]
2010-08-02 21:43:26 +00:00
Robert Ramey 2b20dfe2b7 change version_type constructor to public
[SVN r64282]
2010-07-23 06:05:30 +00:00
Robert Ramey 51de49cd4d fix for archives version 7 marked version 6
[SVN r64182]
2010-07-19 21:39:34 +00:00
Robert Ramey cecadc1340 fix for archives version 7 marked version 6
[SVN r64181]
2010-07-19 21:38:17 +00:00
Robert Ramey cc0ad4e6c8 fix for archives version 7 marked version 6
[SVN r64178]
2010-07-19 21:00:43 +00:00
Robert Ramey c844b9e39c Fix? for error in library version 6 - version types and class id types
[SVN r64157]
2010-07-19 13:06:32 +00:00
Robert Ramey bf53f0ac3a Fix? for error in library version 6 - version types and class id types
[SVN r64156]
2010-07-19 13:06:09 +00:00
Robert Ramey 46512a36e8 suppress check for strictly increasing version number
[SVN r64131]
2010-07-18 15:55:45 +00:00
Robert Ramey 1bd92a5800 comment out assertion which enforces ODR.
[SVN r64104]
2010-07-17 16:10:09 +00:00
Robert Ramey 5f7824d55a Merge corrections to text based archives for version_type and item_version_type
[SVN r64102]
2010-07-17 16:04:30 +00:00
Robert Ramey 53f9698d21 Merge corrections to text based archives for version_type and item_version_type
[SVN r64101]
2010-07-17 16:03:07 +00:00
Robert Ramey 889c83c34e Correct rendering of version_type in text archives
[SVN r64004]
2010-07-14 01:48:58 +00:00
Robert Ramey 2660621c3a Merge to release
[SVN r63797]
2010-07-09 21:30:08 +00:00
Robert Ramey 7357aa1736 Merge to release
[SVN r63784]
2010-07-09 18:23:21 +00:00
Robert Ramey e30258f8e6 Merge to release
[SVN r63779]
2010-07-09 16:50:03 +00:00
Robert Ramey 951a5caa68 Merge to release
[SVN r63778]
2010-07-09 16:48:52 +00:00
Robert Ramey 083011be03 adjustments to address auto_link issue on MingW
[SVN r63527]
2010-07-02 18:28:34 +00:00
Robert Ramey d22b7501db adjustments to address auto_link issue on MingW
[SVN r63526]
2010-07-02 18:26:55 +00:00
Robert Ramey e730e64b67 attempt to address failures with MingW
[SVN r63395]
2010-06-27 18:47:15 +00:00
Robert Ramey 43641b792f attempt to address failures with MingW
[SVN r63394]
2010-06-27 18:46:39 +00:00
Robert Ramey 17459ea306 Corrections to demos
[SVN r63181]
2010-06-21 06:24:42 +00:00
Robert Ramey c7dd29d2b6 account for fact that on some platforms size of wchar_t > size of short int
[SVN r63085]
2010-06-18 20:32:34 +00:00
Douglas Gregor 79b58f23f8 Include <cmath> where it is needed
[SVN r63073]
2010-06-18 00:15:27 +00:00
Douglas Gregor 0d3a679edd short int might not be large enough to represent all of the values in a wchar_t. Use the integer traits to be sure that we get a type large enough to represent the values of wchar_t
[SVN r63072]
2010-06-18 00:13:28 +00:00
Robert Ramey a09bd1f83a corrected error version_type <- item_version_type
[SVN r62995]
2010-06-15 20:07:27 +00:00
Robert Ramey 570e6b0dba improved diagnostic for failures
[SVN r62855]
2010-06-12 16:03:44 +00:00
Robert Ramey cf3617d933 Improved test failure reporting for class A test class.
[SVN r62807]
2010-06-11 16:24:41 +00:00
Robert Ramey ebb81606ed Removed unused includes
[SVN r62788]
2010-06-11 04:13:56 +00:00
Robert Ramey e3ccce340b fix #3 for version_type
[SVN r62787]
2010-06-11 04:12:45 +00:00
Robert Ramey 0e3a44420e Separated stream exceptions into input/output
[SVN r62786]
2010-06-11 04:11:59 +00:00
Robert Ramey b1d88d1059 fix #3 for version_type
[SVN r62785]
2010-06-11 04:11:22 +00:00
Robert Ramey 2d4c986e88 fix #2 for version_type
[SVN r62546]
2010-06-08 03:26:10 +00:00
Robert Ramey 9bb4b8003c correct version type conversions
[SVN r62451]
2010-06-05 17:12:25 +00:00
Robert Ramey 9ed009c4e6 correction of project settings
[SVN r62432]
2010-06-04 20:20:13 +00:00
Robert Ramey 08ff4b4389 Corrections in hash collections serialization
improved detection of binary archives

[SVN r62431]
2010-06-04 20:19:27 +00:00
Robert Ramey e8ee93c383 Added missing new test
tweaked plugin test for windows

[SVN r62386]
2010-06-02 18:42:11 +00:00
Robert Ramey 32aa5a642b Separate version types into library_version_type, version_type (classes) and item_version_type.
[SVN r62359]
2010-05-31 21:18:44 +00:00
Robert Ramey 1dbe8e1777 Separate version types into library_version_type, version_type (classes) and item_version_type.
[SVN r62358]
2010-05-31 21:17:21 +00:00
Douglas Gregor 038f49b18b Revert my attempt to use collection_size_type/version_type
consistently throughout the serialization library; I need to do so in
a way that maintains archive compatibility.


[SVN r62047]
2010-05-16 21:35:36 +00:00
Douglas Gregor 7d977f68e0 Revert my change to use collection_size_type/version_type throughout
Boost.Serialization; I had missed that this actually changes by binary
format.


[SVN r62032]
2010-05-16 15:39:59 +00:00
Douglas Gregor 73dc16850d Add missing include to get boost::archive::version_type.
[SVN r62014]
2010-05-16 00:05:49 +00:00
Douglas Gregor cfbbf7af09 Merge Boost.Serialization fixes for Boost.MPI (consistent use of
collection_size_type/version_type). Fixes #4214.


[SVN r62003]
2010-05-15 18:09:16 +00:00
Douglas Gregor 9b5a6a8b81 Use collection_size_type/version_type consistently in
Boost.Serialization. This addresses a serious bug in Boost.MPI (see
bug #4214) that causes memory corruption with the skeleton/content
mechanism.


[SVN r62000]
2010-05-15 18:01:45 +00:00
Robert Ramey 6235de4ef9 Fixed problem with portable_binary archives
[SVN r61842]
2010-05-07 17:31:17 +00:00
Robert Ramey 8f459eaeae Attempt to resolve assertion and memory leak for void_cast records
[SVN r61558]
2010-04-25 16:04:52 +00:00
Robert Ramey 07e54b4077 Fix error which results? in subsequent assertion/crash
[SVN r61546]
2010-04-24 18:34:46 +00:00
Robert Ramey c6e7ac852d Fixed TAB
[SVN r61365]
2010-04-18 17:13:42 +00:00
Robert Ramey 8c98a0eb8f changed name from test_plugin to test_dll_plugin
[SVN r61364]
2010-04-18 17:13:17 +00:00
Robert Ramey 696f6c0b59 fixed TAB
[SVN r61363]
2010-04-18 17:12:51 +00:00
Robert Ramey 259aacec8f fixed link
[SVN r61362]
2010-04-18 17:12:47 +00:00
Robert Ramey 566402275a Merge lastest changes to release
[SVN r61094]
2010-04-06 01:58:37 +00:00
Robert Ramey a6fc0ea2b2 Merge last changes to release
[SVN r61093]
2010-04-06 01:55:56 +00:00
Robert Ramey 95f99de1b8 Final changes for 1.43
[SVN r61032]
2010-04-04 00:25:20 +00:00
Robert Ramey f2e6cd2002 Final changes for 1.43
[SVN r61031]
2010-04-04 00:24:38 +00:00
Robert Ramey eaa93b8f00 Final changes for 1.43
[SVN r61030]
2010-04-04 00:23:47 +00:00
Robert Ramey a07cb16f28 Merge trunk to release
[SVN r60484]
2010-03-11 16:43:40 +00:00
Robert Ramey 11cc14d1fa update msvc solution
[SVN r60483]
2010-03-11 16:35:23 +00:00
Robert Ramey d0c8cd746d cosmetic change?
[SVN r60482]
2010-03-11 16:33:41 +00:00
Robert Ramey da7d81a4ec merge trunk to release
[SVN r60481]
2010-03-11 16:31:57 +00:00
Robert Ramey e853dca178 suppress test_plugin as I can't figure out how to get boost build to run it
[SVN r60434]
2010-03-10 18:01:33 +00:00
Robert Ramey 71cddc2dd8 fixed test_exported in Jamfile.v2
[SVN r60374]
2010-03-09 04:39:49 +00:00
Robert Ramey 4a889a110f Merge in changes accidently commited to release branch
[SVN r60370]
2010-03-08 21:45:18 +00:00
Robert Ramey 0ce29f3460 Add simple log demo to documentation
[SVN r60329]
2010-03-07 20:38:22 +00:00
Robert Ramey 665fed2353 update singleton documentation
[SVN r60328]
2010-03-07 20:37:43 +00:00
Robert Ramey 8abb0e5569 removed demo_dll and fixed demo_log_archive
[SVN r60321]
2010-03-07 19:00:15 +00:00
Robert Ramey 11ce59ca28 update vc7 ide projects & solution
[SVN r60278]
2010-03-07 03:15:13 +00:00
Robert Ramey 4184e23788 update tests for latest changes
[SVN r60277]
2010-03-07 03:13:32 +00:00
Robert Ramey e52fea3cd2 Add not regarding problems with DLL version of library
[SVN r60276]
2010-03-07 02:53:46 +00:00
Robert Ramey 5d3200e592 Add new demos for log_archive, simple_log_archive and trivial_archive
[SVN r60275]
2010-03-07 02:53:05 +00:00
Robert Ramey c55a87b323 fix to permit shared_ptr from this to work
[SVN r60274]
2010-03-07 02:46:13 +00:00
Robert Ramey 77c54c0f18 Suppress multiple definition trap
[SVN r60273]
2010-03-07 02:43:17 +00:00
Robert Ramey 508b43539d change variable name from "id" to "cid" to work around conflict with apple header
[SVN r60272]
2010-03-07 02:43:01 +00:00
Robert Ramey 740211876a improve documentation
a) enhance explanation of DLLS
b) include demo for trivial archive and demo (simple log archive)
c) fix explanation of archive derivation and demo (log archive)


[SVN r60271]
2010-03-07 02:41:12 +00:00
Robert Ramey dacc9b87b6 Limit class versions to 8 bits
[SVN r60270]
2010-03-07 02:38:52 +00:00
Robert Ramey 175058cc8d fix error in include guid_defined
[SVN r60269]
2010-03-07 02:38:29 +00:00
Robert Ramey 383e90a67b improve portability for 64 bit integers
[SVN r60268]
2010-03-07 02:37:54 +00:00
Robert Ramey cf5bb5eba4 remove unnecessary includes
[SVN r60267]
2010-03-07 02:37:00 +00:00
Robert Ramey af48e0350b improve portability for 64 bit integers
[SVN r60266]
2010-03-07 02:35:56 +00:00
Robert Ramey 41f4a5702d Suppress multiple definition trap
[SVN r60265]
2010-03-07 02:35:30 +00:00
Robert Ramey 22f86b7bf5 fix to permit shared_ptr from this to work
[SVN r60264]
2010-03-07 02:33:11 +00:00
Robert Ramey 62bf9b486c improve portability for 64 bit integers
[SVN r60261]
2010-03-07 02:12:51 +00:00
Robert Ramey 46f4b7d7c2 move recent changes to release branch
[SVN r59943]
2010-02-26 05:29:59 +00:00
Robert Ramey 7646d1fdc8 move recent changes to release branch
[SVN r59942]
2010-02-26 05:28:56 +00:00
Robert Ramey 33f8836109 move recent changes to release branch
[SVN r59941]
2010-02-26 05:17:31 +00:00
Robert Ramey 1a51354162 move recent changes to release branch
[SVN r59940]
2010-02-26 05:08:08 +00:00
Robert Ramey 9c63cff46c delete superflous "include map"
[SVN r59836]
2010-02-22 05:02:37 +00:00
Robert Ramey 1974409df4 include export.hpp
[SVN r59835]
2010-02-22 05:01:58 +00:00
Robert Ramey 8cd49c1007 fix gcc warnings
[SVN r59834]
2010-02-22 05:00:57 +00:00
Robert Ramey c39233ff52 change to avoid ">>" syntax error when passed a template instance
[SVN r59701]
2010-02-16 17:00:48 +00:00
Robert Ramey cf0b272984 added copyright notices
[SVN r59461]
2010-02-03 21:47:58 +00:00
Robert Ramey 699061541c address const T * serialization
[SVN r59460]
2010-02-03 21:45:13 +00:00
Robert Ramey 64421c49ac correction in version example
[SVN r59459]
2010-02-03 21:44:12 +00:00
Robert Ramey 9a72b6c928 Miscelleaneous documentation corrections
[SVN r59458]
2010-02-03 21:43:26 +00:00
Robert Ramey 61cb57079e change "void inline" to "inline void" on older gcc compilers
[SVN r59457]
2010-02-03 21:36:18 +00:00
Robert Ramey eb24743449 Added comment regarding intentional anonymous namespace in header
[SVN r59456]
2010-02-03 21:34:34 +00:00
Robert Ramey a92769db42 address const T * serialization
[SVN r59455]
2010-02-03 21:33:20 +00:00
Robert Ramey d36ca3d5d1 Fix error on unregistered class exception
[SVN r59454]
2010-02-03 21:33:02 +00:00
Robert Ramey ae15fe212b address const T * serialization
[SVN r59453]
2010-02-03 21:32:14 +00:00
Robert Ramey bc5cd95615 Fix plugin test/demo
[SVN r58519]
2009-12-23 18:29:49 +00:00
Robert Ramey 8a9193f4a5 Fix plugin test/demo
[SVN r58518]
2009-12-23 18:28:48 +00:00
Jürgen Hunold 42e859eb24 Fix tests by re-adding missing "compile" rule.
[SVN r58512]
2009-12-23 13:35:25 +00:00
Robert Ramey c01113966d Fix plugin test/demo
[SVN r58508]
2009-12-23 07:23:08 +00:00
Robert Ramey ddc987ca75 Fix plugin test/demo
[SVN r58507]
2009-12-23 07:22:12 +00:00
Robert Ramey 261922188d Fix plugin test/demo
[SVN r58506]
2009-12-23 07:21:05 +00:00
Robert Ramey 3205d38e82 Fix plugin test/demo
[SVN r58505]
2009-12-23 07:20:49 +00:00
Robert Ramey 584e306b3e Merge from trunk to release
[SVN r58391]
2009-12-14 23:53:16 +00:00
Robert Ramey 43d310416b Merge from trunk to release
[SVN r58390]
2009-12-14 23:52:51 +00:00
Robert Ramey be26dfbcf9 Merge from trunk to release
[SVN r58389]
2009-12-14 23:48:21 +00:00
Robert Ramey 5ec245588c Adjustment in project properties
[SVN r58388]
2009-12-14 23:38:03 +00:00
Robert Ramey 8d0aeda360 Include build for maximum performance
[SVN r58361]
2009-12-13 17:46:20 +00:00
Robert Ramey 16aef9c78d Remove superfluous link
[SVN r58360]
2009-12-13 17:45:19 +00:00
Robert Ramey af094df01f Speed up loading of ordered collections
[SVN r58359]
2009-12-13 17:44:23 +00:00
Robert Ramey a6e82c34f9 Change code to avoid warning
[SVN r58358]
2009-12-13 17:43:50 +00:00
Robert Ramey 14fb2f69b7 tweak demo example
[SVN r58305]
2009-12-11 22:32:41 +00:00
Robert Ramey a15282a3cc Update VCIDE files
[SVN r58304]
2009-12-11 22:31:42 +00:00
Robert Ramey fa93314e1b Call dtor through serialization::access in order to permit private dtors/ctors
[SVN r58296]
2009-12-11 19:32:30 +00:00
Robert Ramey 26490f7fa1 1. Fixed memory leak in shared_ptr loading
2. Fixed error in polymorphic archive implementation

[SVN r58271]
2009-12-10 17:42:29 +00:00
Robert Ramey 4773b7d2a2 1. Fixed memory leak in shared_ptr loading
2. Fixed error in polymorphic archive implementation

[SVN r58258]
2009-12-10 00:30:51 +00:00
Robert Ramey a94e39ed5d 1. Fixed memory leak in shared_ptr loading
2. Fixed error in polymorphic archive implementation

[SVN r58257]
2009-12-10 00:30:06 +00:00
Robert Ramey 4d360d1082 Merge changes to release branch
[SVN r58151]
2009-12-05 06:34:10 +00:00
Robert Ramey 207f3e5ffa Merge changes to release branch
[SVN r58150]
2009-12-05 06:32:49 +00:00
Robert Ramey 5e8f1456d1 Merge changes to release branch
[SVN r58149]
2009-12-05 06:32:01 +00:00
Robert Ramey 10d94a6c82 tweak msvc solution
[SVN r58147]
2009-12-04 22:15:56 +00:00
Robert Ramey 675b0b07d4 (yet) another fix for void cast pointer
[SVN r58026]
2009-11-29 07:32:53 +00:00
Robert Ramey ac989955c8 Backout collection_type primitive. Problem showed in in tests of 64 bit compilers
tweak jamfile to supress long-long warnings in gcc


[SVN r58025]
2009-11-29 06:33:35 +00:00
Robert Ramey e25add3e4c Backout collection_type primitive. Problem showed in in tests of 64 bit compilers
[SVN r58024]
2009-11-29 06:32:32 +00:00
Robert Ramey b26df8e96b Fix memory leaks in void_caster short cut memory leaks
[SVN r58020]
2009-11-28 22:18:00 +00:00
Robert Ramey 9c65df78a1 documentation fixes
[SVN r58019]
2009-11-28 22:16:48 +00:00
Robert Ramey 1eb3039d6e documentation fixes
[SVN r58018]
2009-11-28 22:16:18 +00:00
Robert Ramey cd79c5a02e fixed BOOST_STATIC_WARNING implementation macro name conflict
[SVN r57987]
2009-11-27 22:32:28 +00:00
Robert Ramey 787e239ba6 tweaked demo_polymorphic example
[SVN r57985]
2009-11-27 22:17:03 +00:00
Robert Ramey 5699f26aac changes to minimize warnings in library build
[SVN r57982]
2009-11-27 21:25:18 +00:00
Robert Ramey c728eb8658 changes to minimize warnings in library build
[SVN r57981]
2009-11-27 21:24:07 +00:00
Robert Ramey 35bd0f12dc suppress MSVC "deprecated" and "unsafe" warnings
[SVN r57705]
2009-11-16 16:22:38 +00:00
Robert Ramey 09bf7cb705 Revert changes intended for trunk
[SVN r57701]
2009-11-16 05:32:31 +00:00
Robert Ramey 1f49950d27 Revert changes intended for trunk
[SVN r57700]
2009-11-16 05:29:21 +00:00
Robert Ramey 9330f6f7ca Revert changes target for trunk
[SVN r57699]
2009-11-16 05:27:58 +00:00
Robert Ramey 9bcaba922c Fixed warnings at highest warning level
[SVN r57698]
2009-11-16 05:17:25 +00:00
Robert Ramey c61537a7dd Fixed warnings at highest warning level
[SVN r57697]
2009-11-16 05:16:51 +00:00
Robert Ramey a145a34048 Fixed warnings at highest warning level
[SVN r57667]
2009-11-15 00:37:15 +00:00
Robert Ramey ec41f28599 Fixed warnings at highest warning level
[SVN r57666]
2009-11-15 00:36:36 +00:00
Robert Ramey f422247e15 Fixes for minor and/or obscure bugs
[SVN r57136]
2009-10-24 16:18:38 +00:00
Robert Ramey 9f32d335a0 Fixes for minor and/or obscure bugs
[SVN r57134]
2009-10-24 16:07:47 +00:00
Troy D. Straszheim 1545aeb160 rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
Troy D. Straszheim f0a7a8e6cf rm cmake from the release branch before it goes out broken. Policy dictates that you never commit to release, you commit to trunk and merge to release.
[SVN r56941]
2009-10-17 01:10:45 +00:00
Robert Ramey 98af5f7b9e add non-polymorphic pointer test
[SVN r56924]
2009-10-16 15:53:52 +00:00
Robert Ramey 985ba4ac48 Fix problem with multiple declaration of void_cast_register
[SVN r56833]
2009-10-14 16:36:04 +00:00
Robert Ramey ba23d735db Address SUN compiler pickiness
[SVN r56798]
2009-10-13 19:33:50 +00:00
Robert Ramey a60741308f Make compatible with version 1.41
[SVN r56741]
2009-10-12 16:31:50 +00:00
Robert Ramey 8aaf2b217e Address complaints for Inspect
[SVN r56740]
2009-10-12 16:30:44 +00:00
Robert Ramey eed171443d Eliminate redundancy
[SVN r56739]
2009-10-12 16:29:37 +00:00
Robert Ramey 54768d0dda fix memory leaks
[SVN r56738]
2009-10-12 16:29:03 +00:00
Robert Ramey 39d054261a Address complaints for Inspect
[SVN r56737]
2009-10-12 16:28:39 +00:00
Robert Ramey 6f9eb2acf6 Address complaints for Inspect
[SVN r56736]
2009-10-12 16:28:04 +00:00
Robert Ramey 454a2e9808 fix memory leaks
[SVN r56735]
2009-10-12 16:27:05 +00:00
Robert Ramey 5dda14666b Address complaints for Inspect
[SVN r56734]
2009-10-12 16:26:47 +00:00
Robert Ramey f2bd611587 Merge trunk to release
[SVN r56317]
2009-09-20 02:18:42 +00:00
Robert Ramey 56daebbd49 Merge trunk to release
[SVN r56316]
2009-09-20 02:18:02 +00:00
Robert Ramey a55637d91e fixed extra ' in files
[SVN r56275]
2009-09-17 15:37:42 +00:00
Robert Ramey 7802ccb7b1 Added missing test
[SVN r56243]
2009-09-16 15:24:42 +00:00
Robert Ramey 75f74bf895 Updated documentation to explain compile-time errors and warnings
[SVN r56241]
2009-09-16 04:49:20 +00:00
Robert Ramey 0f6e023021 Updated documention to explain compile-time errors and warnings
[SVN r56240]
2009-09-16 04:45:24 +00:00
Robert Ramey a68aed6e1e Formalize compiler time errors and warnings
[SVN r56225]
2009-09-15 20:24:09 +00:00
Robert Ramey d5cdd7e294 Formalize compiler time errors and warnings
[SVN r56224]
2009-09-15 20:23:51 +00:00
Robert Ramey 53c2e23a29 Formalize compiler time errors and warnings
[SVN r56223]
2009-09-15 20:22:49 +00:00
Robert Ramey aee1d6591c Formalize compiler time errors and warnings
fix archive_exception conflict with windows header
improve portability of codecvt_null

[SVN r56222]
2009-09-15 20:21:32 +00:00
Robert Ramey f5cf1ee638 Formalize compiler time errors and warnings
[SVN r56221]
2009-09-15 20:12:47 +00:00
Robert Ramey 0a4bb11b4f enhanced test
[SVN r56149]
2009-09-11 17:58:57 +00:00
Robert Ramey dae9e76c17 reimplemented BOOST_STATIC_WARNING to depend on boost::mpl::print
[SVN r56148]
2009-09-11 17:55:27 +00:00
Robert Ramey 4ca7dfddab moved code from header to library to reduce code bloat
[SVN r55791]
2009-08-26 20:47:01 +00:00
Robert Ramey a2bdcadc44 moved code from header to library to reduce code bloat
[SVN r55790]
2009-08-26 20:45:13 +00:00
Robert Ramey f4ad78b5e5 moved code from header to library to reduce code bloat
[SVN r55789]
2009-08-26 20:44:55 +00:00
Robert Ramey c1cd63ea0e fixed bug in load(wchar *)
[SVN r55788]
2009-08-26 20:42:43 +00:00
Robert Ramey 6c65cb5e89 fix accidental include
[SVN r55763]
2009-08-24 15:40:43 +00:00
Robert Ramey 16e1e7d8ca Refine documentation for EXPORT
Refine documentation for extended_type_info.html

[SVN r55743]
2009-08-23 21:50:53 +00:00
Robert Ramey a42b068bd6 Improved implemenation of boost_serializer_map
Improved support for serialization of types in DLLS
New exception for violations of ODR when using DLLS
Fix error in recent update of export.hpp
Added class names to exception messages

[SVN r55738]
2009-08-23 19:27:10 +00:00
Robert Ramey 413d3b1c40 Improved implemenation of boost_serializer_map
Improved support for serialization of types in DLLS
New exception for violations of ODR when using DLLS
Fix error in recent update of export.hpp
Added class names to exception messages

[SVN r55737]
2009-08-23 19:26:12 +00:00
Robert Ramey d4db601f5c Improved implemenation of boost_serializer_map
Improved support for serialization of types in DLLS
New exception for violations of ODR when using DLLS
Fix error in recent update of export.hpp

[SVN r55736]
2009-08-23 19:25:26 +00:00
Robert Ramey 8ed0a2bb54 remove "non_convertible" header.
[SVN r55687]
2009-08-20 17:19:08 +00:00
Robert Ramey 9c47525123 correct error in exception handling
[SVN r55678]
2009-08-20 05:38:50 +00:00
Robert Ramey d2ac132266 Include warning when serialization pointers with implementation level set to "object_serializable" with tracking set to "track_selectively"
[SVN r55677]
2009-08-20 05:36:16 +00:00
Robert Ramey 1100ce5678 Fix error in export functionality:
a) set key when etf record is constructed.
b) make corrections in no_rtti type system
c) make no_rtti type system more robust and self-diagnosing

[SVN r55676]
2009-08-20 05:32:59 +00:00
Robert Ramey 532db55bb3 Fix error in export functionality:
a) set key when etf record is constructed.
b) make corrections in no_rtti type system
c) make no_rtti type system more robust and self-diagnosing

[SVN r55675]
2009-08-20 05:32:13 +00:00
David Deakins a1d25c5a56 Even though Windows CE has BOOST_NO_STDC_NAMESPACE defined (since STLport doesn't always move everything to std::), numeric_limits and w_int are not in the global namespace.
[SVN r55584]
2009-08-14 17:06:30 +00:00
Robert Ramey d9cc387f9f Updated release notes to include information of modified headers for those making their own archives.
[SVN r55570]
2009-08-13 16:51:00 +00:00
Robert Ramey 682c57e1f4 update release notes
[SVN r55450]
2009-08-07 18:39:26 +00:00
Robert Ramey d4f0d887bb suppressed warning_check which creates warns in too many cases
[SVN r55435]
2009-08-06 20:07:42 +00:00
Robert Ramey 690652f8ce Fixed test again
[SVN r55420]
2009-08-05 16:39:42 +00:00
Matthias Troyer 0d1c34af41 Fixed ticket 2271
[SVN r55415]
2009-08-04 23:00:10 +00:00
Robert Ramey 8e6db3ac7b Add acknowledgments for Cadence and Autoform
[SVN r55414]
2009-08-04 22:20:08 +00:00
Robert Ramey dfbc408f2d Minor adjustments projects
[SVN r55413]
2009-08-04 21:52:05 +00:00
Robert Ramey dafa8cede3 Fix test so that it doesn't emit warning
[SVN r55412]
2009-08-04 21:51:05 +00:00
Robert Ramey 168d720a85 Included mpl code to emit static warning when the following occurs:
a) type saved as a pointer_oserializer
b) type tracking is set to "track_selectively
c) type information is not included in the archive (implementation level is set to object serializable or lower


[SVN r55411]
2009-08-04 21:49:34 +00:00
Robert Ramey 17cf7cd063 Changed comment to reflect update
[SVN r55410]
2009-08-04 21:45:44 +00:00
Matthias Troyer 3fde9b2e80 Collection sizes are now seriallized as std::size_t
[SVN r55395]
2009-08-04 00:56:19 +00:00
Robert Ramey d104be292a fixed type in has new macro
[SVN r55358]
2009-08-02 05:58:42 +00:00
Robert Ramey 8614ed9bcb Merge trunk to release
[SVN r55351]
2009-08-01 23:32:39 +00:00
Robert Ramey e8d8d44405 Merge trunk to release
[SVN r55350]
2009-08-01 23:32:25 +00:00
Robert Ramey 323b67cc17 Merge trunk to release
[SVN r55349]
2009-08-01 23:32:13 +00:00
Robert Ramey e6c2b6defa Adjustment to documentation for movement serialization directory
[SVN r55348]
2009-08-01 23:14:43 +00:00
Robert Ramey 1203150f5e Fix test_no_rtti test
extended_type_info system not based on type_id

[SVN r55326]
2009-07-31 21:06:32 +00:00
Robert Ramey 770f6ee7d2 Fix test_no_rtti test
extended_type_info system not based on type_id

[SVN r55325]
2009-07-31 21:04:56 +00:00
Robert Ramey 3274bab1c9 Fix test_no_rtti test
extended_type_info system not based on type_id

[SVN r55324]
2009-07-31 21:02:48 +00:00
Robert Ramey 8dd591e640 add register archive
[SVN r55323]
2009-07-31 21:02:06 +00:00
Robert Ramey d1e6d00742 Fix test_no_rtti test
extended_type_info system not based on type_id

[SVN r55322]
2009-07-31 21:00:49 +00:00
Robert Ramey 55c334c72e Fix test_no_rtti test
extended_type_info system not based on type_id

[SVN r55321]
2009-07-31 20:59:57 +00:00
Troy D. Straszheim 2c01069b6a Copyrights on CMakeLists.txt to keep them from clogging up the inspect
reports.  This is essentially the same commit as r55095 on the release
branch.



[SVN r55159]
2009-07-26 00:49:56 +00:00
Troy D. Straszheim 0332a80302 Add basic copyright/license to keep cmake out of the inspection report
[SVN r55095]
2009-07-22 21:51:01 +00:00
Robert Ramey 5d0fe132cb Fix void_cast unregister - again!
[SVN r55021]
2009-07-18 19:15:20 +00:00
Robert Ramey dceae5e37d Fix void_cast unregister - again!
[SVN r55020]
2009-07-18 19:14:36 +00:00
Jürgen Hunold 2053627f7a Revert 54974 due to different fix in 54985
[SVN r54993]
2009-07-17 09:10:04 +00:00
Robert Ramey 877863b27f Fix test dll exported
[SVN r54992]
2009-07-17 04:58:42 +00:00
Robert Ramey 21bdd6f441 eliminate MSVC runtime trap when assign short to char
[SVN r54988]
2009-07-16 21:22:20 +00:00
Robert Ramey 0c254d83f8 Update VC7IDE projects
[SVN r54987]
2009-07-16 21:21:27 +00:00
Robert Ramey 3691e8eea4 Fix test dll exported
[SVN r54986]
2009-07-16 21:19:47 +00:00
Robert Ramey 5df107a6ae Fix gcc warning
[SVN r54985]
2009-07-16 21:18:58 +00:00
Robert Ramey 646c887412 Fix test dll exported
[SVN r54984]
2009-07-16 21:17:15 +00:00
Jürgen Hunold ff44a5ed88 Fix gcc -Wreorder warning.
[SVN r54974]
2009-07-15 20:51:16 +00:00
Robert Ramey 22a0e3be11 Fixing error - pure virtual function call
[SVN r54964]
2009-07-15 06:49:35 +00:00
Robert Ramey a5b5e53b8e Fixing error - pure virtual function call
[SVN r54963]
2009-07-15 06:47:03 +00:00
Robert Ramey ae5bbe92d0 Fixing error - pure virtual function call
[SVN r54962]
2009-07-15 06:45:56 +00:00
Robert Ramey 3923751555 Adjustment of test to header
[SVN r54961]
2009-07-15 06:45:13 +00:00
Robert Ramey b0a32ca65f Add missing header include
[SVN r54960]
2009-07-15 06:44:25 +00:00
Robert Ramey 68879eade4 Fixing error - pure virtual function call
[SVN r54959]
2009-07-15 06:43:14 +00:00
Robert Ramey 62d01311dc Fixing error - pure virtual function call
[SVN r54958]
2009-07-15 06:42:43 +00:00
Robert Ramey 7e12f64e7a Fixing error - pure virtual function call
[SVN r54957]
2009-07-15 06:42:12 +00:00
Robert Ramey ee4afb691a Simplification for pointer serialization
Correct error in exported pointers for polymorphic archives

[SVN r54938]
2009-07-13 21:47:37 +00:00
Robert Ramey c3a04751e0 Simplification for pointer serialization
Correct error in exported pointers for polymorphic archives

[SVN r54937]
2009-07-13 21:43:30 +00:00
Robert Ramey a15e0eb5b6 Simplification for pointer serialization
Correct error in exported pointers for polymorphic archives

[SVN r54936]
2009-07-13 21:42:14 +00:00
Robert Ramey 068700bd5a Simplification for pointer serialization
Correct error in exported pointers for polymorphic archives

[SVN r54935]
2009-07-13 21:40:15 +00:00
Robert Ramey f304becdeb Simplification for pointer serialization
Correct error in exported pointers for polymorphic archives

[SVN r54934]
2009-07-13 21:37:49 +00:00
Hartmut Kaiser 34de2958f9 Serialization: added missing header file #include
[SVN r54861]
2009-07-10 16:00:03 +00:00
Robert Ramey 250af1cee4 fix typo
[SVN r54829]
2009-07-09 04:07:19 +00:00
Robert Ramey 650534788a Fix invalid pointer in unregister cast in void_cast.cpp - Again !!
[SVN r54823]
2009-07-08 23:09:29 +00:00
Robert Ramey 767a09d95b Fix error for platorms which don't use decl
[SVN r54822]
2009-07-08 22:56:38 +00:00
Robert Ramey 436553a60d Fix invalid pointer in unregister cast in void_cast.cpp
[SVN r54821]
2009-07-08 22:55:36 +00:00
Robert Ramey 9ba768af1d Fix invalid pointer in unregister cast in void_cast.cpp
[SVN r54820]
2009-07-08 22:53:22 +00:00
Robert Ramey 7c23d146cd fixed archive_pointer_?serializer
[SVN r54798]
2009-07-08 16:30:38 +00:00
Robert Ramey e1c6005570 Changes to address failure same object in two different DLLS is serialized via a pointer
[SVN r54784]
2009-07-07 21:56:48 +00:00
Robert Ramey 6f1d243191 Changes to address failure same object in two different DLLS is serialized via a pointer
[SVN r54783]
2009-07-07 21:56:18 +00:00
Robert Ramey 91a1214de0 Fixed misc bugs
Added missing test
void cast
added dll tests
simplified VC7IDE configurations and set up test for DLLS

[SVN r54775]
2009-07-07 17:57:23 +00:00
Robert Ramey 4ebd9d820a Fixed misc bugs
void cast
added dll tests
simplified VC7IDE configurations and set up test for DLLS

[SVN r54758]
2009-07-07 04:09:13 +00:00
Robert Ramey 282057729e Fixed misc bugs
void cast
added dll tests
simplified VC7IDE configurations and set up test for DLLS

[SVN r54757]
2009-07-07 04:08:30 +00:00
Robert Ramey 2c9369177e Fixed misc bugs
void cast
added dll tests
simplified VC7IDE configurations and set up test for DLLS

[SVN r54756]
2009-07-07 04:06:29 +00:00
Robert Ramey 702cb3dbd2 Fixed misc bugs
void cast
added dll tests

[SVN r54755]
2009-07-07 04:04:18 +00:00
Robert Ramey 0fbc30ac29 Fixed misc bugs
void cast
added dll tests

[SVN r54754]
2009-07-07 04:01:59 +00:00
Robert Ramey 63f774a066 Fixed misc bugs
void cast
added dll tests

[SVN r54753]
2009-07-07 04:01:07 +00:00
Robert Ramey 41b467d2fc Fixed misc bugs
[SVN r54752]
2009-07-07 04:00:10 +00:00
Daniel James dc57e3232a Fix a couple of links to serialization headers. Refs #3062.
Merged revisions 53313 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

........
  r53313 | danieljames | 2009-05-27 18:43:36 +0100 (Wed, 27 May 2009) | 1 line
  
  Fix a couple of links to serialization headers.
........


[SVN r54397]
2009-06-27 07:21:36 +00:00
Daniel James 72f5c44b60 Remove unused headers from boost directory. Fixes #3062.
Merged revisions 50645,53756 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

........
  r50645 | ramey | 2009-01-16 21:15:25 +0000 (Fri, 16 Jan 2009) | 1 line
  
  remove unused headers from boost directory
........
  r53756 | danieljames | 2009-06-08 20:30:20 +0100 (Mon, 08 Jun 2009) | 1 line
  
  Update include from boost/pfto.hpp to boost/serialization/pfto.hpp. Refs #3062.
........


[SVN r53758]
2009-06-08 19:51:20 +00:00
Daniel James 05549a7299 Update include from boost/pfto.hpp to boost/serialization/pfto.hpp. Refs #3062.
[SVN r53756]
2009-06-08 19:30:20 +00:00
Daniel James 555c0fdecb Fix a couple of links to serialization headers. Refs #3602.
[SVN r53313]
2009-05-27 17:43:36 +00:00
Jeremiah Willcock e3478e277e Fixed almost all tab and min/max issues found by inspect tool
[SVN r53142]
2009-05-20 19:41:20 +00:00
Jeremiah Willcock 3ba89eda66 Fixed most tab and min/max issues from trunk inspection report
[SVN r53141]
2009-05-20 19:19:00 +00:00
Robert Ramey e7be2611a4 add test for private/protected inheritance
[SVN r53080]
2009-05-18 06:28:08 +00:00
Robert Ramey e7039f7b67 add test for protected inheritance
[SVN r53079]
2009-05-18 06:27:16 +00:00
Robert Ramey e381b1cf4e fix errors in extended_type_info management
[SVN r53078]
2009-05-18 06:25:56 +00:00
Robert Ramey 9288793f98 correct construction forwarder arguments
[SVN r53077]
2009-05-18 06:24:18 +00:00
Robert Ramey 9a62d7cb7c change number of bits from unsigned int to std::size_t
[SVN r53076]
2009-05-18 06:23:23 +00:00
Robert Ramey e0e39242b9 permit protected inheritance of serialization
[SVN r53075]
2009-05-18 06:22:29 +00:00
Vladimir Prus 4cdf1fb779 Merge: fix for missing inline on boost::serialization::throw_exception.
[SVN r53052]
2009-05-16 16:21:32 +00:00
Douglas Gregor b2e0023850 Fix serialization tests with CMake
[SVN r52894]
2009-05-11 03:29:54 +00:00
Troy D. Straszheim 54ee54aac5 Merge cmake files release -> trunk.
[SVN r52866]
2009-05-09 22:57:30 +00:00
Douglas Gregor 1d2265ad7d Fix CMake tests for the serialization library, hopefully for real this time
[SVN r52845]
2009-05-08 00:22:19 +00:00
Douglas Gregor 073de38daf Try to fix CMake testing for the Serialiation library
[SVN r52844]
2009-05-07 23:56:23 +00:00
Robert Ramey 406df28ee7 fix for error in handling compilers which don't handle has_new_operator
[SVN r52713]
2009-05-01 22:52:33 +00:00
Robert Ramey d0e6b436c7 fixed const in bitset
[SVN r52701]
2009-05-01 16:15:21 +00:00
Robert Ramey 5ee6792fcc Added test_bitset.cpp source
[SVN r52653]
2009-04-28 17:32:28 +00:00
Robert Ramey c541de464d Add tests for std::bitset
[SVN r52642]
2009-04-27 23:13:45 +00:00
Robert Ramey 1d6ccac54e Add tests for std::bitset
[SVN r52641]
2009-04-27 23:13:05 +00:00
Robert Ramey 6adbf03e2a Add tests for std::bitset
[SVN r52640]
2009-04-27 23:12:28 +00:00
Robert Ramey 595f59fc22 Delete redundant forward class declarations
[SVN r52639]
2009-04-27 23:11:53 +00:00
Robert Ramey cb88af1aaa Correct logic when exception is thrown
[SVN r52638]
2009-04-27 23:10:25 +00:00
Robert Ramey 6ff6313b90 Add support for std::bitset.hpp
[SVN r52637]
2009-04-27 23:08:54 +00:00
Robert Ramey 8c471af32d Correct logic for enabling THROW_EXCEPTION
[SVN r52636]
2009-04-27 23:08:32 +00:00
Robert Ramey 3b747c6829 Correct USE_NEW_OPERATOR logic for borland
[SVN r52635]
2009-04-27 23:07:22 +00:00
Vladimir Prus 0bf096ad8d Add missing 'inline'. Don't include <exception> when excepetions are disabled.
[SVN r52559]
2009-04-23 11:11:24 +00:00
Robert Ramey ec8494e6cd Merge changes from trunk to release
[SVN r52111]
2009-04-01 16:12:12 +00:00
Robert Ramey 3489b47242 Merge changes from trunk to release
[SVN r52109]
2009-04-01 16:02:32 +00:00
Robert Ramey 6d14a882bc Merge changes from trunk to release
[SVN r52107]
2009-04-01 15:58:26 +00:00
David Deakins a3f1eb6fa8 For STLport on WinCE, BOOST_NO_STDC_NAMESPACE can get defined if STLport is putting symbols in its own namespace. In the case of codecvt, however, this does not mean that codecvt is in the global namespace (it will be in STLport's namespace).
[SVN r52105]
2009-04-01 14:50:50 +00:00
Robert Ramey 70ae78bee2 adjustment to address borland failure
[SVN r52056]
2009-03-30 15:50:06 +00:00
Robert Ramey 74cbdfa5da adjusted usage of has_new_operator
[SVN r51991]
2009-03-26 18:49:18 +00:00
Robert Ramey de46678177 permit new operator overload
[SVN r51981]
2009-03-26 02:02:17 +00:00
Robert Ramey 221fbce4f0 permit new operator overload
[SVN r51980]
2009-03-26 02:01:43 +00:00
Robert Ramey cb772bf753 moved to type traits
[SVN r51947]
2009-03-23 18:48:51 +00:00
Robert Ramey 23240a500e corrections for some SUN compilers
[SVN r51946]
2009-03-23 17:55:51 +00:00
Robert Ramey b310c34107 correction for some SUN compilers
[SVN r51945]
2009-03-23 17:54:49 +00:00
Robert Ramey a65b2675f3 Document new exceptions
[SVN r51943]
2009-03-23 17:00:33 +00:00
Robert Ramey e6c5696e07 fix static warning when /Za option is used with MSVC
[SVN r51942]
2009-03-23 16:59:46 +00:00
Robert Ramey bf9fe541c5 Throw new exception when program class version is less than file class version.
Other miscellaneous improvements


[SVN r51941]
2009-03-23 16:59:07 +00:00
Robert Ramey f7c9d4d0c2 fix for virtual base classes
[SVN r51906]
2009-03-22 19:07:34 +00:00
Robert Ramey 53495e8dec fix for virtual base classes
[SVN r51905]
2009-03-22 19:06:55 +00:00
Robert Ramey c1039b5b33 const correctness
[SVN r51904]
2009-03-22 19:05:10 +00:00
Robert Ramey f74bd93a97 Use new is_virtual_base_of
[SVN r51769]
2009-03-14 06:12:58 +00:00
Robert Ramey b9982ed14d Try new version of is_virtual_base_of.hpp
Back recent change to work around issue.
Check result of intel compiler compile

[SVN r51744]
2009-03-13 05:31:53 +00:00
Robert Ramey df28702b7c changes to support virtual base class serialization
[SVN r51692]
2009-03-11 02:19:57 +00:00
Robert Ramey e6d6d851fd changed int to long unsigned int to accomodate 64 bit compilers
[SVN r51691]
2009-03-10 20:37:26 +00:00
Robert Ramey 119c47922f checked in new type trait - is_virtual_base_of.hpp
changes to speed up void cast

[SVN r51676]
2009-03-09 23:41:43 +00:00
Robert Ramey 9ac859a72c Updated VC IDE properties to look for version 1.39 libraries
[SVN r51675]
2009-03-09 23:40:18 +00:00
Robert Ramey c4424d897a checked in new type trait - is_virtual_base_of.hpp
changes to speed up void cast

[SVN r51674]
2009-03-09 23:38:38 +00:00
Robert Ramey 93342f3d29 permit start/end load/save to be overridable
[SVN r51361]
2009-02-21 07:35:31 +00:00
Robert Ramey 9deb10a819 fixed namespace
[SVN r51360]
2009-02-21 07:34:26 +00:00
Robert Ramey ed62fb8921 Correction to extended_type_info implementation
[SVN r51331]
2009-02-19 16:07:55 +00:00
Robert Ramey 75f89c8043 Adjustment to support export for SUN
Correction to extended_type_info implementation

[SVN r51330]
2009-02-19 16:07:16 +00:00
Robert Ramey 7ae97a68c3 Added Tips An Tricks section
[SVN r51329]
2009-02-19 16:04:58 +00:00
Troy D. Straszheim 005bf3051b merge of cmake build files from trunk per beman
[SVN r50756]
2009-01-24 18:57:20 +00:00
Robert Ramey a4984c40a6 remove unused headers from boost directory
[SVN r50645]
2009-01-16 21:15:25 +00:00
Robert Ramey c3d762e168 Merge serialization library from trunk into release branch
[SVN r50644]
2009-01-16 21:11:57 +00:00
Robert Ramey 07e02d371c Divided test_no_rtti into separate compilation units
[SVN r50622]
2009-01-16 06:41:52 +00:00
Robert Ramey 5403c2df35 fixed instantiation of exports for gcc compilers
[SVN r50604]
2009-01-15 07:16:43 +00:00
Robert Ramey 75efaa1fd9 added 1.37 release info
[SVN r50567]
2009-01-13 20:18:43 +00:00
Robert Ramey 716b6e0efc merged from release branch
[SVN r50564]
2009-01-13 17:06:46 +00:00
Robert Ramey 55fb1ab317 drop iarchive/oarchive from project
[SVN r50550]
2009-01-12 06:26:35 +00:00
Robert Ramey 79a3ea4e3a include wcslen and w_int in global namespace
[SVN r50549]
2009-01-12 06:25:48 +00:00
Robert Ramey 32b4d852d6 Make destruction of static objects even more bullet proof
[SVN r50548]
2009-01-12 06:24:03 +00:00
Robert Ramey aaa702db8f Backed out changes.
Ignore deprecated warning.
Leave compatibility with 1.6x

[SVN r50547]
2009-01-12 06:22:46 +00:00
Robert Ramey 70b9294cba unique naming for export instantiation
[SVN r50546]
2009-01-12 06:21:27 +00:00
Robert Ramey 90d9c0a064 unique naming for export instantiation
[SVN r50546]
2009-01-12 06:21:27 +00:00
Robert Ramey 3c218ee2b6 fixed syntax error for non standard namespace
[SVN r50545]
2009-01-12 06:20:02 +00:00
Robert Ramey f5e28c3bf6 destructors can't throw !
[SVN r50544]
2009-01-12 06:18:57 +00:00
Michael A. Jackson 75424b66bf Updating dependency information for modularized libraries.
[SVN r49628]
2008-11-07 17:05:27 +00:00
Michael A. Jackson 93e0f25093 Updating CMake files to latest trunk. Added dependency information for regression tests and a few new macros for internal use.
[SVN r49627]
2008-11-07 17:02:56 +00:00
Michael A. Jackson bd53f9b877 Continuing merge of CMake build system files into trunk with the encouragement of Doug Gregor
[SVN r49510]
2008-11-01 13:15:41 +00:00
Robert Ramey 13a777fa91 Correction of double paragraph in documentation
[SVN r49494]
2008-10-30 19:31:28 +00:00
Robert Ramey 22af4055c1 Fixed svn merge repeated paragraph
[SVN r49434]
2008-10-22 17:27:31 +00:00
Robert Ramey 6e32a7685f Updated spirit include directories
[SVN r49430]
2008-10-22 04:12:51 +00:00
Robert Ramey e422c2b3d2 Updated spirit include directories
[SVN r49429]
2008-10-22 04:11:40 +00:00
Robert Ramey 1e14fedab2 updated spirit headers to use "classic"
[SVN r49349]
2008-10-15 19:05:21 +00:00
Robert Ramey f0bd5b26d2 changes to better accomodate borland
[SVN r49348]
2008-10-15 19:04:49 +00:00
Robert Ramey 96f14f14f5 changes to better accomodate borland
[SVN r49348]
2008-10-15 19:04:49 +00:00
Robert Ramey 4b1f3cb758 updated spirit headers to use "classic"
[SVN r49347]
2008-10-15 19:03:37 +00:00
John Maddock 97ac7ebd67 Merge fixes from Trunk.
Fixes #2392.

Change includes of <cmath> to <boost/config/no_tr1/config.hpp>.

Previously if Boost.TR1 was in the include path then including <cmath> pulls in all the new TR1 math functions, which in turn also requires linking to an external library. With auto-linking support this requires that library to have been built and be present in the library search path, even if the actual library under use is header only. 

[SVN r49314]
2008-10-13 09:00:03 +00:00
Robert Ramey 0f45db1ea0 Tested fix for gcc crash on static object destruction
[SVN r49311]
2008-10-13 04:02:58 +00:00
Robert Ramey a4c03eb193 eliminate extraneous ;
[SVN r49297]
2008-10-12 19:48:22 +00:00
Robert Ramey 12b1d09370 Small changes to attempt to address borland
[SVN r49296]
2008-10-12 19:34:29 +00:00
Robert Ramey a25837fe33 avoid waring under gcc
[SVN r49295]
2008-10-12 19:32:57 +00:00
Robert Ramey 878707c61e Sync projects and solution
[SVN r49265]
2008-10-11 05:37:45 +00:00
Robert Ramey 65f03d44c2 Back out previous change
[SVN r49264]
2008-10-11 05:33:43 +00:00
Robert Ramey 3ccf67c392 Fix to make is_destoryed function as advertised
[SVN r49263]
2008-10-11 05:32:59 +00:00
John Maddock 4890facae9 Change includes of <cmath> to <boost/config/no_tr1/config.hpp>.
Previously if Boost.TR1 was in the include path then including <cmath> pulls in all the new TR1 math functions, which in turn also requires linking to an external library.  With auto-linking support this requires that library to have been built and be present in the library search path, even if the actual library under use is header only.

Fixes #2392.


[SVN r49254]
2008-10-10 16:10:00 +00:00
Robert Ramey c5b396d9a9 Merged documentation changes from releaee branch
[SVN r49204]
2008-10-09 07:04:20 +00:00
Robert Ramey cc5298754b Fix for important problem regarding extended_type_info tables
[SVN r49196]
2008-10-09 06:26:41 +00:00
Robert Ramey be806a6e2c Documentation changes for 1.37
[SVN r49173]
2008-10-08 04:42:43 +00:00
Robert Ramey 6e1a9716f4 Merge serialization library from trunk to release-read
[SVN r49158]
2008-10-07 05:34:46 +00:00
Robert Ramey 565f275988 preparing to move to release branch
[SVN r49156]
2008-10-06 23:04:23 +00:00
Robert Ramey 11edc76390 Better support for Borland compiler
[SVN r49147]
2008-10-06 16:31:00 +00:00
Robert Ramey d1a45cffdd Better support for Borland compiler
[SVN r49146]
2008-10-06 16:30:30 +00:00
Robert Ramey 47c2b1ff5d Refined detection of intrinsic 64 bit integers for platforms with long long
[SVN r48971]
2008-09-26 06:33:28 +00:00
Robert Ramey b09991670d Refined detection of intrinsic 64 bit integers for platforms with long long
[SVN r48970]
2008-09-26 06:32:48 +00:00
Robert Ramey 91a9aaf1c2 Fixed problems generated from unexpected sequence of static dtor calls
Fixed some minor TRAC items

[SVN r48963]
2008-09-25 06:22:01 +00:00
Robert Ramey ea545a40e3 Fixed problems generated from unexpected sequence of static dtor calls
Fixed some minor TRAC items

[SVN r48962]
2008-09-25 06:21:17 +00:00
Robert Ramey 4daaf2624d Fixed problems generated from unexpected sequence of static dtor calls
Fixed some minor TRAC items

[SVN r48961]
2008-09-25 06:20:43 +00:00
Robert Ramey eac5e7897c Fixed bas64 for text files
Fixed location of test archives

[SVN r48788]
2008-09-15 06:09:09 +00:00
Robert Ramey e7e2f86eda Fixed bas64 for text files
[SVN r48787]
2008-09-15 06:08:19 +00:00
Robert Ramey f4a24d0a95 Eliminate throw from destructor
[SVN r48759]
2008-09-12 20:24:38 +00:00
Robert Ramey 0961cd43f7 In the absence of exception support, forward to boost::throw_exception
[SVN r48748]
2008-09-11 20:41:19 +00:00
Robert Ramey 93fb463de4 fixed base64 text padding
[SVN r48719]
2008-09-11 03:50:18 +00:00
Robert Ramey 4a5a0ee40e updated test for text binary
[SVN r48718]
2008-09-11 03:49:39 +00:00
Robert Ramey b8f55afdad Reverted projects which failed to load in VC 2003
[SVN r48632]
2008-09-06 16:25:46 +00:00
Robert Ramey ca994c077b fix project files
[SVN r48623]
2008-09-05 22:23:20 +00:00
Robert Ramey b2519699af fix project files
[SVN r48622]
2008-09-05 22:22:39 +00:00
Douglas Gregor ad1b8f4cc6 Multiset's erase does not return an iterator in C++98
[SVN r48609]
2008-09-05 13:35:11 +00:00
Robert Ramey 967934453c 1. Moved pfto, state_saver, strong_typedef, smart_cast, static_warning into serialization Library.vcproj
2. created copy of original throw exception for use in the serialization Library.vcproj
3. addressed error maintenance of static type table which shows up on GCC
4. fixed internal names in xml_grammar so as not to conflict with likely preprocessor macros.
5. streamlined xml_grammar so as not to depend upon on non-thread safe component.


[SVN r48575]
2008-09-04 16:44:57 +00:00
Matthias Troyer 4a538b78dc Added license information
[SVN r47662]
2008-07-21 20:24:28 +00:00
Matthias Troyer a4e304526b Added license information
[SVN r47661]
2008-07-21 20:23:55 +00:00
Matthias Troyer 1dbac01a46 Merged final properties and details for release 1.36
[SVN r47489]
2008-07-16 20:34:30 +00:00
John Maddock 4ad47886f9 Merge Boost.Config changes from Trunk.
[SVN r47435]
2008-07-15 10:41:52 +00:00
Matthias Troyer 57e84bb71f Removed vector_134-hpp since default is compatibility with 1.34
[SVN r47284]
2008-07-10 07:24:45 +00:00
Matthias Troyer ec218d2f78 Merged laste changes from the trunk
[SVN r47210]
2008-07-08 06:06:53 +00:00
Robert Ramey c6b7a16fc4 fixed ripple effect from previous fix
[SVN r47135]
2008-07-06 17:06:18 +00:00
Robert Ramey d7701256ad suppress bogus warning for unused argument
[SVN r47118]
2008-07-05 19:19:50 +00:00
Robert Ramey be2d5eda2a Adjustments to address failures in VACPP and borland compilations
[SVN r47117]
2008-07-05 19:18:23 +00:00
Matthias Troyer 75e899a999 Added backwards compatibility header for 1.35
[SVN r47112]
2008-07-05 14:25:59 +00:00
Matthias Troyer 690c5b7081 Added more backwards compatibility files
[SVN r46998]
2008-07-02 19:16:18 +00:00
Matthias Troyer a333600aae Backwards compatibility
[SVN r46997]
2008-07-02 19:13:56 +00:00
Robert Ramey de383cb6f7 added #endif to borland patch
[SVN r46938]
2008-07-01 05:17:58 +00:00
Matthias Troyer 66a7396b8a Attempting workaround for Borland bug
[SVN r46928]
2008-06-30 19:09:12 +00:00
Robert Ramey 116a9620d2 tweaks to accomodate borland quirks
[SVN r46874]
2008-06-29 22:18:47 +00:00
Matthias Troyer a980481e7c Moved Serialization and MPI fixes and updates from trunk to release branch
[SVN r46743]
2008-06-26 19:25:44 +00:00
Matthias Troyer d3c464b892 Serialization build utils
[SVN r46735]
2008-06-26 18:09:20 +00:00
Matthias Troyer 15ab189daf New tests for release 1.36
[SVN r46732]
2008-06-26 17:24:22 +00:00
Matthias Troyer 70557dc108 Replacing by new tests
[SVN r46731]
2008-06-26 17:23:28 +00:00
Robert Ramey 77760e0905 Addressing "Inspect" complaints
[SVN r46729]
2008-06-26 17:11:02 +00:00
Robert Ramey 741f86e22f Addressing "Inspect" complaints
[SVN r46727]
2008-06-26 17:04:42 +00:00
Robert Ramey c348e8683e Addressing "Inspect" complaints
[SVN r46725]
2008-06-26 17:04:10 +00:00
Robert Ramey 2595e190cf Addressing "Inspect" complaints
[SVN r46724]
2008-06-26 17:00:26 +00:00
Robert Ramey 921e0e6338 Addressing "Inspect" complaints
[SVN r46723]
2008-06-26 16:59:58 +00:00
Robert Ramey c4dff88e3d Addressing "Inspect" complaints
[SVN r46722]
2008-06-26 16:58:29 +00:00
Matthias Troyer 4c1f453965 Fixed tabs
[SVN r46711]
2008-06-26 11:19:42 +00:00
Matthias Troyer 21f245cf5c Fixed tabs
[SVN r46709]
2008-06-26 10:45:51 +00:00
Robert Ramey 5df5e6cf53 make sure that headers are included which size_t
[SVN r46703]
2008-06-26 05:56:15 +00:00
Robert Ramey 0eb2393540 Correction in last attempt
[SVN r46702]
2008-06-26 05:54:12 +00:00
Robert Ramey dd63c7803b error in usage of BOOST_USED
[SVN r46676]
2008-06-25 05:00:02 +00:00
Robert Ramey 4f8a21ecc5 error in usage of BOOST_USED
[SVN r46675]
2008-06-25 04:48:27 +00:00
Robert Ramey 32ff2ca0dd Attempt to resolve problems with instantiation on Intel Platforms
[SVN r46622]
2008-06-23 03:48:31 +00:00
Robert Ramey 3d01e14ae1 Attempt to resolve problems with instantiation on Intel Platforms
[SVN r46621]
2008-06-23 03:48:01 +00:00
Robert Ramey d8d37ecd1b included cstddef to define null_deleter
added BOOST_USED in export.hpp to accommodate Intel compilers

[SVN r46598]
2008-06-22 01:10:52 +00:00
Robert Ramey 1f7ecf69e0 included cstddef to define null_deleter
added BOOST_USED to accommodate Intel compilers

[SVN r46597]
2008-06-22 01:06:16 +00:00
Douglas Gregor c8dbafea2f Add mime-type and eol-style properties as needed
[SVN r46445]
2008-06-17 13:54:46 +00:00
Matthias Troyer 36a93f9328 Added serialization support for boost::array
[SVN r46411]
2008-06-15 17:46:18 +00:00
Robert Ramey fe3e8c5ab2 simplified namespace issue with mbstate_t
[SVN r46409]
2008-06-15 17:02:15 +00:00
Robert Ramey b405eb615c remove unnecessary friend ostream which prevents compilation with stdxxx
[SVN r46393]
2008-06-14 17:48:02 +00:00
Matthias Troyer f8cf831f7e Removed array subdirectory, since this functionaity has been moved to the seriaize function of the array wrapper
[SVN r46388]
2008-06-14 12:28:26 +00:00
Matthias Troyer 980b86303e Added array test for 2-dimensional arrays
[SVN r46386]
2008-06-14 11:31:27 +00:00
Matthias Troyer 787bf2d951 Changed determination of when to use array optimizations to a traits class used only by the array wrapper, removing the need for deriving from the array/[io]archive base class and allowing mor specific enabling of array optimization, with less cost to users who don't need it.
[SVN r46385]
2008-06-14 11:22:55 +00:00
Matthias Troyer 50db978210 Changed determination of when to use array optimizations to a traits class used only by the array wrapper, removing the need for deriving from the array/[io]archive base class and allowing mor specific enabling of array optimization, with less cost to users who don't need it.
[SVN r46384]
2008-06-14 11:21:26 +00:00
Robert Ramey 19886f90f5 updated comment regarding serialization of std::map
[SVN r46306]
2008-06-10 20:21:21 +00:00
Robert Ramey 560d912d52 fix problem with tracking of std::map items.
[SVN r46305]
2008-06-10 20:19:00 +00:00
Robert Ramey b42bfb27f4 revert previous change
[SVN r46304]
2008-06-10 19:57:29 +00:00
Robert Ramey b17d9dbd7a whoops - last change was made without enough consideration.
Problem had already been addressed

[SVN r46294]
2008-06-10 14:53:42 +00:00
Robert Ramey 942fdf07dc adjust to defeat gcc string content sharing in non conforming code
[SVN r46287]
2008-06-10 04:33:00 +00:00
Robert Ramey b2e8e04ff6 New section for library performance testing and profiling
[SVN r46286]
2008-06-10 04:28:34 +00:00
Robert Ramey eedc65dc28 added To Do section
[SVN r46285]
2008-06-10 04:27:33 +00:00
Robert Ramey 9276d21cf2 very minor adjustments in the course of reviewing reset_object_address
[SVN r46267]
2008-06-09 04:04:03 +00:00
Robert Ramey 91467ba193 fix typos in documentation
[SVN r46266]
2008-06-09 04:02:42 +00:00
Robert Ramey 6e9a999a4b change to suppress warnings regarding unused arguments
[SVN r46265]
2008-06-09 04:01:54 +00:00
Robert Ramey 7ecc858bc1 change to suppress warnings regarding unused arguments
[SVN r46264]
2008-06-09 04:01:07 +00:00
Robert Ramey 4d62235d3a cosmetic change to suppress bogus Microsoft warning
[SVN r46256]
2008-06-08 20:12:34 +00:00
Robert Ramey 01f9d42a23 correct test to throw legal exception
[SVN r46242]
2008-06-08 16:05:15 +00:00
Robert Ramey 42c9bc72c1 Made BOOST_STATIC_WARNING a no-op for all Intel compilers
[SVN r46241]
2008-06-08 15:54:03 +00:00
Robert Ramey c763c57fa9 miscellaneous adjustments in to address trunk test failures
[SVN r46226]
2008-06-07 23:49:23 +00:00
Robert Ramey 10f429dac1 add typename for dependent type
[SVN r46224]
2008-06-07 23:44:17 +00:00
Robert Ramey 066a615634 replace is_abstract with assume_abstract
[SVN r46223]
2008-06-07 23:43:01 +00:00
Robert Ramey 34bf772e83 fix typos pointed out by users
[SVN r46222]
2008-06-07 23:41:59 +00:00
Robert Ramey f828a336bd miscellaneous adjustments in to address trunk test failures
[SVN r46221]
2008-06-07 23:40:44 +00:00
Robert Ramey 58f531541b miscellaneous adjustments in to address trunk test failures
[SVN r46220]
2008-06-07 23:40:05 +00:00
Peter Dimov 4364bc44f0 Fix throwing enums instead of archive_exceptions.
[SVN r45027]
2008-05-02 16:49:34 +00:00
John Maddock 4eedf9ab70 Move Boost.Config build rules into libs/config/test and fix the serialization build rules accordingly.
[SVN r44422]
2008-04-14 18:06:59 +00:00
Douglas Gregor 99be4e2168 Fix some header-inclusion and header-ordering issues to get the MPI library compiling again.
[SVN r44175]
2008-04-11 15:39:41 +00:00
Robert Ramey f2c76b43c7 changed type traits macro to BOOST_TT_BROKEN_COMPILER_SPEC
[SVN r44096]
2008-04-07 17:23:07 +00:00
Robert Ramey fe3857afaa change BOOST_IS_ABSTRACT to BOOST_ASSUME_ABSTRACT
[SVN r44095]
2008-04-07 17:07:00 +00:00
Robert Ramey 3297e43087 remove supperfluous abstract.hpp header
[SVN r44083]
2008-04-06 20:05:56 +00:00
Robert Ramey f81a766b70 enhanced test to detect more errors
[SVN r44082]
2008-04-06 20:04:20 +00:00
Robert Ramey 23e0f37d37 change BOOST_IS_ABSTRACT to BOOST_ASSUME_ABSTRACT
[SVN r44081]
2008-04-06 20:03:59 +00:00
Robert Ramey 852deb8c10 change BOOST_IS_ABSTRACT to BOOST_ASSUME_ABSTRACT
[SVN r44080]
2008-04-06 20:03:21 +00:00
Robert Ramey 5e424ec896 change BOOST_IS_ABSTRACT to BOOST_ASSUME_ABSTRACT
[SVN r44079]
2008-04-06 20:02:54 +00:00
Robert Ramey f994293020 change BOOST_IS_ABSTRACT to BOOST_ASSUME_ABSTRACT
[SVN r44078]
2008-04-06 20:01:48 +00:00
Robert Ramey 6b9974569c enhanced test to detect more errors
[SVN r44039]
2008-04-04 17:03:21 +00:00
Marshall Clow 575443f8e1 Replaced all occurrences of non-ASCII copyright symbol with '(c)' for people using non-ASCII code pages
[SVN r43992]
2008-04-02 01:42:32 +00:00
Vladimir Prus cf8bc022f6 Make logic for old-sprit-demanding compilers work.
The previous code was all broken, trying to mix conditional
requirements and indirect conditional requirements like:

    <toolset>borland:<conditional>@include-spirit


[SVN r43987]
2008-04-01 17:53:45 +00:00
Robert Ramey ecd03e84d7 correction of error which prevented compilation on gcc 43 - again
[SVN r43958]
2008-03-31 16:49:53 +00:00
Robert Ramey 10faf88465 correction of error which prevented compilation on gcc 43
[SVN r43957]
2008-03-31 16:16:24 +00:00
Robert Ramey cc808738c4 fixed name collision for "serialization map"
[SVN r43956]
2008-03-31 16:15:10 +00:00
Robert Ramey 940aa1df35 Corrected error in detection of 64 bit support
[SVN r43955]
2008-03-31 15:46:48 +00:00
Robert Ramey dcb9c9dd50 updated comments to reflect the fact portable binary is unsupported
[SVN r43954]
2008-03-31 15:45:38 +00:00
Dave Abrahams 014543ff72 Undo the header re-ordering workaround now that the actual bug is fixed.
See ticket:1711, comment 24


[SVN r43953]
2008-03-30 18:25:26 +00:00
Dave Abrahams 365af6450c Clean up a comment that said "I don't know what the standard says
about this," now that I do know.


[SVN r43951]
2008-03-30 17:19:07 +00:00
Dave Abrahams c7dee32206 fixes #1711
[SVN r43949]
2008-03-30 16:18:03 +00:00
Robert Ramey f0be07eff3 added test to check warnings on type trait
[SVN r43883]
2008-03-27 17:12:22 +00:00
Robert Ramey 9cae70dae7 tweaks to sneak past PGI compiler error message
[SVN r43882]
2008-03-27 17:11:23 +00:00
Robert Ramey 2cbd120596 removed suppression of builds for certain platforms with shared libraries
[SVN r43880]
2008-03-27 15:53:37 +00:00
Robert Ramey 44b8a4ffdb fixed minor typo
[SVN r43826]
2008-03-24 15:46:43 +00:00
Robert Ramey 4c9a03dcb7 removed EXIT_SUCCESS
[SVN r43825]
2008-03-24 15:46:09 +00:00
Robert Ramey de8fa1c425 removed superflous static cast
[SVN r43809]
2008-03-23 19:18:22 +00:00
Robert Ramey aff3ebb25a made test_static_warning compile only
[SVN r43808]
2008-03-23 19:10:31 +00:00
Robert Ramey 5c6f9a495c made test compile only
[SVN r43807]
2008-03-23 19:09:51 +00:00
Robert Ramey 11bd878431 adjusted header order for export.hpp to see if this will make gcc 4.x tests pass.
[SVN r43806]
2008-03-23 18:36:00 +00:00
Robert Ramey 8ef74d1bd0 streamlined Jamfile.v2
eliminated build of binary_w*
removed usage-requirement
dropped serialization.jam as its no longer used

[SVN r43795]
2008-03-22 18:59:07 +00:00
Robert Ramey d26a7830f5 Adjustment to inhibit compile error with intel compilers
[SVN r43758]
2008-03-21 17:19:07 +00:00
Robert Ramey 40ca5515f1 added include <ostream> for friend operators
[SVN r43748]
2008-03-21 16:40:06 +00:00
Robert Ramey b1b114de63 Added consideration for compac Tru64
[SVN r43747]
2008-03-21 16:37:24 +00:00
Douglas Gregor a118378af6 Fix compilation error on PPC Darwin
[SVN r43728]
2008-03-19 16:57:48 +00:00
Vladimir Prus cca24b471e Remove usage-requirements as they are not necessary,
and can cause bogus dependencies for serialization's client.


[SVN r43722]
2008-03-19 11:09:29 +00:00
Robert Ramey 42b0c2ad3e Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43717]
2008-03-19 05:17:02 +00:00
Robert Ramey dc153d5e7b Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43706]
2008-03-18 16:32:48 +00:00
Robert Ramey f6d14c80ea Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43705]
2008-03-18 16:32:22 +00:00
Robert Ramey 00a143fd3d Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43704]
2008-03-18 16:31:36 +00:00
Robert Ramey aeb7ca4619 Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43702]
2008-03-18 15:51:42 +00:00
Robert Ramey 5264194e67 Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43701]
2008-03-18 15:51:13 +00:00
Robert Ramey ce7dc653df Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43694]
2008-03-18 05:53:07 +00:00
Robert Ramey b3c87d2dfa Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43693]
2008-03-18 05:52:10 +00:00
Robert Ramey 0530d1fcaa Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43692]
2008-03-18 05:47:10 +00:00
Robert Ramey 66b1028d4c Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43691]
2008-03-18 05:01:57 +00:00
Robert Ramey cfb16a8a9d Support serialization in DLLS
Make thread-safe
fix portable binary archives

[SVN r43690]
2008-03-18 04:58:51 +00:00
Daniel James 2d55202d2d Merged revisions 43206,43208-43213 via svnmerge from
https://svn.boost.org/svn/boost/trunk

........
  r43206 | danieljames | 2008-02-10 09:55:03 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Fix some broken links.
........
  r43209 | danieljames | 2008-02-10 14:56:22 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Link to people pages on the website, as they've been removed from the download.
........
  r43210 | danieljames | 2008-02-10 15:02:17 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Point links to the pages that used to be in 'more' to the site.
........
  r43212 | danieljames | 2008-02-10 16:10:16 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Fix links on the home page as well.
........
  r43213 | danieljames | 2008-02-10 16:21:22 +0000 (Sun, 10 Feb 2008) | 1 line
  
  Generated documentation which is no longer generated.
........


[SVN r43214]
2008-02-10 16:39:38 +00:00
Daniel James 480d7b2413 Link to people pages on the website, as they've been removed from the download.
[SVN r43209]
2008-02-10 14:56:22 +00:00
Matthias Troyer 27a45b2658 Removed an optimization overload that caused issues with tracking. A fixed optimization overload will be delayed to 1.36
[SVN r43096]
2008-02-04 16:47:31 +00:00
Matthias Troyer 3c09247068 Undid backward-compatibility breaking change in pair serialization
[SVN r42649]
2008-01-10 11:55:13 +00:00
Matthias Troyer 1c90e422e6 Undid backward-compatibility breaking change in pair serialization
[SVN r42648]
2008-01-10 11:54:36 +00:00
Markus Schöpflin 02ff4b6e31 Modified spelling of my surname to avoid problems with non-ASCII characters.
[SVN r42436]
2008-01-03 10:04:39 +00:00
Matthias Troyer 1efcb23869 Added missing include
[SVN r42341]
2007-12-29 18:24:11 +00:00
Matthias Troyer 5b81643b84 fixed mssing include
[SVN r42330]
2007-12-29 06:49:25 +00:00
Matthias Troyer e4efa8cf47 removed warning
[SVN r42274]
2007-12-24 07:06:11 +00:00
Robert Ramey adab69fc6e correction to input of zero length strings
[SVN r42264]
2007-12-23 20:00:03 +00:00
Robert Ramey 1681869ffa change to fix failures with gcc 4.1+
modification to string input primitives

[SVN r41770]
2007-12-06 02:33:59 +00:00
David Deakins 23b6906d8c Added a primitive tmpnam function for WinCE (which does not supply any kind of tmpnam in its CRT)
[SVN r41384]
2007-11-25 21:53:26 +00:00
Beman Dawes 4e29437a19 Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41369]
2007-11-25 18:07:19 +00:00
Beman Dawes 36694aec8f Full merge from trunk at revision 41356 of entire boost-root tree. Do Serialization separately to verify pre-commit check failures have been fixed.
[SVN r41368]
2007-11-25 17:57:08 +00:00
Beman Dawes e36c2be66f Full merge from trunk at revision 41356 of entire boost-root tree. Do Serialization separately to verify pre-commit check failures have been fixed.
[SVN r41366]
2007-11-25 17:55:35 +00:00
Beman Dawes ca98cc237d Full merge from trunk at revision 41356 of entire boost-root tree. Do Serialization separately to verify pre-commit check failures have been fixed.
[SVN r41365]
2007-11-25 17:55:04 +00:00
Matthias Troyer 70afb78ebe made complex seriaqlization more portable
[SVN r41221]
2007-11-19 12:15:58 +00:00
Beman Dawes 7d71f523e8 Add or correct comment identifying Boost library this header is associated with.
[SVN r41187]
2007-11-17 22:48:06 +00:00
Matthias Troyer 7d0480231d Added support for std::complex to serialization
[SVN r41077]
2007-11-14 07:00:02 +00:00
Vladimir Prus e954446f2a Make sure every library can be installed by using
bjam stage|install

in libs/<library>/build.


[SVN r40475]
2007-10-26 09:04:25 +00:00
Rene Rivera 5088b8dd26 Recreate release branch from fixed 1.34.1 tag.
[SVN r40341]
2007-10-23 06:42:50 +00:00
Douglas Gregor 9675df04e3 Move Attic files back into their rightful places
[SVN r40311]
2007-10-23 01:47:48 +00:00
Nicola Musatti bec06ca0d4 Applied patch from Ticket #1319
[SVN r40019]
2007-10-14 17:51:32 +00:00
Beman Dawes ea37174708 Apply dll fixes from David Deakins
[SVN r39848]
2007-10-09 16:39:13 +00:00
Matthias Troyer 29ce16419f Fix for Borland
[SVN r39753]
2007-10-07 06:57:36 +00:00
Beman Dawes ce1c36ea98 Starting point for releases
[SVN r39706]
2007-10-05 14:25:06 +00:00
John Maddock b56cb9ba74 Updated licences using blanket_permission.txt.
[SVN r39369]
2007-09-18 17:19:41 +00:00
Douglas Gregor 58e92cc397 Don't use BOOST_TEST_DONT_PRINT_LOG_VALUE if it isn't defined
[SVN r39245]
2007-09-13 19:31:03 +00:00
Vladimir Prus 30e6e9dcba Remove V1 Jamfiles
[SVN r38516]
2007-08-08 19:02:26 +00:00
Douglas Gregor 5df2c12166 boost\archive\detail\basic_iarchive: Remove some bogus declspecs
Boost.MPI: Added support for Windows auto-linking


[SVN r38290]
2007-07-26 16:12:26 +00:00
nobody b37ab364a7 This commit was manufactured by cvs2svn to create tag
'Version_1_34_1'.

[SVN r38286]
2007-07-24 19:28:14 +00:00
Robert Ramey 831203f981 more complete set of build variants
[SVN r38252]
2007-07-16 17:45:58 +00:00
Robert Ramey d2cdb8e73c *.suo files are redundant
[SVN r38251]
2007-07-16 17:44:04 +00:00
Robert Ramey 48f60529ab added void_cast_fwd.hpp
[SVN r38250]
2007-07-16 17:40:03 +00:00
Robert Ramey a790233141 adjusted test project
[SVN r38249]
2007-07-16 17:39:05 +00:00
Robert Ramey 1aeba3c035 removing files from borland ide
[SVN r38248]
2007-07-16 17:32:57 +00:00
Robert Ramey add7159a85 removing borland ide projects
[SVN r38247]
2007-07-16 17:31:45 +00:00
Robert Ramey c35f7b34e2 *** empty log message ***
[SVN r38246]
2007-07-16 17:22:56 +00:00
Robert Ramey 752acdafee fixup to support lightweight testing
[SVN r38245]
2007-07-16 17:20:34 +00:00
Robert Ramey 6f6ccc2e44 elminate dependency on boost test
[SVN r38244]
2007-07-16 17:19:29 +00:00
Robert Ramey b0e384ec1a added shared ptr helper, short type, sign extension fix
[SVN r38243]
2007-07-16 16:44:29 +00:00
Robert Ramey c51325635f include stdlib.h for NULL
[SVN r38242]
2007-07-16 16:39:55 +00:00
Robert Ramey 7f00638dfb amplified comment
[SVN r38241]
2007-07-16 16:39:03 +00:00
Robert Ramey 0c5bb1d032 minor gramatical improvement
[SVN r38240]
2007-07-16 16:37:24 +00:00
Robert Ramey 268e85f5c1 added comment rearding the portability of EXPORT
[SVN r38239]
2007-07-16 16:36:24 +00:00
Robert Ramey 08a364878c added comment re namespaces, fixed void_cast_register prototype
[SVN r38238]
2007-07-16 16:35:11 +00:00
Robert Ramey e3c144e09a fixed include path for ..dispatch.hpp
[SVN r38237]
2007-07-16 16:33:35 +00:00
Robert Ramey 3f5938f35b DECL for metrowerks
[SVN r38236]
2007-07-16 16:31:23 +00:00
Robert Ramey 0986103ceb changed name of include guard
[SVN r38235]
2007-07-16 16:28:34 +00:00
Robert Ramey 806db58269 improved comment
[SVN r38234]
2007-07-16 16:27:33 +00:00
Robert Ramey 52411aaff4 release autopointer
[SVN r38233]
2007-07-16 16:26:49 +00:00
Robert Ramey 35dc8ceebf added friend declaration and default argument
[SVN r38232]
2007-07-16 16:26:07 +00:00
Robert Ramey 10a5027b29 added DECL macros
[SVN r38231]
2007-07-16 16:25:17 +00:00
Robert Ramey 1e7f3d4b9d made destructor virtual
[SVN r38230]
2007-07-16 16:20:31 +00:00
Robert Ramey e26ebab471 mbstate_t for rogue wave
[SVN r38229]
2007-07-16 16:19:46 +00:00
Robert Ramey 727a372834 const correctness
[SVN r38228]
2007-07-16 16:19:05 +00:00
Robert Ramey 4609f2c6fb fixed bug count->scount
[SVN r38227]
2007-07-16 16:18:29 +00:00
Robert Ramey 0eefcbe3bd cosmetic
[SVN r38226]
2007-07-16 16:17:15 +00:00
Thomas Witt 8400223437 Resolve Trac #992.
[SVN r37776]
2007-05-25 20:07:55 +00:00
Nicola Musatti 2334804623 no message
[SVN r37668]
2007-05-12 08:15:55 +00:00
Robert Ramey 09ef207293 added codecvt_null
[SVN r36914]
2007-02-09 04:32:35 +00:00
Alisdair Meredith dcccc51327 Clear ABI warnings on Borland compiler, when headers included further headers
[SVN r36880]
2007-02-03 17:07:44 +00:00
Robert Ramey 23db071843 added BOOST_CHECK
[SVN r36444]
2006-12-17 22:09:31 +00:00
Robert Ramey 5d9d00bf68 roll back erroneous check-in
[SVN r36434]
2006-12-16 21:44:42 +00:00
Robert Ramey eda61aea60 move to lightweight test framework
[SVN r36433]
2006-12-16 21:12:07 +00:00
Robert Ramey c600890b0d backout mistaken checkin
[SVN r36432]
2006-12-16 21:09:19 +00:00
Robert Ramey 099e0fd257 escape <> characters
[SVN r36427]
2006-12-16 06:23:52 +00:00
Robert Ramey e4f0a979e7 expand explanation of export
[SVN r36426]
2006-12-16 06:23:03 +00:00
Robert Ramey 5c43de71cf correct grammar
[SVN r36425]
2006-12-16 06:22:06 +00:00
Robert Ramey 9979fad749 enhance explanation for wchar_t
[SVN r36424]
2006-12-16 06:21:14 +00:00
Robert Ramey 65f7cade32 changed title of diagram to text_archive
[SVN r36423]
2006-12-16 06:18:27 +00:00
Robert Ramey e66fef7d07 resync
[SVN r36422]
2006-12-16 06:15:49 +00:00
Robert Ramey 3053878538 removed dependency on boost test
[SVN r36421]
2006-12-16 06:11:01 +00:00
Robert Ramey 41e1b8000a moved to lightweight testing framework
[SVN r36420]
2006-12-16 06:07:09 +00:00
Robert Ramey 9be8f7c2ee moved to lightweight testing framework
[SVN r36420]
2006-12-16 06:07:09 +00:00
Robert Ramey 4488fddadf moved to lightweight test system
[SVN r36419]
2006-12-16 06:03:48 +00:00
Robert Ramey 9008ddf64a remove superfluous functions for helpers
[SVN r36418]
2006-12-16 06:00:34 +00:00
Robert Ramey 9c3179680d minor correction to support 1.32 shared_ptrs
[SVN r36417]
2006-12-16 05:59:16 +00:00
Robert Ramey a26e8dc9be adjustments to support 1.32 shared_ptr
[SVN r36416]
2006-12-16 05:53:26 +00:00
Robert Ramey b56f059ef3 correct size of non chars
[SVN r36415]
2006-12-16 05:52:09 +00:00
Robert Ramey 57ee259098 addition to support loading of version 1.32 shared pointers
[SVN r36414]
2006-12-16 05:51:16 +00:00
Robert Ramey 9183c84f38 improved comment
[SVN r36413]
2006-12-16 05:50:20 +00:00
Matthias Troyer b933c57ea4 *** empty log message ***
[SVN r36329]
2006-12-11 06:32:28 +00:00
Robert Ramey 06377e7ca9 correction to previous change
[SVN r36047]
2006-11-15 18:43:12 +00:00
Robert Ramey 1ef7246322 added template declaration to resolve SUN compiler complaint
[SVN r36046]
2006-11-15 18:40:09 +00:00
Robert Ramey 92f636b6ed correct error in main
[SVN r35996]
2006-11-10 21:16:29 +00:00
Robert Ramey abd6e3c3d7 comment out unused argument
[SVN r35995]
2006-11-10 21:15:19 +00:00
Robert Ramey 96338cc37e removed erroneas BOOST_USED
[SVN r35994]
2006-11-10 21:11:30 +00:00
Vladimir Prus 80a61bb579 Fix
[SVN r35993]
2006-11-10 21:03:16 +00:00
Vladimir Prus ea8735098e Merge from HEAD.
Allow building of shared versions of some Boost.Test libraries.
Adjust tests to use always use static linking to Boost.Test, since
linking to the shared version requires test changes.

Patch from Juergen Hunold.


[SVN r35990]
2006-11-10 19:59:52 +00:00
Vladimir Prus d8e47b3a1f Allow building of shared versions of some Boost.Test libraries.
Adjust tests to use always use static linking to Boost.Test, since
linking to the shared version requires test changes.

Patch from Juergen Hunold.


[SVN r35989]
2006-11-10 19:09:56 +00:00
Robert Ramey 694a68be35 correct error in last update
[SVN r35893]
2006-11-07 04:40:34 +00:00
Rene Rivera 007bfe52b8 Remove obsolete Boost.Build v1 files.
[SVN r35880]
2006-11-06 17:10:46 +00:00
Robert Ramey 30b736df0b updated for hp
[SVN r35865]
2006-11-06 04:55:19 +00:00
Robert Ramey aaad58be00 modified for benefit of HP compiler
[SVN r35864]
2006-11-06 04:49:13 +00:00
Robert Ramey 13f72ef7c4 test_tools.hpp
[SVN r35853]
2006-11-05 16:40:05 +00:00
Robert Ramey 6c7b3c7d61 add #include force_include.hpp to over come compile error
[SVN r35677]
2006-10-20 18:36:01 +00:00
Robert Ramey 898ca1b294 correct codecvt_null duplication
[SVN r35534]
2006-10-10 18:05:00 +00:00
Robert Ramey 03fbead691 jamfile updates - codecvt_null
[SVN r35490]
2006-10-04 16:54:18 +00:00
Robert Ramey 9cff60d2e8 correct file lists
[SVN r35489]
2006-10-04 15:20:57 +00:00
Robert Ramey ed522ce134 update projects
[SVN r35482]
2006-10-04 05:51:36 +00:00
Robert Ramey 33814c1296 corrections to tests
[SVN r35481]
2006-10-04 05:50:14 +00:00
Robert Ramey 21e3e4d452 file no longer necessary
[SVN r35480]
2006-10-04 05:49:14 +00:00
Robert Ramey ecdcc90ede new file list
[SVN r35479]
2006-10-04 05:48:36 +00:00
Robert Ramey d447c038ef slight tweak for static instance
[SVN r35478]
2006-10-04 05:38:29 +00:00
Robert Ramey 7367a517fb no need to include boost/bind
[SVN r35477]
2006-10-04 05:37:53 +00:00
Robert Ramey f939ebee1a make naked_... to fill void left by including shared_ptr_helper by default
[SVN r35476]
2006-10-04 05:37:12 +00:00
Robert Ramey fadadb37c9 removed helper support
[SVN r35475]
2006-10-04 05:35:50 +00:00
Robert Ramey 0a82da5e09 streamlined delete created pointers, removed helper support
[SVN r35474]
2006-10-04 05:35:09 +00:00
Robert Ramey 685d1aea26 adjust ments for new export
[SVN r35473]
2006-10-04 05:33:39 +00:00
Robert Ramey 71e5d4bc98 factored out helper in to archives
[SVN r35472]
2006-10-04 05:32:18 +00:00
Robert Ramey 479977daeb improved export makes these no longer necessary
[SVN r35471]
2006-10-04 05:31:10 +00:00
Robert Ramey 14f0f8271d change names to ... dispatch
[SVN r35470]
2006-10-04 05:29:53 +00:00
Robert Ramey f3cf6293e5 change file name form ..._impl
[SVN r35469]
2006-10-04 05:28:52 +00:00
Robert Ramey 7d9bd7871d factor out shared_pointer_helper
[SVN r35468]
2006-10-04 05:26:43 +00:00
Robert Ramey 1e802d9677 tweaks for old borland compiler
[SVN r35467]
2006-10-04 05:25:44 +00:00
Robert Ramey 7910677c3a move friend declaration
[SVN r35466]
2006-10-04 05:24:38 +00:00
Robert Ramey 9377f754b0 minor tweaks for old borland compiler
[SVN r35465]
2006-10-04 05:23:37 +00:00
Robert Ramey deba15f9b5 forward to dyanamically inialized static instance
[SVN r35464]
2006-10-04 05:21:21 +00:00
Robert Ramey 080e666ec2 factor out helper
[SVN r35463]
2006-10-04 05:19:20 +00:00
Robert Ramey f2cf93b688 fix for borland
[SVN r35450]
2006-10-02 21:35:18 +00:00
Robert Ramey 91770338cd misc improvements
[SVN r35401]
2006-09-28 21:55:13 +00:00
Robert Ramey 5624bc552a update to consider current version number and autolinking
[SVN r35398]
2006-09-28 18:02:14 +00:00
Robert Ramey 3c64171df1 elimate garbage in html
[SVN r35397]
2006-09-28 17:24:58 +00:00
Robert Ramey 666100d27e expand explanation of NVP macro
[SVN r35396]
2006-09-28 17:24:13 +00:00
Robert Ramey 0edcefcdda add note that macro must be in global namespace
[SVN r35395]
2006-09-28 17:23:07 +00:00
Robert Ramey 49a9a29140 improve explanation of save/load construct
[SVN r35394]
2006-09-28 17:21:56 +00:00
Robert Ramey 320ebce20f include test_exec_monitor rather than test_tools. This makes autolinking work
[SVN r35393]
2006-09-28 17:19:28 +00:00
Robert Ramey 9db5b5005c use demo_gps.hpp rather than demo_xml.hpp
[SVN r35389]
2006-09-28 17:13:03 +00:00
Robert Ramey ec4e5124f4 change to better name
[SVN r35388]
2006-09-28 17:11:32 +00:00
Robert Ramey 5a29bca85c add is_abstract include
[SVN r35387]
2006-09-28 17:08:38 +00:00
Robert Ramey 01752ec977 adjust STLPort version macros
[SVN r35386]
2006-09-28 17:06:48 +00:00
Robert Ramey 9011c6833d grammer corrections
[SVN r35385]
2006-09-28 17:05:52 +00:00
Robert Ramey fba3d86b5d spelling correction
[SVN r35384]
2006-09-28 17:04:32 +00:00
Robert Ramey e4d0d3d61e fix error in reset object address
[SVN r35383]
2006-09-28 17:03:26 +00:00
Robert Ramey 4103202f8d add full qualification to address some compiler complaint
[SVN r35382]
2006-09-28 17:01:04 +00:00
Robert Ramey 4ebe6da43c no longer need STD - replace with std
[SVN r35381]
2006-09-28 17:00:38 +00:00
Robert Ramey c3c306214e fix spelling error
[SVN r35380]
2006-09-28 16:58:15 +00:00
Robert Ramey c9f8099931 remove need for force_include
[SVN r35379]
2006-09-28 16:56:36 +00:00
Robert Ramey af63fcc0be properly initialized version number
[SVN r35378]
2006-09-28 16:55:02 +00:00
Robert Ramey 88ee3bb76c no longer need STD - replace with std
[SVN r35377]
2006-09-28 16:50:06 +00:00
Robert Ramey 092843d04d fix conditional for collection version
[SVN r35376]
2006-09-28 16:45:48 +00:00
Robert Ramey 3eade6147a fix STLPort macro
[SVN r35375]
2006-09-28 16:44:05 +00:00
Robert Ramey c9a0dfe045 fix tag checking logic
[SVN r35374]
2006-09-28 16:42:31 +00:00
Robert Ramey 1a7b698181 adjustment to make thread-safe
[SVN r35373]
2006-09-28 16:40:48 +00:00
Robert Ramey 3303bd4c3e moved instantiation to more obvious place
[SVN r35372]
2006-09-28 16:39:42 +00:00
Robert Ramey cd709fdba5 eliminate superflous forward of end_preamble
[SVN r35371]
2006-09-28 16:35:51 +00:00
Robert Ramey 625c97e63b prohibit destruction of polymorphic archives via base class pointer
[SVN r35370]
2006-09-28 16:33:58 +00:00
Robert Ramey 32804edc06 better support for dinkumware
[SVN r35369]
2006-09-28 16:32:17 +00:00
Robert Ramey c496f8441f fix for borland strong type problem
[SVN r35368]
2006-09-28 16:30:22 +00:00
Robert Ramey a37379fadb STLPort compatibility
[SVN r35367]
2006-09-28 16:28:42 +00:00
Matthias Troyer 951ab1abca Fixd zero length bug
[SVN r35282]
2006-09-22 17:56:59 +00:00
Robert Ramey 1a4e75f492 fixup stlport macros
[SVN r34794]
2006-08-01 04:25:49 +00:00
Robert Ramey 8cdc138fe1 fixed link
[SVN r34565]
2006-07-16 20:34:47 +00:00
Robert Ramey a23d2e1c45 corrected html escapes
[SVN r34547]
2006-07-16 01:56:20 +00:00
Robert Ramey e15f15888e corrected spirit link
[SVN r34546]
2006-07-16 01:55:37 +00:00
Douglas Gregor 3acfb736d6 Work around GCC warning
[SVN r34465]
2006-07-05 23:04:38 +00:00
Matthias Troyer 0b13678ee0 *** empty log message ***
[SVN r34367]
2006-06-22 07:21:23 +00:00
Hartmut Kaiser 60e977b85f Fixed a class/struct mismatch.
[SVN r34263]
2006-06-10 17:18:47 +00:00
Robert Ramey 5787031495 tweaks to fix borlands problem with strong type
[SVN r34218]
2006-06-07 03:33:30 +00:00
Robert Ramey b1cbb5841a fixups for vc 6.5 and intel 9.1
[SVN r34189]
2006-06-06 03:52:00 +00:00
Robert Ramey e4ffaa0ecc change hoping to fix borland test
[SVN r34172]
2006-06-04 18:55:01 +00:00
Robert Ramey a888b6a2c6 clarify text
[SVN r34167]
2006-06-04 15:14:51 +00:00
Robert Ramey 3771a72827 clarify role of common.hpp
[SVN r34166]
2006-06-04 15:13:44 +00:00
Robert Ramey 75bcbe70c1 fix spirit link
[SVN r34165]
2006-06-04 15:12:45 +00:00
Robert Ramey 1c0c86407c include serialization traits header
[SVN r34164]
2006-06-04 14:52:30 +00:00
Robert Ramey b271d42c4d correction for borland
[SVN r34163]
2006-06-04 14:51:24 +00:00
Matthias Troyer b930154408 Added documentation for array wrappers
[SVN r34158]
2006-06-04 01:42:55 +00:00
Robert Ramey 73f2332552 refine for dinkumare improvement
[SVN r34121]
2006-05-30 15:59:14 +00:00
Robert Ramey 0456f38813 fix for latest borland
[SVN r34120]
2006-05-30 15:58:22 +00:00
Robert Ramey c45e6b53e2 fix typos
[SVN r34119]
2006-05-30 15:57:15 +00:00
Robert Ramey 14e7353994 Borland fixes
[SVN r34118]
2006-05-30 15:56:35 +00:00
Dave Abrahams 3b585d5049 Lift header ordering restrictions in Serialization library
[SVN r34106]
2006-05-26 21:38:16 +00:00
Matthias Troyer 4e5e1e8120 Attempt at fix for MSVC
[SVN r34068]
2006-05-23 14:41:40 +00:00
Matthias Troyer 72e8ea4f06 Fixed zero-size bug
[SVN r34058]
2006-05-22 14:50:27 +00:00
Dave Abrahams a013adf37c Patch around duplicate function definition bug.
[SVN r34057]
2006-05-22 13:33:47 +00:00
Matthias Troyer 846e2d4fa3 Fixed misplaced endif
[SVN r33922]
2006-05-04 04:58:36 +00:00
Douglas Gregor e9b9eb61db Fix BOOST_MPL_ASSERT use
[SVN r33890]
2006-05-01 14:47:02 +00:00
Matthias Troyer 3af3d629bf *** empty log message ***
[SVN r33884]
2006-05-01 04:31:26 +00:00
Matthias Troyer f2f7b5eb64 Added testing of array-optimized binary archives and merged changes from RC_1_34_0
[SVN r33883]
2006-05-01 00:08:10 +00:00
Matthias Troyer 7459fe85b2 *** empty log message ***
[SVN r33882]
2006-05-01 00:06:53 +00:00
Matthias Troyer 1bebf9f64d Added array-optimized binary archives
[SVN r33881]
2006-05-01 00:06:32 +00:00
Matthias Troyer 88b081a37c Implemented is_wrapper support, array wrapper, collection_size_type, array-optimized binary archives and merged changes from RC_1_34_0
[SVN r33880]
2006-05-01 00:04:29 +00:00
Matthias Troyer 1c58902378 Added is_wrapper trait, array wrapper, collection_size_type and merged changes from RC_1_34_0
[SVN r33879]
2006-04-30 23:58:59 +00:00
Robert Ramey 8a4a9fe353 efficiency improvement
[SVN r33745]
2006-04-19 15:50:41 +00:00
Robert Ramey 757e0319de correction
[SVN r33731]
2006-04-18 16:02:21 +00:00
Robert Ramey 8559cb7b1a correct error exposed by stlport 5.0
[SVN r33716]
2006-04-17 08:06:45 +00:00
Robert Ramey 4896421bb9 tweak for borland update
[SVN r33603]
2006-04-08 20:44:02 +00:00
Robert Ramey 35184e36b3 correction in is_base.. namespace
[SVN r33598]
2006-04-07 15:36:38 +00:00
Robert Ramey c785101476 correct hash tests
[SVN r33538]
2006-04-05 04:56:10 +00:00
Robert Ramey 117e7382a0 change encodeing to utf-8
[SVN r33537]
2006-04-05 04:54:57 +00:00
Robert Ramey aa4aa23be3 correct for STLPort
[SVN r33536]
2006-04-05 04:52:27 +00:00
Robert Ramey ccce8f7fdd project update
[SVN r33470]
2006-03-24 16:22:18 +00:00
Robert Ramey bb8d1be57c misc adjustments
[SVN r33469]
2006-03-24 16:17:17 +00:00
Robert Ramey deac1f07fc increase template depth for gcc compilers
[SVN r33468]
2006-03-24 16:15:13 +00:00
Robert Ramey a484107118 comment correction
[SVN r33467]
2006-03-24 16:13:23 +00:00
Robert Ramey 0b9108996b added set_library call to properly initialize library version from archive
[SVN r33466]
2006-03-24 15:57:30 +00:00
Robert Ramey 58becb4e26 added is_* to avoid multiple parent problem
[SVN r33465]
2006-03-24 15:55:05 +00:00
nobody a7bb283ddb This commit was manufactured by cvs2svn to create branch 'RC_1_34_0'.
[SVN r33417]
2006-03-21 02:26:31 +00:00
Vladimir Prus 6012811e90 Set up dependency from 'load' tests to corresponding 'save' tests.
[SVN r33360]
2006-03-17 07:36:47 +00:00
Vladimir Prus cbd1a7c55f Provide test_main in test_inclusion.cpp, as this test links with
boost test execution monitor.


[SVN r33333]
2006-03-13 14:29:32 +00:00
Vladimir Prus eca551f216 The 'test_inclusion' test is not 'run', not 'compile', just as in V1.
[SVN r33248]
2006-03-07 08:40:31 +00:00
Robert Ramey 09fa88a526 workaround for mwerks
[SVN r33245]
2006-03-07 04:50:41 +00:00
Vladimir Prus 060c7ff250 Add BOOST_SERIALIZATION_DYN_LINK to usage requirements.
[SVN r33227]
2006-03-06 08:20:39 +00:00
Robert Ramey 727f4bed80 add to test to test two-phase lookup
[SVN r33224]
2006-03-06 02:59:53 +00:00
Robert Ramey 36a5c0acaf use typename for some compilers
[SVN r33223]
2006-03-06 02:57:42 +00:00
Robert Ramey b20928a387 change to accomodate two-phase lookup
[SVN r33222]
2006-03-06 02:57:04 +00:00
Robert Ramey 5b852f3a2d remove extraneous ;
[SVN r33198]
2006-03-02 06:01:41 +00:00
Robert Ramey 61b7cbb8ba fix demos to play with autolink
[SVN r33197]
2006-03-02 06:00:21 +00:00
Robert Ramey 78aff3739e accomodate CW 8.3 quirks
[SVN r33196]
2006-03-02 05:45:51 +00:00
Robert Ramey c34f4c5310 special versions for hash collections
[SVN r33155]
2006-02-27 16:32:40 +00:00
Robert Ramey 8deb3b2d2d correct test for hash sets and maps
[SVN r33154]
2006-02-27 16:31:23 +00:00
Robert Ramey 704b85f9b7 consolidate redundant code
[SVN r33153]
2006-02-27 16:29:12 +00:00
Robert Ramey 5f575af698 add bucket count
[SVN r33152]
2006-02-27 16:26:55 +00:00
Robert Ramey 24100ba460 make non-copyable to suppress bogus CW error message
[SVN r33151]
2006-02-27 16:25:30 +00:00
Robert Ramey b5bf7d0ebf skip arraysize check for metrowerks
[SVN r33150]
2006-02-27 16:23:37 +00:00
Robert Ramey d72d0215aa correction for hex display
[SVN r33149]
2006-02-27 16:22:43 +00:00
Robert Ramey eb8b71f507 correct hash collection implementations
[SVN r33079]
2006-02-22 16:23:41 +00:00
Robert Ramey 98808cff3a check for undesired autolink
[SVN r33077]
2006-02-22 16:22:08 +00:00
Robert Ramey 8fae67f824 correct test for undesired autolink
[SVN r33076]
2006-02-22 16:21:27 +00:00
Robert Ramey 09b1872b31 correct test for undesired autolink
[SVN r33075]
2006-02-22 16:16:24 +00:00
Robert Ramey e64568d9f3 correct hash tests
[SVN r33074]
2006-02-22 16:15:48 +00:00
Robert Ramey 2050f06a23 correction on include header
[SVN r33016]
2006-02-19 22:33:14 +00:00
Vladimir Prus 91f7a57b7b Link boost_serialization into boost_wserialization, since the latter depends
on the former, and on Windows, DLL with unresolved symbols can't be linked
at all.


[SVN r32912]
2006-02-14 07:17:10 +00:00
Vladimir Prus 580ef7b496 Try to make shared linking work on Windows
[SVN r32883]
2006-02-13 08:52:58 +00:00
Robert Ramey 1340f6bd4f adding class version number
[SVN r32877]
2006-02-13 00:43:27 +00:00
Robert Ramey acd0330a2c add default distructor for class to quiet comeau complaint
[SVN r32853]
2006-02-12 05:57:05 +00:00
Robert Ramey 720dcd01ed correct example for new native binary changes
[SVN r32852]
2006-02-12 05:55:30 +00:00
Robert Ramey f138890397 bump archive version number
[SVN r32851]
2006-02-12 05:53:21 +00:00
Robert Ramey 0204a62bab avoid bogus autooinking of serialization libraries
[SVN r32850]
2006-02-12 05:52:03 +00:00
Robert Ramey 92de1f46e1 correct item versioning
[SVN r32849]
2006-02-12 05:50:33 +00:00
Robert Ramey fff3158667 new config header
[SVN r32848]
2006-02-12 05:49:47 +00:00
Robert Ramey 21b73dd91c correct versioning in collection items and adjust to new header
[SVN r32847]
2006-02-12 05:48:44 +00:00
Robert Ramey 8b049537a3 correct versioning in collection items
[SVN r32846]
2006-02-12 05:47:07 +00:00
Robert Ramey 424316396b adjustment to correct unrequested autolinking
[SVN r32845]
2006-02-12 05:45:17 +00:00
Robert Ramey 4cc8e429b1 cosmetic adjustment
[SVN r32844]
2006-02-12 05:44:06 +00:00
Joaquín M. López Muñoz 6f730f6833 added workaround for CW
[SVN r32807]
2006-02-10 14:45:34 +00:00
Joaquín M. López Muñoz bb638ef5d2 added workaround for CW
[SVN r32758]
2006-02-09 06:58:07 +00:00
Vladimir Prus bf46e282ea Fix one missing #include and a couple of warnings.
[SVN r32736]
2006-02-08 13:43:39 +00:00
Robert Ramey 187cc142f2 fix correction
[SVN r32598]
2006-02-06 04:33:14 +00:00
Robert Ramey dca567fe5d adjust version
[SVN r32597]
2006-02-06 04:32:55 +00:00
Robert Ramey 7839dbb34b adjustment to use streambuf
[SVN r32596]
2006-02-06 04:30:13 +00:00
Robert Ramey d16e356c6d doc changes for next release
[SVN r32575]
2006-02-05 00:50:48 +00:00
Robert Ramey 4c3277a4a0 tweak rounding error
[SVN r32573]
2006-02-04 22:21:32 +00:00
Robert Ramey 3c63b452be update exceptions support
[SVN r32572]
2006-02-04 22:19:53 +00:00
Robert Ramey ecc2bacb3a update boost test macro
[SVN r32571]
2006-02-04 22:18:52 +00:00
Robert Ramey e1dd4b8997 supress printing of A
[SVN r32570]
2006-02-04 22:18:02 +00:00
Robert Ramey 8354dfa5a3 include comment so that bjam recognizes dependency
[SVN r32569]
2006-02-04 22:16:43 +00:00
Robert Ramey 952c14aeb9 fix msvc version
[SVN r32568]
2006-02-04 22:16:01 +00:00
Robert Ramey dce9cae64d now based on streambuf
[SVN r32567]
2006-02-04 22:00:16 +00:00
Robert Ramey 84da232b3b fix msvc version
[SVN r32566]
2006-02-04 21:53:17 +00:00
Robert Ramey a31706b2cd suppress some bogus msvc warnings
[SVN r32565]
2006-02-04 21:49:22 +00:00
Robert Ramey 0a091c642f now based on streambuf
[SVN r32564]
2006-02-04 21:48:04 +00:00
Robert Ramey 6261c0437c fix msvc version number
[SVN r32563]
2006-02-04 21:46:18 +00:00
Robert Ramey 798b3d622f small efficiency adjustments
[SVN r32561]
2006-02-04 21:41:41 +00:00
Robert Ramey f44e93af7c make function inline
[SVN r32560]
2006-02-04 21:33:51 +00:00
Robert Ramey d24e68a943 sync up with config changes
[SVN r32559]
2006-02-04 21:31:02 +00:00
Robert Ramey 427b4a13d1 reformat
[SVN r32558]
2006-02-04 21:27:22 +00:00
Robert Ramey 0f708c15a4 msvc version
[SVN r32557]
2006-02-04 21:25:04 +00:00
Robert Ramey 46d6e11c53 fix header dependcies
[SVN r32556]
2006-02-04 21:23:39 +00:00
Robert Ramey a3fa7030c3 header dependcies and msvc version
[SVN r32555]
2006-02-04 21:22:15 +00:00
Robert Ramey e5ccfdc907 fix header dependencies
[SVN r32554]
2006-02-04 21:21:08 +00:00
Robert Ramey 7d35f9d862 sync up with recent config change
[SVN r32553]
2006-02-04 21:19:47 +00:00
Robert Ramey 36202ac87e needed for streambuf based binary
[SVN r32552]
2006-02-04 21:10:49 +00:00
Robert Ramey 845fc990d1 use unsigned char
[SVN r32551]
2006-02-04 21:05:20 +00:00
Robert Ramey baa9e0e189 fixup gcc version numbers
[SVN r32550]
2006-02-04 21:04:32 +00:00
Robert Ramey f73e01955f change to avoid bogus msvc warning
[SVN r32549]
2006-02-04 21:03:28 +00:00
Robert Ramey c06f9e9c78 small change to avoid problems in some non-conforming compiler
[SVN r32548]
2006-02-04 21:02:02 +00:00
Robert Ramey 337f8095ce tweak msvc version numbers
[SVN r32547]
2006-02-04 21:00:07 +00:00
Robert Ramey 2053d88119 remove exception throw from destructor
[SVN r32546]
2006-02-04 20:49:55 +00:00
Robert Ramey 4b2a01cf4d stream interace tweak
[SVN r32545]
2006-02-04 20:48:26 +00:00
Robert Ramey f0c99c0f28 tweak MSVC version number workaround
[SVN r32544]
2006-02-04 20:46:48 +00:00
Robert Ramey 7b1049f5f5 now based on streambuf
[SVN r32543]
2006-02-04 20:45:24 +00:00
Robert Ramey 853495e336 diminish header dependencies
[SVN r32542]
2006-02-04 20:43:48 +00:00
Robert Ramey 92844c97c3 have load_override forward to common base class
[SVN r32541]
2006-02-04 20:42:37 +00:00
Robert Ramey 8626583733 trap unitialized boolean
[SVN r32540]
2006-02-04 20:35:35 +00:00
Vladimir Prus 34a3f29dcf Add Jamfile.v2
[SVN r32498]
2006-02-01 16:11:57 +00:00
Douglas Gregor 204abedab3 slist updates
[SVN r32477]
2006-01-31 13:30:01 +00:00
Victor A. Wagner Jr. 3308629abf Changed at the request of Jim Douglas <jim@dramatec.co.uk>
[SVN r31997]
2005-12-12 15:22:02 +00:00
Robert Ramey db18e22b35 reconcilation with release 1.33.1
[SVN r31982]
2005-12-11 06:26:04 +00:00
Martin Wille d87c2565b0 -- fixed typo in comment
[SVN r31965]
2005-12-09 12:13:02 +00:00
Dave Abrahams ca8ce2a35c Update to the latest
[SVN r31824]
2005-11-29 18:47:28 +00:00
Rene Rivera 570f97acac Merge from RC_1_33_0.
[SVN r31707]
2005-11-19 20:59:28 +00:00
Rene Rivera 383fcd2cd6 Merge from RC_1_33_0.
[SVN r31705]
2005-11-19 20:24:00 +00:00
John Maddock 454aeece14 Large patch from Ulrich Eckhardt to fix support for EVC++ 4.
[SVN r30670]
2005-08-25 16:27:28 +00:00
Robert Ramey 8ad69e30eb corrected project name
[SVN r30556]
2005-08-12 17:50:13 +00:00
Robert Ramey fada037a5b tweak save/load test sequence - for comeau to static link
[SVN r30554]
2005-08-12 17:25:52 +00:00
Robert Ramey 422625c5b2 add no_exceptions header
[SVN r30552]
2005-08-12 17:20:56 +00:00
Robert Ramey d534e6ceef added default constructor
[SVN r30551]
2005-08-12 17:19:06 +00:00
Robert Ramey 0bee3a5dfd remove unnecessary macros
[SVN r30549]
2005-08-12 17:16:13 +00:00
Robert Ramey 97ae02ebf8 fix const compile error
[SVN r30548]
2005-08-12 17:14:59 +00:00
Robert Ramey d6ca9e07ba correct spelling mistake in error message
[SVN r30547]
2005-08-12 17:11:28 +00:00
Douglas Gregor 204e7a434a Merged from 1.33.0 release
[SVN r30540]
2005-08-12 13:02:37 +00:00
Robert Ramey 8774db8c9e fix derivedpointer link
[SVN r30449]
2005-08-04 03:58:18 +00:00
791 changed files with 43922 additions and 114941 deletions
+28
View File
@@ -0,0 +1,28 @@
# Use, modification, and distribution are
# subject to the Boost Software License, Version 1.0. (See accompanying
# file LICENSE.txt)
#
# Copyright Rene Rivera 2020.
# For Drone CI we use the Starlark scripting language to reduce duplication.
# As the yaml syntax for Drone CI is rather limited.
#
#
globalenv={}
linuxglobalimage="cppalliance/droneubuntu1604:1"
windowsglobalimage="cppalliance/dronevs2019"
def main(ctx):
return [
linux_cxx("TOOLSET=gcc LINK=static,shared Job 0", "g++", packages="", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++', 'DRONE_JOB_UUID': 'b6589fc6ab'}, globalenv=globalenv),
linux_cxx("TOOLSET=gcc LINK=static,shared Job 1", "g++", packages="g++-5", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-5', 'DRONE_JOB_UUID': '356a192b79'}, globalenv=globalenv),
linux_cxx("TOOLSET=gcc LINK=static,shared Job 2", "g++", packages="g++-6", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-6', 'DRONE_JOB_UUID': 'da4b9237ba'}, globalenv=globalenv),
linux_cxx("TOOLSET=gcc LINK=static,shared Job 3", "g++", packages="g++-7", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'g++-7', 'DRONE_JOB_UUID': '77de68daec'}, globalenv=globalenv),
linux_cxx("TOOLSET=clang LINK=static,shared Job 4", "clang++", packages="", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': '1b64538924'}, globalenv=globalenv),
linux_cxx("TOOLSET=clang LINK=static,shared Job 5", "clang++", packages="libc++-dev", buildtype="boost", buildscript="drone", image=linuxglobalimage, environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++-libc++', 'DRONE_JOB_UUID': 'ac3478d69a'}, globalenv=globalenv),
osx_cxx("TOOLSET=clang LINK=static,shared Job 6", "clang++", packages="", buildtype="boost", buildscript="drone", environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': 'c1dfd96eea'}, globalenv=globalenv),
osx_cxx("TOOLSET=clang LINK=static,shared Job 7", "clang++", packages="", buildtype="boost", buildscript="drone", xcode_version="10", environment={'TOOLSET': 'clang', 'LINK': 'static,shared', 'TRAVIS_COMPILER': 'clang++', 'DRONE_JOB_UUID': '902ba3cda1'}, globalenv=globalenv),
]
# from https://github.com/boostorg/boost-ci
load("@boost_ci//ci/drone/:functions.star", "linux_cxx","windows_cxx","osx_cxx","freebsd_cxx")
+37
View File
@@ -0,0 +1,37 @@
#!/bin/bash
# Copyright 2020 Rene Rivera, Sam Darwin
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE.txt or copy at http://boost.org/LICENSE_1_0.txt)
set -e
export TRAVIS_BUILD_DIR=$(pwd)
export DRONE_BUILD_DIR=$(pwd)
export TRAVIS_BRANCH=$DRONE_BRANCH
export VCS_COMMIT_ID=$DRONE_COMMIT
export GIT_COMMIT=$DRONE_COMMIT
export REPO_NAME=$DRONE_REPO
export PATH=~/.local/bin:/usr/local/bin:$PATH
if [ "$DRONE_JOB_BUILDTYPE" == "boost" ]; then
echo '==================================> INSTALL'
BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
cd ..
git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
cd boost-root
git submodule update --init tools/build
git submodule update --init libs/config
git submodule update --init tools/boostdep
cp -r $TRAVIS_BUILD_DIR/* libs/serialization
python tools/boostdep/depinst/depinst.py serialization
./bootstrap.sh
./b2 headers
echo '==================================> SCRIPT'
echo "using $TOOLSET : : $TRAVIS_COMPILER ;" > ~/user-config.jam
./b2 -j 3 libs/serialization/test toolset=$TOOLSET link=${LINK:-shared}
fi
+634
View File
@@ -0,0 +1,634 @@
name: CI
on:
pull_request:
push:
branches:
- master
- develop
- feature/**
env:
UBSAN_OPTIONS: print_stacktrace=1
jobs:
posix:
strategy:
fail-fast: false
matrix:
include:
- toolset: gcc-7
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-7-multilib
address-model: 32,64
- toolset: gcc-8
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-8-multilib
address-model: 32,64
- toolset: gcc-9
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: g++-9-multilib
address-model: 32,64
- toolset: gcc-10
cxxstd: "11,14,17,2a"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-10-multilib
address-model: 32,64
- toolset: gcc-11
cxxstd: "11,14,17,20"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-11-multilib
address-model: 32,64
- toolset: gcc-12
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: g++-12-multilib
address-model: 32,64
- toolset: gcc-13
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: g++-13-multilib
address-model: 32,64
- toolset: gcc-14
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: g++-14-multilib
address-model: 32,64
- toolset: gcc-15
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:26.04
os: ubuntu-latest
install: g++-15-multilib
address-model: 32,64
- toolset: gcc-16
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:26.04
os: ubuntu-latest
install: g++-16-multilib
address-model: 32,64
- toolset: clang
compiler: clang++-6.0
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-6.0
- toolset: clang
compiler: clang++-7
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-7
- toolset: clang
compiler: clang++-8
cxxstd: "11,14,17"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-8
- toolset: clang
compiler: clang++-9
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-9
- toolset: clang
compiler: clang++-10
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-10
- toolset: clang
compiler: clang++-11
cxxstd: "11,14,17,2a"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-11
- toolset: clang
compiler: clang++-12
cxxstd: "11,14,17,20"
container: ubuntu:20.04
os: ubuntu-latest
install: clang-12
- toolset: clang
compiler: clang++-13
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-13
- toolset: clang
compiler: clang++-14
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-14
- toolset: clang
compiler: clang++-15
cxxstd: "11,14,17,20,2b"
container: ubuntu:22.04
os: ubuntu-latest
install: clang-15
- toolset: clang
compiler: clang++-16
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-16
- toolset: clang
compiler: clang++-17
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-17
- toolset: clang
compiler: clang++-18
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-18
- toolset: clang
compiler: clang++-19
cxxstd: "11,14,17,20,2b"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-19
- toolset: clang
compiler: clang++-20
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:24.04
os: ubuntu-latest
install: clang-20
- toolset: clang
compiler: clang++-21
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:26.04
os: ubuntu-latest
install: clang-21
- toolset: clang
compiler: clang++-22
cxxstd: "11,14,17,20,23,2c"
container: ubuntu:26.04
os: ubuntu-latest
install: clang-22
- toolset: clang
cxxstd: "11,14,17,20,2b"
os: macos-14
- toolset: clang
cxxstd: "11,14,17,20,23,2c"
os: macos-15
- toolset: clang
cxxstd: "11,14,17,20,23,2c"
os: macos-26
runs-on: ${{matrix.os}}
container: ${{matrix.container}}
defaults:
run:
shell: bash
steps:
- name: Setup container environment
if: matrix.container
run: |
apt-get update
apt-get -y install sudo python3 git g++ curl
- uses: actions/checkout@v6
- name: Install packages
if: matrix.install
run: |
sudo apt-get update
sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
mkdir -p libs/$LIBRARY
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python3 tools/boostdep/depinst/depinst.py -I benchmark -I example --git_args "--jobs 3" $LIBRARY
./bootstrap.sh
./b2 -d0 headers
- name: Create user-config.jam
if: matrix.compiler
run: |
echo "using ${{matrix.toolset}} : : ${{matrix.compiler}} ;" > ~/user-config.jam
- name: Run tests
run: |
cd ../boost-root
export ADDRMD=${{matrix.address-model}}
./b2 -j3 libs/$LIBRARY/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} ${ADDRMD:+address-model=$ADDRMD} variant=debug,release
windows:
strategy:
fail-fast: false
matrix:
include:
- toolset: msvc-14.3
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2022
- toolset: msvc-14.5
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2025-vs2026
- toolset: clang-win
cxxstd: "14,17,20,latest"
addrmd: 32,64
os: windows-2025
- toolset: gcc
cxxstd: "11,14,17,2a"
addrmd: 64
os: windows-2025
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py -I benchmark -I example --git_args "--jobs 3" %LIBRARY%
cmd /c bootstrap
b2 -d0 headers
- name: Run tests
shell: cmd
run: |
cd ../boost-root
b2 -j3 libs/%LIBRARY%/test toolset=${{matrix.toolset}} cxxstd=${{matrix.cxxstd}} address-model=${{matrix.addrmd}} variant=debug,release embed-manifest-via=linker
posix-cmake-subdir:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
mkdir -p libs/$LIBRARY
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Use library with add_subdirectory
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build .
ctest --output-on-failure --no-tests=error
posix-cmake-install:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
mkdir -p libs/$LIBRARY
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
- name: Configure
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
- name: Install
run: |
cd ../boost-root/__build__
cmake --build . --target install
- name: Use the installed library
run: |
cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
cmake --build .
ctest --output-on-failure --no-tests=error
posix-cmake-test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Install packages
if: matrix.install
run: sudo apt-get -y install ${{matrix.install}}
- name: Setup Boost
run: |
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
LIBRARY=${GITHUB_REPOSITORY#*/}
echo LIBRARY: $LIBRARY
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
echo GITHUB_REF: $GITHUB_REF
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
REF=${REF#refs/heads/}
echo REF: $REF
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
echo BOOST_BRANCH: $BOOST_BRANCH
cd ..
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
mkdir -p libs/$LIBRARY
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py -I benchmark -I example --git_args "--jobs 3" $LIBRARY
- name: Configure
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DBUILD_TESTING=ON ..
- name: Build tests
run: |
cd ../boost-root/__build__
cmake --build . --target tests
- name: Run tests
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error
windows-cmake-subdir:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
- name: Use library with add_subdirectory (Debug)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
mkdir __build__ && cd __build__
cmake ..
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
- name: Use library with add_subdirectory (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
windows-cmake-install:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
- name: Configure
shell: cmd
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
- name: Install (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target install --config Debug
- name: Install (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target install --config Release
- name: Use the installed library (Debug)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
cmake --build . --config Debug
ctest --output-on-failure --no-tests=error -C Debug
- name: Use the installed library (Release)
shell: cmd
run: |
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
cmake --build . --config Release
ctest --output-on-failure --no-tests=error -C Release
windows-cmake-test:
strategy:
fail-fast: false
matrix:
include:
- os: windows-latest
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v6
- name: Setup Boost
shell: cmd
run: |
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
echo LIBRARY: %LIBRARY%
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
echo GITHUB_REF: %GITHUB_REF%
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
set BOOST_BRANCH=develop
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
echo BOOST_BRANCH: %BOOST_BRANCH%
cd ..
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
cd boost-root
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
git submodule update --init tools/boostdep
python tools/boostdep/depinst/depinst.py -I benchmark -I example --git_args "--jobs 3" %LIBRARY%
- name: Configure
shell: cmd
run: |
cd ../boost-root
mkdir __build__ && cd __build__
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DBUILD_TESTING=ON ..
- name: Build tests (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target tests --config Debug
- name: Run tests (Debug)
shell: cmd
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Debug
- name: Build tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
cmake --build . --target tests --config Release
- name: Run tests (Release)
shell: cmd
run: |
cd ../boost-root/__build__
ctest --output-on-failure --no-tests=error -C Release
View File
+103
View File
@@ -0,0 +1,103 @@
# Copyright 2016, 2017 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
language: cpp
sudo: false
cache:
ccache: true
branches:
only:
- master
- develop
- /feature\/.*/
env:
matrix:
- BOGUS_JOB=true
matrix:
exclude:
- env: BOGUS_JOB=true
include:
- os: linux
compiler: g++
env: TOOLSET=gcc LINK=static,shared
- os: linux
compiler: g++-5
env: TOOLSET=gcc LINK=static,shared
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
compiler: g++-6
env: TOOLSET=gcc LINK=static,shared
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
compiler: g++-7
env: TOOLSET=gcc LINK=static,shared
addons:
apt:
packages:
- g++-7
sources:
- ubuntu-toolchain-r-test
- os: linux
compiler: clang++
env: TOOLSET=clang LINK=static,shared
- os: linux
compiler: clang++-libc++
env: TOOLSET=clang LINK=static,shared
addons:
apt:
packages:
- libc++-dev
- os: osx
compiler: clang++
env: TOOLSET=clang LINK=static,shared
- os: osx
osx_image: xcode10
compiler: clang++
env: TOOLSET=clang LINK=static,shared
install:
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
- cd ..
- git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule update --init tools/build
- git submodule update --init libs/config
- git submodule update --init tools/boostdep
- cp -r $TRAVIS_BUILD_DIR/* libs/serialization
- python tools/boostdep/depinst/depinst.py serialization
- ./bootstrap.sh
- ./b2 headers
script:
- |-
echo "using $TOOLSET : : $TRAVIS_COMPILER ;" > ~/user-config.jam
- ./b2 -j 3 libs/serialization/test toolset=$TOOLSET link=${LINK:-shared}
notifications:
email:
on_success: always
+413
View File
@@ -0,0 +1,413 @@
# CMake build control file for Serialization Library tests
cmake_minimum_required(VERSION 3.5)
if (POLICY CMP0054)
cmake_policy (SET CMP0054 NEW)
endif (POLICY CMP0054)
if (POLICY CMP0063)
cmake_policy (SET CMP0063 NEW)
endif (POLICY CMP0063)
project("serialization")
#
# Compiler settings
#
message(STATUS "C++ compiler is ${CMAKE_CXX_COMPILER_ID}" )
add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})
message(STATUS "C compiler is ${CMAKE_C_COMPILER_ID}" )
if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
add_definitions( -ftemplate-depth=255 )
# we use gcc to test for C++03 compatibility
set(COMPILER_SUPPORTS_CXX11 FALSE)
elseif( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
add_definitions( /wd4996 )
set(COMPILER_SUPPORTS_CXX11 TRUE)
elseif( CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=300")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0" )
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -O3" )
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -dead_strip")
set(COMPILER_SUPPORTS_CXX11 TRUE)
endif()
add_definitions( -std=c++11 )
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#
# Locate Project Prerequisites
#
# Boost
#
# Project settings
#
option(BUILD_SHARED_LIBS "Build Shared Libraries" true)
find_package(Boost 1.82 REQUIRED COMPONENTS system filesystem)
if(NOT Boost_FOUND)
message("Boost NOT Found!")
else()
message(STATUS "Boost Found!")
endif()
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(VISIBILITY_INLINES_HIDDEN YES)
# enable usage of CHECK_INCLUDE_FILE_CXX
include(CheckIncludeFileCXX)
# list of archive names for which tests should be generated
set(archive_list text_archive text_warchive binary_archive xml_archive xml_warchive)
# set(archive_list xml_warchive)
# list of tests generated by each function call
set(test_list)
###########################
# library builds
add_library(serialization
../src/archive_exception.cpp
../src/basic_archive.cpp
../src/basic_iarchive.cpp
../src/basic_iserializer.cpp
../src/basic_oarchive.cpp
../src/basic_oserializer.cpp
../src/basic_pointer_iserializer.cpp
../src/basic_pointer_oserializer.cpp
../src/basic_serializer_map.cpp
../src/basic_text_iprimitive.cpp
../src/basic_text_oprimitive.cpp
../src/basic_xml_archive.cpp
../src/binary_iarchive.cpp
../src/binary_oarchive.cpp
../src/extended_type_info.cpp
../src/extended_type_info_typeid.cpp
../src/extended_type_info_no_rtti.cpp
../src/stl_port.cpp
../src/text_iarchive.cpp
../src/text_oarchive.cpp
../src/polymorphic_iarchive.cpp
../src/polymorphic_oarchive.cpp
../src/polymorphic_text_iarchive.cpp
../src/polymorphic_text_oarchive.cpp
../src/polymorphic_binary_iarchive.cpp
../src/polymorphic_binary_oarchive.cpp
../src/polymorphic_xml_iarchive.cpp
../src/polymorphic_xml_oarchive.cpp
../src/void_cast.cpp
../src/xml_grammar.cpp
../src/xml_iarchive.cpp
../src/xml_oarchive.cpp
../src/xml_archive_exception.cpp
../src/codecvt_null.cpp
../src/utf8_codecvt_facet.cpp
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
)
target_include_directories(serialization PUBLIC ${Boost_INCLUDE_DIR})
add_library(wserialization
../src/basic_text_wiprimitive.cpp
../src/basic_text_woprimitive.cpp
../src/text_wiarchive.cpp
../src/text_woarchive.cpp
../src/polymorphic_text_wiarchive.cpp
../src/polymorphic_text_woarchive.cpp
../src/xml_wiarchive.cpp
../src/xml_woarchive.cpp
../src/polymorphic_xml_wiarchive.cpp
../src/polymorphic_xml_woarchive.cpp
../src/xml_wgrammar.cpp
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
)
target_include_directories(wserialization PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(wserialization PUBLIC serialization)
# end library build
###########################
###########################
# test targets
function( serialization_test test_name)
set(arglist)
foreach(a IN ITEMS ${ARGN} )
set(arglist ${arglist} ../test/${a}.cpp)
endforeach()
message(STATUS ${test_name})
add_executable( ${test_name} ../test/${test_name}.cpp ${arglist} )
target_include_directories(${test_name} PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(${test_name} serialization wserialization Boost::filesystem)
add_test( ${test_name} ${test_name} )
endfunction(serialization_test)
function(archive_test test_name)
set(test_listx)
set(arglist)
foreach(a IN ITEMS ${ARGN} )
set(arglist ${arglist} ../test/${a}.cpp)
endforeach()
foreach(
archive-name
IN ITEMS ${archive_list}
)
set(amended_test_name ${test_name}_${archive-name})
add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})
set_property(
TARGET ${amended_test_name}
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${archive-name}.hpp
)
target_include_directories(${amended_test_name} PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(${amended_test_name} serialization wserialization Boost::filesystem)
add_test(${amended_test_name} ${amended_test_name})
set(test_listx ${test_listx} ${amended_test_name})
endforeach()
set(test_list ${test_listx} PARENT_SCOPE)
endfunction(archive_test)
function(polymorphic_archive_test test_name)
set(test_listx)
set(arglist)
foreach(a IN ITEMS ${ARGN} )
set(arglist ${arglist} ../test/${a}.cpp)
endforeach()
foreach(
archive-name
IN ITEMS ${archive_list}
)
set(amended_archive_name polymorphic_${archive-name})
set(amended_test_name ${test_name}_${amended_archive_name})
add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})
set_property(
TARGET ${amended_test_name}
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${amended_archive_name}.hpp
)
message(STATUS ${amended_test_name} " " ${arglist} " " ${amended_archive_name})
target_include_directories(${amended_test_name} PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(${amended_test_name} serialization wserialization Boost::filesystem)
add_test(${amended_test_name} ${amended_test_name})
set(test_listx ${test_listx} ${amended_test_name})
endforeach()
set(test_list ${test_listx} PARENT_SCOPE)
endfunction(polymorphic_archive_test)
enable_testing()
message(STATUS dll_a)
add_library(dll_a SHARED ../test/dll_a.cpp)
target_link_libraries(dll_a serialization)
message(STATUS dll_polymorphic_base)
add_library(dll_polymorphic_base SHARED ../test/dll_polymorphic_base.cpp)
target_link_libraries(dll_polymorphic_base serialization)
message(STATUS dll_polymorphic_derived2)
add_library(dll_polymorphic_derived2 SHARED ../test/dll_polymorphic_derived2.cpp)
target_link_libraries(dll_polymorphic_derived2 dll_polymorphic_base serialization)
# compile test_dll_plugin.cpp
# Running the following test requires that the test know the directory
# in which the dll is stored. I don't know how to extract this from bjam
# serialization(test_dll_plugin : : dll_polymorphic_derived2_lib)
if(BUILD_SHARED_LIBS)
# this test can only be made to work if we're linking with shared
# libraries. Basically the build systems like to have all shared
# or all static so if we're building with static C++ libraries
# then linking with a shared one - we need multiple C++ libraries
# and things get complex. So just run this test when we're
# building with shared libraries (dll in windows speak)
serialization_test(test_dll_simple)
target_link_libraries(test_dll_simple dll_a serialization)
endif()
serialization_test(test_private_ctor)
serialization_test(test_reset_object_address A)
serialization_test(test_void_cast)
serialization_test(test_mult_archive_types)
serialization_test(test_iterators)
serialization_test(test_iterators_base64)
serialization_test(test_inclusion)
serialization_test(test_inclusion2)
serialization_test(test_smart_cast)
serialization_test(test_codecvt_null)
serialization_test(test_strong_typedef)
serialization_test(test_singleton)
serialization_test(test_singleton_inherited)
serialization_test(test_singleton_plain)
archive_test(test_native_array A)
archive_test(test_boost_array A)
if(COMPILER_SUPPORTS_CXX11)
archive_test(test_array A)
endif()
archive_test(test_binary)
archive_test(test_bitset)
archive_test(test_class_info_save)
archive_test(test_class_info_load)
archive_test(test_complex)
archive_test(test_contained_class A)
archive_test(test_cyclic_ptrs A)
archive_test(test_delete_pointer)
archive_test(test_deque A)
archive_test(test_derived)
archive_test(test_derived_class A)
archive_test(test_diamond)
archive_test(test_diamond_complex)
CHECK_INCLUDE_FILE_CXX(forward_list FORWARD_LIST_FOUND)
if(FORWARD_LIST_FOUND)
message(STATUS "forward_list header found")
archive_test(test_forward_list A)
archive_test(test_forward_list_ptrs A)
else()
message(STATUS "forward_list header NOT found")
endif()
archive_test(test_helper_support)
archive_test(test_interrupts)
archive_test(test_list A)
archive_test(test_list_ptrs A)
archive_test(test_map A)
CHECK_INCLUDE_FILE_CXX(hash_map HASH_MAP_FOUND)
if(HASH_MAP_FOUND)
archive_test(test_map_hashed A)
endif()
archive_test(test_mi)
archive_test(test_multiple_ptrs A)
archive_test(test_multiple_inheritance)
archive_test(test_new_operator A)
archive_test(test_non_intrusive)
archive_test(test_non_default_ctor)
archive_test(test_non_default_ctor2)
archive_test(test_null_ptr)
archive_test(test_nvp A)
archive_test(test_object)
archive_test(test_optional)
archive_test(test_primitive)
archive_test(test_priority_queue A)
archive_test(test_private_base)
archive_test(test_private_base2)
archive_test(test_queue A)
archive_test(test_recursion A)
archive_test(test_registered)
archive_test(test_set A)
CHECK_INCLUDE_FILE_CXX(hash_set HASH_SET_FOUND)
if(HASH_SET_FOUND)
archive_test(test_set_hashed A)
endif()
archive_test(test_shared_ptr)
archive_test(test_shared_ptr_multi_base)
archive_test(test_shared_ptr_132)
archive_test(test_simple_class A)
archive_test(test_simple_class_ptr A)
CHECK_INCLUDE_FILE_CXX(slist SLIST_FOUND)
if(SLIST_FOUND)
message(STATUS "slist header found")
archive_test(test_slist A)
archive_test(test_slist_ptr A)
endif()
archive_test(test_stack A)
archive_test(test_split)
archive_test(test_tracking)
archive_test(test_unregistered)
archive_test(test_unique_ptr)
archive_test(test_valarray)
archive_test(test_variant A)
archive_test(test_vector A)
if(BUILD_SHARED_LIBS)
polymorphic_archive_test(test_dll_exported polymorphic_derived1)
foreach(test_name IN ITEMS ${test_list} )
target_link_libraries(${test_name} dll_polymorphic_derived2 dll_polymorphic_base serialization wserialization)
endforeach()
endif()
polymorphic_archive_test(test_no_rtti polymorphic_base polymorphic_derived1 polymorphic_derived2)
polymorphic_archive_test(test_exported polymorphic_base polymorphic_derived1 polymorphic_derived2)
polymorphic_archive_test(test_polymorphic test_polymorphic_A A)
polymorphic_archive_test(test_polymorphic2 test_polymorphic2imp)
polymorphic_archive_test(test_p_helper)
# end test targets
####################
####################
# add headers in IDE
# for serialization
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/*.hpp"
)
add_custom_target(archive SOURCES ${x})
set_property(TARGET archive PROPERTY FOLDER "serialization")
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/detail/*.hpp"
)
add_custom_target(archive-detail SOURCES ${x})
set_property(TARGET archive-detail PROPERTY FOLDER "serialization")
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/impl/*.ipp"
)
add_custom_target(archive-impl SOURCES ${x})
set_property(TARGET archive-impl PROPERTY FOLDER "serialization")
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/iterators/*.hpp"
)
add_custom_target(archive-iterators SOURCES ${x})
set_property(TARGET archive-iterators PROPERTY FOLDER "serialization")
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/serialization/*.hpp"
)
add_custom_target(serialization-headers SOURCES ${x})
set_property(TARGET serialization-headers PROPERTY FOLDER "serialization")
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/serialization/detail/*.hpp"
)
add_custom_target(serialization-detail SOURCES ${x})
set_property(TARGET serialization-detail PROPERTY FOLDER "serialization")
# for wserialization
file(GLOB x
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/../include/boost/archive/*_w*.hpp"
)
add_custom_target(wserialization_headers SOURCES ${x})
set_property(TARGET wserialization_headers PROPERTY FOLDER "wserialization")
# end headers in IDE
####################
#####################
# add test project to run misc tests
add_executable( test_z ../test/test_z.cpp)
target_link_libraries(test_z serialization wserialization ${Boost_LIBRARIES})
# end test project
#####################
+124
View File
@@ -0,0 +1,124 @@
# Copyright 2020, 2021 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# https://www.boost.org/LICENSE_1_0.txt
cmake_minimum_required(VERSION 3.5...3.16)
project(boost_serialization VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
add_library(boost_serialization
src/archive_exception.cpp
src/basic_archive.cpp
src/basic_iarchive.cpp
src/basic_iserializer.cpp
src/basic_oarchive.cpp
src/basic_oserializer.cpp
src/basic_pointer_iserializer.cpp
src/basic_pointer_oserializer.cpp
src/basic_serializer_map.cpp
src/basic_text_iprimitive.cpp
src/basic_text_oprimitive.cpp
src/basic_xml_archive.cpp
src/binary_iarchive.cpp
src/binary_oarchive.cpp
src/codecvt_null.cpp
src/extended_type_info.cpp
src/extended_type_info_no_rtti.cpp
src/extended_type_info_typeid.cpp
src/polymorphic_binary_iarchive.cpp
src/polymorphic_binary_oarchive.cpp
src/polymorphic_iarchive.cpp
src/polymorphic_oarchive.cpp
src/polymorphic_text_iarchive.cpp
src/polymorphic_text_oarchive.cpp
src/polymorphic_xml_iarchive.cpp
src/polymorphic_xml_oarchive.cpp
src/stl_port.cpp
src/text_iarchive.cpp
src/text_oarchive.cpp
src/utf8_codecvt_facet.cpp
src/void_cast.cpp
src/xml_archive_exception.cpp
src/xml_grammar.cpp
src/xml_iarchive.cpp
src/xml_oarchive.cpp
)
add_library(boost_wserialization
src/basic_text_wiprimitive.cpp
src/basic_text_woprimitive.cpp
src/binary_wiarchive.cpp
src/binary_woarchive.cpp
src/polymorphic_text_wiarchive.cpp
src/polymorphic_text_woarchive.cpp
src/polymorphic_xml_wiarchive.cpp
src/polymorphic_xml_woarchive.cpp
src/text_wiarchive.cpp
src/text_woarchive.cpp
src/xml_wgrammar.cpp
src/xml_wiarchive.cpp
src/xml_woarchive.cpp
)
add_library(Boost::serialization ALIAS boost_serialization)
add_library(Boost::wserialization ALIAS boost_wserialization)
target_include_directories(boost_serialization PUBLIC include)
target_include_directories(boost_wserialization PUBLIC include)
target_link_libraries(boost_serialization
PUBLIC
Boost::array
Boost::assert
Boost::config
Boost::core
Boost::detail
Boost::integer
Boost::io
Boost::iterator
Boost::move
Boost::mpl
Boost::optional
Boost::predef
Boost::preprocessor
Boost::smart_ptr
Boost::spirit
Boost::type_traits
Boost::unordered
Boost::utility
Boost::variant
PRIVATE
Boost::function
)
target_link_libraries(boost_wserialization PUBLIC boost_serialization)
target_compile_definitions(boost_serialization
PUBLIC BOOST_SERIALIZATION_NO_LIB
# Source files already define BOOST_SERIALIZATION_SOURCE
# PRIVATE BOOST_SERIALIZATION_SOURCE
)
target_compile_definitions(boost_wserialization
PUBLIC BOOST_SERIALIZATION_NO_LIB
# Source files already define BOOST_SERIALIZATION_SOURCE
# PRIVATE BOOST_SERIALIZATION_SOURCE
)
if(BUILD_SHARED_LIBS)
target_compile_definitions(boost_serialization PUBLIC BOOST_SERIALIZATION_DYN_LINK)
target_compile_definitions(boost_wserialization PUBLIC BOOST_SERIALIZATION_DYN_LINK)
else()
target_compile_definitions(boost_serialization PUBLIC BOOST_SERIALIZATION_STATIC_LINK)
target_compile_definitions(boost_wserialization PUBLIC BOOST_SERIALIZATION_STATIC_LINK)
endif()
if(BOOST_SUPERPROJECT_VERSION AND NOT CMAKE_VERSION VERSION_LESS 3.13)
boost_install(TARGETS boost_serialization boost_wserialization VERSION ${BOOST_SUPERPROJECT_VERSION} HEADER_DIRECTORY include)
endif()
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
add_subdirectory(test)
endif()
+82
View File
@@ -0,0 +1,82 @@
# Copyright 2016 Peter Dimov
# Copyright 2016 Robert Ramey
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
version: 1.0.{build}-{branch}
shallow_clone: true
branches:
only:
- develop
# - master
environment:
matrix:
- BUILD_TOOLSET: gcc
BUILD_LINK: static
- BUILD_TOOLSET: gcc
BUILD_LINK: shared
- BUILD_TOOLSET: msvc-14.0
BUILD_LINK: static
- BUILD_TOOLSET: msvc-14.0
BUILD_LINK: shared
install:
- cd ..
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init libs/align
- git submodule init libs/array
- git submodule init libs/assert
- git submodule init libs/bind
- git submodule init libs/compatibility
- git submodule init libs/concept_check
- git submodule init libs/config
- git submodule init libs/container
- git submodule init libs/container_hash
- git submodule init libs/core
- git submodule init libs/detail
- git submodule init libs/filesystem
- git submodule init libs/function
- git submodule init libs/functional
- git submodule init libs/integer
- git submodule init libs/intrusive
- git submodule init libs/io
- git submodule init libs/iterator
- git submodule init libs/lexical_cast
- git submodule init libs/math
- git submodule init libs/move
- git submodule init libs/mpl
- git submodule init libs/numeric/conversion
- git submodule init libs/optional
- git submodule init libs/predef
- git submodule init libs/preprocessor
- git submodule init libs/range
- git submodule init libs/smart_ptr
- git submodule init libs/spirit
- git submodule init libs/system
- git submodule init libs/throw_exception
- git submodule init libs/tuple
- git submodule init libs/type_index
- git submodule init libs/type_traits
- git submodule init libs/unordered
- git submodule init libs/utility
- git submodule init libs/variant
- git submodule init libs/winapi
- git submodule init tools/boost_install
- git submodule init libs/headers
- git submodule init tools/build
- git submodule update
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\serialization
- set PATH=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin;%CD%;%PATH%
- bootstrap gcc
- b2 headers
build: off
test_script:
- cd libs/serialization/test
- b2 -j2 toolset=%BUILD_TOOLSET% link=%BUILD_LINK%
-3
View File
@@ -1,3 +0,0 @@
This file is used by the project manager only and should be treated like the project file
-147
View File
@@ -1,147 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
<MACROS>
<VERSION value="BCB.06.00"/>
<PROJECT value="test_simple_class.exe"/>
<OBJFILES value="..\test\test_simple_class.obj"/>
<RESFILES value="test_simple_class.res"/>
<IDLFILES value=""/>
<IDLGENFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="..\..\..\bin\boost\libs\serialization\build\libboost_serialization.lib\borland\debug\runtime-link-static\libboost_serialization.lib
..\..\..\bin\boost\libs\serialization\build\libboost_wserialization.lib\borland\debug\runtime-link-static\libboost_wserialization.lib
..\..\..\bin\boost\libs\test\build\libboost_test_exec_monitor.lib\borland\debug\runtime-link-static\libboost_test_exec_monitor.lib"/>
<LIBRARIES value=""/>
<SPARELIBS value=""/>
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
indy.bpi bcb2kaxserver.bpi"/>
<PATHCPP value=".;..\test"/>
<PATHPAS value=".;"/>
<PATHRC value=".;"/>
<PATHASM value=".;"/>
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="ilink32"/>
<USERDEFINES value="_DEBUG;BOOST_ARCHIVE_TEST=xml_warchive.hpp"/>
<SYSDEFINES value="NO_STRICT;_NO_VCL;USEPACKAGES"/>
<MAINSOURCE value="test_simple_class.bpf"/>
<INCLUDEPATH value="..\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl"/>
<LIBPATH value="..\test;$(BCB)\lib\obj;$(BCB)\lib"/>
<WARNINGS value="-w-par"/>
<OTHERFILES value=""/>
</MACROS>
<OPTIONS>
<IDLCFLAGS value="-I..\test -IC:\boost_1_31_0 -I$(BCB)\include -I$(BCB)\include\vcl
-src_suffix cpp -D_DEBUG -DBOOST_ARCHIVE_TEST=xml_warchive.hpp -boa"/>
<CFLAG1 value="-Od -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -tWC -tWM -c"/>
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
<RFLAGS value=""/>
<AFLAGS value="/mx /w2 /zd"/>
<LFLAGS value="-D&quot;&quot; -ap -Tpe -x -Gn -v"/>
<OTHERFILES value=""/>
</OPTIONS>
<LINKER>
<ALLOBJ value="c0x32.obj $(PACKAGES) $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
<OTHERFILES value=""/>
</LINKER>
<FILELIST>
<FILE FILENAME="test_simple_class.res" FORMNAME="" UNITNAME="test_simple_class.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="test_simple_class.bpf" FORMNAME="" UNITNAME="test_simple_class" CONTAINERID="BPF" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\test\test_simple_class.cpp" FORMNAME="" UNITNAME="test_simple_class" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\serialization\build\libboost_serialization.lib\borland\debug\runtime-link-static\libboost_serialization.lib" FORMNAME="" UNITNAME="libboost_serialization.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\serialization\build\libboost_wserialization.lib\borland\debug\runtime-link-static\libboost_wserialization.lib" FORMNAME="" UNITNAME="libboost_wserialization.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\test\build\libboost_test_exec_monitor.lib\borland\debug\runtime-link-static\libboost_test_exec_monitor.lib" FORMNAME="" UNITNAME="libboost_test_exec_monitor.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
</FILELIST>
<BUILDTOOLS>
</BUILDTOOLS>
<IDEOPTIONS>
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1033
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=5
Item0=..\test;C:\boost_1_31_0\libs\serialization\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl
Item1=C:\boost_1_31_0\libs\serialization\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl
Item2=C:\boost_1_31_0\libs;C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
Item3=C:\boost_1_31_0\libs\;C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
Item4=C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=2
Item0=..\test;C:\boost_1_31_0\libs\serialization\test;$(BCB)\lib\obj;$(BCB)\lib
Item1=C:\boost_1_31_0\libs\serialization\test;$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=2
Item0=_DEBUG;BOOST_ARCHIVE_TEST=xml_warchive.hpp
Item1=_DEBUG
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl
[Parameters]
RunParams=
Launcher=
UseLauncher=0
DebugCWD=
HostApplication=
RemoteHost=
RemotePath=
RemoteLauncher=
RemoteCWD=
RemoteDebug=0
[Compiler]
ShowInfoMsgs=0
LinkDebugVcl=1
LinkCGLIB=0
[CORBA]
AddServerUnit=1
AddClientUnit=1
PrecompiledHeaders=1
[Language]
ActiveLang=
ProjectLang=
RootDir=
</IDEOPTIONS>
</PROJECT>
Binary file not shown.
-3
View File
@@ -1,3 +0,0 @@
This file is used by the project manager only and should be treated like the project file
-147
View File
@@ -1,147 +0,0 @@
<?xml version='1.0' encoding='utf-8' ?>
<!-- C++Builder XML Project -->
<PROJECT>
<MACROS>
<VERSION value="BCB.06.00"/>
<PROJECT value="test_simple_class.exe"/>
<OBJFILES value="..\test\test_simple_class.obj"/>
<RESFILES value="test_simple_class.res"/>
<IDLFILES value=""/>
<IDLGENFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="..\..\..\bin\boost\libs\serialization\build\libboost_serialization.lib\borland\debug\runtime-link-static\libboost_serialization.lib
..\..\..\bin\boost\libs\serialization\build\libboost_wserialization.lib\borland\debug\runtime-link-static\libboost_wserialization.lib
..\..\..\bin\boost\libs\test\build\libboost_test_exec_monitor.lib\borland\debug\runtime-link-static\libboost_test_exec_monitor.lib"/>
<LIBRARIES value=""/>
<SPARELIBS value=""/>
<PACKAGES value="vcl.bpi rtl.bpi dbrtl.bpi adortl.bpi vcldb.bpi vclx.bpi bdertl.bpi
vcldbx.bpi ibxpress.bpi dsnap.bpi cds.bpi bdecds.bpi qrpt.bpi teeui.bpi
teedb.bpi tee.bpi dss.bpi teeqr.bpi visualclx.bpi visualdbclx.bpi
dsnapcrba.bpi dsnapcon.bpi bcbsmp.bpi vclie.bpi xmlrtl.bpi inet.bpi
inetdbbde.bpi inetdbxpress.bpi inetdb.bpi nmfast.bpi webdsnap.bpi
bcbie.bpi websnap.bpi soaprtl.bpi dclocx.bpi dbexpress.bpi dbxcds.bpi
indy.bpi bcb2kaxserver.bpi"/>
<PATHCPP value=".;..\test"/>
<PATHPAS value=".;"/>
<PATHRC value=".;"/>
<PATHASM value=".;"/>
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="ilink32"/>
<USERDEFINES value="_DEBUG;BOOST_ARCHIVE_TEST=xml_warchive.hpp"/>
<SYSDEFINES value="NO_STRICT;_NO_VCL;USEPACKAGES"/>
<MAINSOURCE value="test_simple_class.bpf"/>
<INCLUDEPATH value="..\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl"/>
<LIBPATH value="..\test;$(BCB)\lib\obj;$(BCB)\lib"/>
<WARNINGS value="-w-par"/>
<OTHERFILES value=""/>
</MACROS>
<OPTIONS>
<IDLCFLAGS value="-I..\test -IC:\boost_1_31_0 -I$(BCB)\include -I$(BCB)\include\vcl
-src_suffix cpp -D_DEBUG -DBOOST_ARCHIVE_TEST=xml_warchive.hpp -boa"/>
<CFLAG1 value="-Od -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -tWC -tWM -c"/>
<PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/>
<RFLAGS value=""/>
<AFLAGS value="/mx /w2 /zd"/>
<LFLAGS value="-D&quot;&quot; -ap -Tpe -x -Gn -v"/>
<OTHERFILES value=""/>
</OPTIONS>
<LINKER>
<ALLOBJ value="c0x32.obj $(PACKAGES) $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/>
<OTHERFILES value=""/>
</LINKER>
<FILELIST>
<FILE FILENAME="test_simple_class.res" FORMNAME="" UNITNAME="test_simple_class.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="test_simple_class.bpf" FORMNAME="" UNITNAME="test_simple_class" CONTAINERID="BPF" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\test\test_simple_class.cpp" FORMNAME="" UNITNAME="test_simple_class" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\serialization\build\libboost_serialization.lib\borland\debug\runtime-link-static\libboost_serialization.lib" FORMNAME="" UNITNAME="libboost_serialization.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\serialization\build\libboost_wserialization.lib\borland\debug\runtime-link-static\libboost_wserialization.lib" FORMNAME="" UNITNAME="libboost_wserialization.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
<FILE FILENAME="..\..\..\bin\boost\libs\test\build\libboost_test_exec_monitor.lib\borland\debug\runtime-link-static\libboost_test_exec_monitor.lib" FORMNAME="" UNITNAME="libboost_test_exec_monitor.lib" CONTAINERID="LibTool" DESIGNCLASS="" LOCALCOMMAND=""/>
</FILELIST>
<BUILDTOOLS>
</BUILDTOOLS>
<IDEOPTIONS>
[Version Info]
IncludeVerInfo=0
AutoIncBuild=0
MajorVer=1
MinorVer=0
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1033
CodePage=1252
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=1.0.0.0
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
Count=5
Item0=..\test;C:\boost_1_31_0\libs\serialization\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl
Item1=C:\boost_1_31_0\libs\serialization\test;C:\boost_1_31_0;$(BCB)\include;$(BCB)\include\vcl
Item2=C:\boost_1_31_0\libs;C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
Item3=C:\boost_1_31_0\libs\;C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
Item4=C:\boost_1_31_0\libs\serialization\test;$(BCB)\include;$(BCB)\include\vcl
[HistoryLists\hlLibraryPath]
Count=2
Item0=..\test;C:\boost_1_31_0\libs\serialization\test;$(BCB)\lib\obj;$(BCB)\lib
Item1=C:\boost_1_31_0\libs\serialization\test;$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=2
Item0=_DEBUG;BOOST_ARCHIVE_TEST=xml_warchive.hpp
Item1=_DEBUG
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl
[Parameters]
RunParams=
Launcher=
UseLauncher=0
DebugCWD=
HostApplication=
RemoteHost=
RemotePath=
RemoteLauncher=
RemoteCWD=
RemoteDebug=0
[Compiler]
ShowInfoMsgs=0
LinkDebugVcl=1
LinkCGLIB=0
[CORBA]
AddServerUnit=1
AddClientUnit=1
PrecompiledHeaders=1
[Language]
ActiveLang=
ProjectLang=
RootDir=
</IDEOPTIONS>
</PROJECT>
Binary file not shown.
+45
View File
@@ -0,0 +1,45 @@
# Copyright René Ferdinand Rivera Morell 2023-2024
# 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)
require-b2 5.2 ;
constant boost_dependencies :
/boost/array//boost_array
/boost/assert//boost_assert
/boost/config//boost_config
/boost/core//boost_core
/boost/detail//boost_detail
/boost/integer//boost_integer
/boost/io//boost_io
/boost/iterator//boost_iterator
/boost/move//boost_move
/boost/mp11//boost_mp11
/boost/mpl//boost_mpl
/boost/optional//boost_optional
/boost/predef//boost_predef
/boost/preprocessor//boost_preprocessor
/boost/smart_ptr//boost_smart_ptr
/boost/spirit//boost_spirit
/boost/throw_exception//boost_throw_exception
/boost/type_traits//boost_type_traits
/boost/utility//boost_utility
/boost/variant//boost_variant
/boost/variant2//boost_variant2 ;
project /boost/serialization
: common-requirements
<include>include
;
explicit
[ alias boost_serialization : build//boost_serialization ]
[ alias boost_wserialization : build//boost_wserialization ]
[ alias all : boost_serialization boost_wserialization example test ]
;
call-if : boost-library serialization
: install boost_serialization boost_wserialization
;
-151
View File
@@ -1,151 +0,0 @@
# Boost serialization Library Build Jamfile
# (C) Copyright Robert Ramey 2002-2004.
# Use, modification, and distribution are 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 the library home page.
subproject libs/serialization/build ;
import ./serialization ;
{
SOURCES =
basic_archive
basic_archive_impl
basic_iarchive
basic_oarchive
basic_iserializer
basic_oserializer
basic_pointer_iserializer
basic_pointer_oserializer
basic_serializer_map
basic_text_iprimitive
basic_text_oprimitive
basic_xml_archive
binary_iarchive
binary_oarchive
extended_type_info
extended_type_info_no_rtti
extended_type_info_typeid
polymorphic_iarchive
polymorphic_oarchive
stl_port
text_iarchive
text_oarchive
void_cast
xml_grammar
xml_iarchive
xml_oarchive
;
WSOURCES =
codecvt_null
basic_text_wiprimitive
basic_text_woprimitive
binary_wiarchive
binary_woarchive
text_wiarchive
text_woarchive
xml_wgrammar
xml_wiarchive
xml_woarchive
utf8_codecvt_facet
;
template boost_serialization_base
: ## sources ##
: ## requirements ##
std::locale-support
toolset::require-boost-spirit-support
# the common names rule ensures that the library will
# be named according to the rules used by the install
# and auto-link features:
common-variant-tag
<sysinclude>$(BOOST_ROOT)
<stlport-iostream>on
<borland*><*><cxxflags>"-w-8080 -w-8071 -w-8057 -w-8062 -w-8008 -w-8001 -w-0018 -w-8066"
<msvc><*><cxxflags>-Gy
<vc*><*><cxxflags>-Gy
<define>BOOST_LIB_DIAGNOSTIC=1
: ## default build
debug release
;
lib boost_serialization
: ## sources ##
<template>boost_serialization_base
../src/$(SOURCES).cpp
;
lib boost_wserialization
: ## sources ##
<template>boost_serialization_base
../src/$(WSOURCES).cpp
<lib>boost_serialization
: ## requirements ##
toolset::require-wide-char-io-support
;
dll boost_serialization
: ## sources ##
<template>boost_serialization_base
../src/$(SOURCES).cpp
: ## requirements ##
toolset::require-shared-libraries-support
# this suppress the --a switch in the como toolset
# without this one gets compile errors ! with "dllexport"
# however, it doesn't link anyway so comment it out
# <como-4_3_3-vc7_1><*><no-warn>$(SOURCES).cpp
<define>BOOST_SERIALIZATION_DYN_LINK=1
<runtime-link>dynamic
;
dll boost_wserialization
: ## sources ##
<template>boost_serialization_base
../src/$(WSOURCES).cpp
<dll>boost_serialization
: ## requirements ##
toolset::require-wide-char-io-support
toolset::require-shared-libraries-support
# this suppress the --a switch in the como toolset
# without this one gets compile errors ! with "dllexport"
# however, it doesn't link anyway so comment it out
# <como-4_3_3-vc7_1><*><no-warn>$(WSOURCES).cpp
<define>BOOST_WSERIALIZATION_DYN_LINK=1
<define>BOOST_SERIALIZATION_DYN_LINK=1
<runtime-link>dynamic
;
install serialization lib
:
<lib>boost_serialization
<lib>boost_wserialization
<dll>boost_serialization
<dll>boost_wserialization
;
stage stage/lib
:
<lib>boost_serialization
<lib>boost_wserialization
<dll>boost_serialization
<dll>boost_wserialization
:
# copy to a path rooted at BOOST_ROOT:
<locate>$(BOOST_ROOT)
# the common names rule ensures that the library will
# be named according to the rules used by the install
# and auto-link features:
common-variant-tag
# add this target to the "stage" and "all" psuedo-targets:
<target>stage
<target>all
:
debug release
;
}
+113 -23
View File
@@ -1,54 +1,144 @@
# Boost serialization Library Build Jamfile
# (C) Copyright Robert Ramey 2002-2004.
# Use, modification, and distribution are subject to the
# Boost Software License, Version 1.0. (See accompanying file
# Use, modification, and distribution are 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 the library home page.
project boost/serialization
: source-location ../src
require-b2 5.0.1 ;
import-search /boost/config/checks ;
import config : requires ;
constant boost_dependencies_private :
/boost/function//boost_function
;
SOURCES =
project
: source-location ../src
: common-requirements <library>$(boost_dependencies)
: requirements
<conditional>@include-spirit
<library>$(boost_dependencies_private)
: usage-requirements
<define>BOOST_SERIALIZATION_NO_LIB=1
;
SPIRIT_ROOT = [ modules.peek : SPIRIT_ROOT ] ;
rule include-spirit ( properties * )
{
local old-compiler ;
if <toolset>borland in $(properties)
{
if ! <toolset-borland:version>6.1.0 in $(properties)
{
old-compiler = true ;
}
}
else if <toolset>msvc in $(properties)
{
if <toolset-msvc:version>6.5 in $(properties)
|| <toolset-msvc:version>7.0 in $(properties)
{
old-compiler = true ;
}
}
local result ;
if $(old-compiler)
{
if $(SPIRIT_ROOT)
{
# note - we can't use <include>$(SPIRIT_ROOT) because
# it puts -I$(SPIRIT_ROOT) AFTER the "../../.." in the command line.
# so use these instead
result = <cxxflags>-I$(SPIRIT_ROOT) ;
}
else
{
echo **** spirit 1.6x required to build library with this compiler **** ;
result = <build>no ;
}
}
return $(result) ;
}
SOURCES =
archive_exception
basic_archive
basic_iarchive
basic_iserializer
basic_oarchive
basic_oserializer
basic_pointer_iserializer
basic_pointer_oserializer
basic_serializer_map
basic_text_iprimitive
basic_text_oprimitive
basic_xml_archive
binary_iarchive
binary_oarchive
codecvt_null
extended_type_info
extended_type_info_no_rtti
extended_type_info_typeid
extended_type_info_no_rtti
polymorphic_iarchive
polymorphic_oarchive
stl_port
text_iarchive
text_oarchive
polymorphic_text_iarchive
polymorphic_text_oarchive
polymorphic_binary_iarchive
polymorphic_binary_oarchive
polymorphic_xml_iarchive
polymorphic_xml_oarchive
void_cast
xml_grammar
xml_iarchive
xml_archive_exception
codecvt_null
;
SOURCES_HAS_STD_WSTREAMBUF =
xml_oarchive
;
WSOURCES =
basic_text_wiprimitive
basic_text_woprimitive
binary_wiarchive
binary_woarchive
text_wiarchive
text_woarchive
xml_wgrammar
xml_wiarchive
xml_woarchive
utf8_codecvt_facet
;
lib boost_serialization : $(SOURCES).cpp :
<toolset>msvc:<cxxflags>/Gy ;
WSOURCES =
basic_text_wiprimitive
basic_text_woprimitive
text_wiarchive
text_woarchive
polymorphic_text_wiarchive
polymorphic_text_woarchive
xml_wgrammar
xml_wiarchive
xml_woarchive
polymorphic_xml_wiarchive
polymorphic_xml_woarchive
codecvt_null
;
lib boost_wserialization : $(WSOURCES).cpp :
<toolset>msvc:<cxxflags>/Gy ;
lib boost_serialization
: ## sources ##
$(SOURCES).cpp
: ## requirements ##
[ check-target-builds /boost/config/checks//std_wstreambuf : <source>../src/$(SOURCES_HAS_STD_WSTREAMBUF).cpp ]
<toolset>msvc:<cxxflags>/Gy
<toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
<toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
;
lib boost_wserialization
: $(WSOURCES).cpp boost_serialization
:
[ requires std_wstreambuf ]
<toolset>msvc:<cxxflags>/Gy
<toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
<toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
# note: both serialization and wserialization are conditioned on the this
# switch - don't change it to BOOST_WSERIALIZATION_DYN_LINK
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
;
-82
View File
@@ -1,82 +0,0 @@
# Boost serialization Library Build Jamfile
# (C) Copyright Robert Ramey 2002-2004.
# Use, modification, and distribution are 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 the library home page.
# building this library needs a working version of spirit
rule toolset::require-boost-spirit-support ( toolset variant : subvariant-path properties * )
{
local requires-spirit = false ;
switch $(toolset) {
case "borland*" :
requires-spirit = true ;
case "msvc*" :
requires-spirit = true ;
case "iw*" :
requires-spirit = true ;
case "vc-6*" :
requires-spirit = true ;
case "vc7*" :
requires-spirit = true ;
case "vc-7_0*" :
requires-spirit = true ;
case "gcc-2*" :
requires-spirit = true ;
}
if $(requires-spirit) = true {
if $(SPIRIT_ROOT) # && ( exist $(SPIRIT_ROOT) )
{
properties += <include>$(SPIRIT_ROOT) ;
}
else {
echo **** spirit 1.6x required to build library with this compiler **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
}
}
return $(subvariant-path) $(properties) ;
}
# certain tool sets are known apriori not to support wide char i/o
rule toolset::require-wide-char-io-support ( toolset variant : subvariant-path properties * )
{
switch $(toolset) {
case "*cygwin" :
echo **** wide char i/o not supported by cygwin gcc library **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
case "como*" :
echo **** wide char i/o not supported by libcomo standard library **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
case "mingw*" :
echo **** wide char i/o not supported by the mingw standard library **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
}
return $(subvariant-path) $(properties) ;
}
# certain tool sets are known apriori not to support creation of DLLS
rule toolset::require-shared-libraries-support ( toolset variant : subvariant-path properties * )
{
switch $(toolset) {
case "como*" :
echo **** DLLs cannot be built with this compiler **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
case "msvc-stlport*" :
echo **** DLLs cannot be built with this compiler and stlport 4.x **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
case "vc-6_5-stlport*" :
echo **** DLLs cannot be built with this compiler and stlport 4.x **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
case "cw*" :
local runtime-link = [ get-values <runtime-link> : $(properties) ] ;
if static in $(runtime-link) {
echo **** locale support only exists with static runtime linking **** ;
echo **** DLLS cannot be built with static runtime linking **** ;
properties = [ impose-requirements $(properties) : <build>no ] ;
}
}
return $(subvariant-path) $(properties) ;
}
+25 -12
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Acknowledgments</title>
@@ -27,24 +27,36 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<ul>
<li>Markus Schöpflin tracked down issues with TRU64 compiler resulting in 100% passing.
<li>Takatoshi Kondo found and corrected a very obscure and difficult bug in the
serialization of virtual base classes.
<li><a href="http://www.autoform.com">AutoForm Engineering GmbH</a> supported
development efforts to extend correct serialization to objects stored in DLLS.
<li><a href"http://www.cadence.com/il">Cadence Israel</a> supported enhancement
and testing of the portable binary archive.
<li>David Abrahams improved implementation of "export" functionality. This not
only eliminated an annoying header sequencing requirement, but also the need to maintain
a list of "known archives".
<li>Mattias Troyer enhanced the implementation of native binary archives. This includes
enhancement and generalization of the library itself including generalization of
the wrapper concept.
<li>Markus Sch&ouml;pflin tracked down issues with TRU64 compiler resulting in 100% passing.
<li><a href="mailto::troy@resophonic.com"> Troy D. Straszheim</a> made the initial version of variant serialization.
<li>Tonko Juricic helped refine and complete project files for VC 7.1 ide
<li><a href="../../../people/rene_rivera.htm">Rene Rivera</a> tracked down several issues related to
<li><a href="http://www.boost.org/people/rene_rivera.htm">Rene Rivera</a> tracked down several issues related to
Code Warrior, toolset configuration and bjam and much else.
<li>Martin Ecker detected (and fixed!) a number of sublte errors regarding cyclic
<li>Martin Ecker detected (and fixed!) a number of subtle errors regarding cyclic
pointers, shared pointers. He also built the library as a DLL and raised some issues
<li>Pavel Vozenilek invested much effort in review of code and documentation
resulting in many improvements. In addition he help a lot with porting to other
resulting in many improvements. In addition he helped a lot with porting to other
platforms including VC 6.0, Intel, and especially Borland.
<li><a href="../../../people/jens_maurer.htm">Jens Maurer</a> and
<a href="../../../people/beman_dawes.html">Beman Dawes</a> who got the boost
<li><a href="http://www.boost.org/people/jens_maurer.htm">Jens Maurer</a> and
<a href="http://www.boost.org/people/beman_dawes.html">Beman Dawes</a> who got the boost
serialization ball rolling. It was one or both of these two that invented
the much beloved <code>&amp;</code> syntax used to implement both save and
load in one fuction specification.
<li><a href="../../../people/vladimir_prus.htm">Vladimir Prus</a> for evaluating an
load in one function specification.
<li><a href="http://www.boost.org/people/vladimir_prus.htm">Vladimir Prus</a> for evaluating an
early draft and contributing the diamond inheritance example.
<li><a href="../../../people/william_kempf.htm">William E. Kempf</a>
<li><a href="http://www.boost.org/people/william_kempf.htm">William E. Kempf</a>
who made the templates for this and other boost manuals. This relieved
me of much aggravation.
<li><a href="mailto:vahan@unicad.am">Vahan Margaryan</a> and
@@ -64,10 +76,11 @@ http://www.boost.org/LICENSE_1_0.txt)
Mr. Rozenthal in particular wrote an incredibly insightful analysis
that has driven all subsequent development that has resulted in the
current package.
<li>Dave Harris proposal and spirited defense of it lead to a re-thinking
<li>Dave Harris proposal and spirited defense of it led to a re-thinking
of the overrides for serialization of pointers. This resulted in a simpler
and more effective method of accounting for non-default constructors
required by serialization of pointers and STL collections.
<li><a href="mailto:admin@thefireflyproject.us">Bryce Lelbach</a> rewrote the XML Serialization grammar using Boost.Spirit 2.x.
</ul>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
+145 -125
View File
@@ -1,13 +1,13 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
(C) Copyright 2002-10 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - More on Archives</title>
@@ -26,75 +26,96 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<dl class="page-index">
<dt><a href="#implementation">Implementation</a>
<dt><a href="#trivial">Trivial Archive</a>
<dt><a href="#implementation">More Useful Archive Classes</a>
<dt><a href="#usage">Usage</a>
<dt><a href="#testing">Testing</a>
<dt><a href="#polymorphic">Polymorphic Archives</a>
</dl>
<h3><a name="implementation">Implementation</a></h3>
<h3><a name="trivial">Trivial Archive</a></h3>
The <a href="archives.html"><strong>Archive</strong></a> concept specifies the functions that a
class must implement to in order to be used to serialize
<a href="serialization.html"><strong>Serializable</strong></a> types.
The library implements a family of archives appropriate for different purposes.
This section describes how they have been implemented and how one can implement his own archive class.
Our discussion will focus on archives used for loading as the hierarchy is exactly analogous
for archives used for saving data.
class must implement in order to be used to serialize
<a href="serialization.html"><strong>Serializable</strong></a> types.
Our discussion will focus on archives used for saving as the hierarchy is exactly analogous
for archives used for loading data.
<h4>Minimum Requirements</h4>
The simplest class which will model the <a href="archives.html"><strong>Archive</strong></a> concept specifies the functions that a
class will look like:
<pre><code>
#include &lt;cstddef&gt; // std::size_t
//////////////////////////////////////////////////////////////
// class trivial_oarchive
class trivial_oarchive {
public:
//////////////////////////////////////////////////////////
// public interface used by programs that use the
// serialization library
typedef boost::mpl::bool_&lt;true&gt; is_saving;
typedef boost::mpl::bool_&lt;false&gt; is_loading;
template&lt;class T&gt; void register_type(){}
template&lt;class T&gt; trivial_oarchive &amp; operator&lt;&lt;(const T &amp; t){
return *this;
}
template&lt;class T&gt; trivial_oarchive &amp; operator&amp;(const T &amp; t){
return *this &lt;&lt; t;
}
void save_binary(void *address, std::size_t count){};
};
</code></pre>
The simplest possible input archive class is analogous to the above.
In the following discussion, only output archives will be addressed.
Input archives are exactly symmetrical to output archives.
<p>
Our archives have been factored in to a tree of classes in order to minimize
This archive will compile and execute with any types which implement the
<a href="serialization.html"><strong>Serializable</strong></a> concept.
For an example see
<a href="../example/demo_trivial_archive.cpp" target="demo_trivial_archive">
<code style="white-space: normal">demo_trivial_archive.cpp</code></a>.
Of course this program won't produce any output as it is. But it provides
the starting point for a simple class which can be used to log formatted
output. See the implementation of a <a href="simple_log.html">simple
log archive</a> to how this has been done.
<h3><a name="implementation">More Useful Archive Classes</a></h3>
The above example is fine as far as it goes. But it doesn't implement
useful features such as serialization of pointers, class versioning
and others. This library implements a family of full featured archive
classes appropriate for a variety of purposes.
<p>
Our archives have been factored into a tree of classes in order to minimize
repetition of code. This is shown in the accompanying
<a target="class_diagram" href="class_diagram.html">class diagram</a>.
All input archives should be derived from the following template:
<pre><code>
template&lt;class Archive&gt;
detail::common_iarchive;
</code></pre>
<h4>Minimum Requirments</h4>
An instance of the this template handles all the "bookkeeping" associated
with serialization. In order to be a functional only the following additional
functions <strong>must</strong> be defined:
<dl>
<dt><h4><code>void load(T &t);</code></h4></dt>
<dd>
This function must be implemented for all primitive data types. This can be
accomplished through the use of a member template or explict declarations
for all prmititive types.
</dd>
<dt><h4><code>void load_binary(void *address, std::size_t size);</code></h4></dt>
<dd>
This function should <code style="white-space: normal">size</code> bytes from the archive, and
copy them in to memory starting at address <code style="white-space: normal">address</code>.
</dd>
<dt><h4><code>friend class boost::archive::load_access;</code></h4></dt>
<dd>
In addition, such a class <strong>must</strong> provide a the following
friend declaration grant access to the core serialization library to the functions
of this class.
</dd>
</dl>
So, the most trivial implementation of an input archive would look like this:
Any class which fulfills the following requirements will fit into
this hierarchy and implement all the features we require. Deriving from
the base class <a href="../../../boost/archive/detail/common_oarchive.hpp" target="common_oarchive_hpp">
common_oarchive.hpp</a> provides all features we desire which
are missing from trivial_oarchive above.
<pre><code>
<a href="../../../boost/archive/detail/common_iarchive.hpp" target="common_iarchive_hpp">
#include &lt;boost/archive/detail/common_iarchive.hpp&gt;
<a href="../../../boost/archive/detail/common_oarchive.hpp" target="common_oarchive_hpp">
#include &lt;cstddef&gt; // std::size_t
#include &lt;boost/archive/detail/common_oarchive.hpp&gt;
</a>
/////////////////////////////////////////////////////////////////////////
// class trivial_iarchive - read serialized objects from a input text stream
class trivial_iarchive :
public boost::archive::detail::common_iarchive&lt;trivial_iarchive&gt;
// class complete_oarchive
class complete_oarchive :
public boost::archive::detail::common_oarchive&lt;complete_oarchive&gt;
{
// permit serialization system priviledged access to permit
// permit serialization system privileged access to permit
// implementation of inline templates for maximum speed.
friend class boost::archive::load_access;
friend class boost::archive::save_access;
// member template for loading primitive types.
// Override for any types/templates that special treatment
// member template for saving primitive types.
// Specialize for any types/templates that require special treatment
template&lt;class T&gt;
void load(T &amp; t);
void save(T &amp; t);
public:
//////////////////////////////////////////////////////////
@@ -102,36 +123,32 @@ public:
// serialization library
// archives are expected to support this function
void load_binary(void *address, std::size_t count);
void save_binary(void *address, std::size_t count);
};
</code></pre>
The simplest possible output archive class is exactly analogous to the above.
In the following discussion, only input archives will be addressed.
Output archives are exactly symmetrical to input archives.
<p>
Given a suitable definitions of <code style="white-space: normal">load</code>
and <code style="white-space: normal">load_binary</code>,
Given a suitable definitions of <code style="white-space: normal">save</code>
and <code style="white-space: normal">save_binary</code>,
any program using serialization with a conforming C++ compiler should compile
and run with this archive class.
<h4>Optional Overrides</h4>
The <code style="white-space: normal">detail::common_iarchive</code> class contains
The <code style="white-space: normal">detail::common_oarchive</code> class contains
a number of functions that are used by various parts of the serialization library
to help render the archive in a particular form.
<dl>
<dt><h4><code>void load_start()</code></h4></dt>
<dt><h4><code>void save_start(char const *)</code></h4></dt>
<dd>
<strong>Default</strong>:Does nothing.<br>
<strong>Purpose</strong>:To inject/retrieve an object name into the archive. Used
by XML archive to inject "&lt;name " before data.
by XML archive to inject "&lt;name&gt;" before data.
</dd>
<p>
<dt><h4><code>void load_end()</code></h4></dt>
<dt><h4><code>void save_end(char const *)</code></h4></dt>
<dd>
<strong>Default</strong>:Does nothing.<br>
<strong>Purpose</strong>:To inject/retrieve an object name into the archive. Used
@@ -142,34 +159,29 @@ by XML archive to inject "&lt;/name&gt;" after data.
<dt><h4><code>void end_preamble()</code></h4></dt>
<dd>
<strong>Default</strong>:Does nothing.<br>
<strong>Purpose</strong>:Called <strong>each time</strong> user data data is saved.
Its not called when archive book keeping data is saved. This is used by XML archives
to determine when to inject a "&gt;" character at end of XML header. XML output archives
<strong>Purpose</strong>:Called <strong>each time</strong> user data is saved.
It's not called when archive bookkeeping data is saved. This is used by XML archives
to determine when to inject a "&gt;" character at the end of an XML header. XML output archives
keep their own internal flag indicating that data being written is header data. This
internal flag is reset when an object start tag is written. When
<code style="white-space: normal">void end_preamble()</code> is invoked and this internal flag is set
a "&gt;" character is appended to the output and the internal flag is reset. The default
implementation for <code style="white-space: normal">void end_preamble()</code> is a no-op there by permitting it
implementation for <code style="white-space: normal">void end_preamble()</code> is a no-op thereby permitting it
to be optimised away for archive classes that don't use it.
</dd>
<p>
<dt><h4><code>
template&lt;class T&gt;
void load_override(T & t, int);
void save_override(T &amp; t, int);
</code></h4></dt>
<dd>
<strong>Default</strong>:Invokes <code style="white-space: normal">archive::load(Archive & ar, t)</code><br>
<strong>Default</strong>:Invokes <code style="white-space: normal">archive::save(Archive &amp; ar, t)</code><br>
This is the main entry into the serialization library.<br>
<strong>Purpose</strong>:This can be overridden in cases where the data is to be written
<strong>Purpose</strong>:This can be specialized in cases where the data is to be written
to the archive in some special way. For example, XML archives implement special handling for
name-value pairs by overriding this function template for name-value pairs.
This replaces the default name-value pair handling, which is just to throw away the name,
with one appropriate for XML which writes out the start of an XML tag with the correct object name.
<p>
The second argument must be part of the function signature even this it is not used.
Its purpose is to be sure that code is portable to compilers which fail to correctly
implement partial function template ordering. For more information see
<a href="implementation.html#functiontemplateordering">this</a>.
</dd>
</dl>
@@ -178,12 +190,14 @@ implement partial function template ordering. For more information see
The serialization library injects bookkeeping data into the serialization archive.
This data includes things like object ids, version numbers, class names etc. Each
of these objects is included in a wrapper so that the archive class can override the
implementation of <code style="white-space: normal">void load_override(T & t, int);</code>.
implementation of <code style="white-space: normal">void save_override(T &amp; t, int);</code>.
For example, in the XML archive, the override for this type renders an object_id equal to 23 as
"object_id=_23". The following table lists the types used by the serialization library:
"object_id=_23". The following table lists the types defined in the
<code style="white-space: normal">boost::archive namespace</code>
used internally by the serialization library:
<p>
<table border>
<tr><th align=left>type</th><th align=left><code style="white-space: normal">default<br>serialed as</code></th>
<tr><th align=left>type</th><th align=left><code style="white-space: normal">default<br>serialized as</code></th>
<tr><td><code style="white-space: normal">version_type</code></td><td><code style="white-space: normal">unsigned int</code></td>
<tr><td><code style="white-space: normal">object_id_type</code></td><td><code style="white-space: normal">unsigned int</code></td>
<tr><td><code style="white-space: normal">object_id_reference_type</code></td><td><code style="white-space: normal">unsigned int</code></td>
@@ -195,7 +209,7 @@ For example, in the XML archive, the override for this type renders an object_id
</table>
<p>
All of these are associated with a default serialization defined in terms of primitive types
so it isn't a requirement to define <code style="white-space: normal">load_override</code>
so it isn't a requirement to define <code style="white-space: normal">save_override</code>
for these types.
<p>
These are defined in
@@ -203,7 +217,7 @@ These are defined in
All of these types have been assigned an
<a target="detail" href="traits.html#level">implementation level</a> of
<code style="white-space: normal">primitive</code> and are convertible to types such as int, unsigned int, etc.
So that they have default implementations. This is illustrated by
so that they have default implementations. This is illustrated by
<a href="../../../boost/archive/basic_text_iarchive.hpp" target="basic_text_iarchive_hpp"><code style="white-space: normal">basic_text_iarchive.hpp</code></a>.
which relies upon the default. However, in some cases, overrides will have to be
explicitly provided for these types. For an example see
@@ -212,19 +226,16 @@ explicitly provided for these types. For an example see
In real practice, we probably won't be quite done.
One or more of the following issues may need to be addressed:
<ul>
<li>Many compilers fail to implement correct partial ordering of
function templates. The archives included with this library work around
this using argument overloading. This technique is described in
<a target="detail" href="implementation.html#functiontemplateordering">
another section of this manual</a>
<li>Even if we are using a conforming compiler, we might want our new archive class
to be portable to non-conforming compilers.
<li>Our archive format might require extra information inserted into it. For
example, XML archives need &lt;name ... &gt;...&lt;/name&gt; surrounding
all data objects.
<li>Addressing any of the above may generate more issues to be addressed.
<li>The archives included with library are all templates which use a
<code style="white-space: normal">stream</code> as a template parameter rather than simple classes.
<li>The archives included with the library are all templates which use a
<code style="white-space: normal">stream</code> or
<code style="white-space: normal">streambuf</code>
as a template parameter rather than simple classes.
Combined with the above, even more issues arise with non-conforming compilers.
</ul>
The attached <a target="class_diagram" href="class_diagram.html">class diagram</a>
@@ -239,17 +250,15 @@ EXCEPT for one special case.
<ul>
<li>Instances of a derived class are serialized through a base class pointer.
<li>Such instances are not "registered" neither implicitly nor explicitly. That
is, the macro <code style="white-space: normal">BOOT_CLASS_EXPORT</code> is used to instantiate the serialization
code for the included archives.
is, the macro <code style="white-space: normal">BOOST_CLASS_EXPORT</code> is used
to instantiate the serialization code for the included archives.
</ul>
The problem here is that BOOT_CLASS_EXPORT only generates code for those archives
included with the library - not those added subsequently. To generate code for
newly created archive classes, the following should be used.
To make this work, the following should be included after the archive
class definition.
<pre><code>
#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES trivial_oarchive
#define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES trivial_iarchive
BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)
</code></pre>
before <code style="white-space: normal">BOOST_CLASS_EXPORT</code> is invoked for any serializable class.
Failure to do this will not inhibit the program from compiling, linking
and executing properly - except in one case. If an instance of a derived
class is serialized through a pointer to its base class, the program
@@ -257,23 +266,20 @@ will throw an
<a href="exceptions.html#unregistered_class"><code style="white-space: normal">unregistered_class</code></a>
exception.
<p>
Only one of the above statements is permitted, However, any number of new archive
classes can be specified as list separated by commas.
<h4><a name="testing">Testing</h4>
Exhaustive testing of the library requires testing the different aspects of object
serialization with each archive. There are 36 different tests that can run with any archive. There are
5 "standard archives" included with the system. (3 in systems which don't support wide
charactor i/o).
serialization with each archive. There are 46 different tests that can run with any archive.
There are 5 "standard archives" included with the system.
(3 in systems that don't support wide character i/o).
<p>
In addition, there are 22 other tests which aren't related to any particular archive
class.
In addition, there are 28 other tests which aren't related to any particular archive class.
<p>
The default <code style="white-space: normal">bjam</code> testing setup will run all
the above described tests. This will result in as many as 39 archive tests * 5
standard archives + 25 general tests = 220 tests. Note that a complete test of the
the above described tests. This will result in as many as 46 archive tests * 5
standard archives + 28 general tests = 258 tests. Note that a complete test of the
library would include DLL vs static library, release vs debug so the actual total
would be closer to 880 tests.
would be closer to 1032 tests.
<p>
For each archive there is a header file in the test directory similar to the one below.
The name of this archive is passed to the test program by setting the
@@ -300,16 +306,16 @@ typedef std::ifstream test_istream;
#define TEST_STREAM_FLAGS (std::ios_base::openmode)0
</code></pre>
To test a new archive, for example, portable binary archives, make a
header file <code style="white-space: normal">portable_binary_archive.hpp</code>
To test a new archive, for example, portable binary archives, with the gcc compiler,
make a header file <code style="white-space: normal">portable_binary_archive.hpp</code>
and invoke <code style="white-space: normal">bjam</code> with
<pre><code>
-sBOOST_ARCHIVE_LIST=portable_binary_archive.hpp
</code></pre>
This process in encapsulated in the shell script
<code style="white-space: normal">run_archive_test</code> whose command line is
This process in encapsulated in the shell or cmd script
<code style="white-space: normal">library_test</code> whose command line is
<pre><code>
run_archive_test &lt;test header file&gt; &lt;toolset&gt; [&lt;boost root&gt;] [&lt;target directory&gt;]
library_test --toolset=gcc -sBOOST_ARCHIVE_LIST=portable_binary_archive.hpp
</code></pre>
<h3><a name="polymorphic">Polymorphic Archives</a></h3>
@@ -317,13 +323,13 @@ run_archive_test &lt;test header file&gt; &lt;toolset&gt; [&lt;boost root&gt;] [
All archives described so far are implemented as templates. Code to save and load
data to archives is regenerated for each combination of archive class and data type.
Under these cirumstances, a good optimizing compiler that can expand
Under these circumstances, a good optimizing compiler that can expand
<code>inline</code> functions to enough depth will generate fast code.
However:
<ul>
<li>Much inline code may be replicated.
<li>If there are several archive classes, code will be regenerated for each archive class.
<li>If seriaiization code is placed in a library, that library must be rebuilt
<li>If serialization code is placed in a library, that library must be rebuilt
each time a new archive class is created.
<li>If serialization code is placed in a DLL,
<ul>
@@ -338,7 +344,7 @@ each time a new archive class is created.
</ul>
<h4>Implementation</h4>
The solution is the the pair <code>polymorphic_oarchive</code>
The solution is the pair <code>polymorphic_oarchive</code>
and <code>polymorphic_iarchive</code>. They present a common interface of virtual
functions - no templates - that is equivalent to the standard templated one.
@@ -355,7 +361,7 @@ show how polymorphic archives are to be used. Note the following:
<li><a target=demo_polymorphic_A_hpp href="../example/demo_polymorphic_A.hpp"><code style="white-space: normal">demo_polymorphic_A.hpp</code></a> and
<a target=demo_polymorphic_A_cpp href="../example/demo_polymorphic_A.cpp"><code style="white-space: normal">demo_polymorphic_A.cpp</code></a>
contain no templates and no reference to any specific archive implementation. That is, they will
only have to be compiled once for all archive implementations. The even applies to archives classes
only have to be compiled once for all archive implementations. This even applies to archives classes
created in the future.
<li>The main program <a target=demo_polymorphic_cp href="../example/demo_polymorphic.cpp"><code style="white-space: normal">demo_polymorphic.cpp</code></a>
specifies a specific archive implementation.
@@ -365,14 +371,15 @@ As can be seen in the
and the header files, this implementation is just a composition of the polymorphic
interface and the standard template driven implementation. This composition is
accomplished by the templates
<a target=polymorphic_iarchive_impl_hpp href="../../../boost/archive/detail/polymorphic_iarchive_impl.hpp"><code style="white-space: normal">polymorphic_iarchive_impl.hpp</code></a>
<a target=polymorphic_iarchive_route_hpp href="../../../boost/archive/detail/polymorphic_iarchive_route.hpp"><code style="white-space: normal">polymorphic_iarchive_route.hpp</code></a>
and
<a target=polymorphic_oarchive_impl_hpp href="../../../boost/archive/detail/polymorphic_oarchive_impl.hpp"><code style="white-space: normal">polymorphic_oarchive_impl.hpp</code></a>.
<a target=polymorphic_oarchive_route_hpp href="../../../boost/archive/detail/polymorphic_oarchive_route.hpp"><code style="white-space: normal">polymorphic_oarchive_route.hpp</code></a>
which redirect calls to the polymorphic archives to the specific archive.
As these contain no code specific to the particular implementation archive, they can be used to create
a polymorphic archive implementation from any functioning templated archive implementation.
<p>
As a convenience, small header files have been included which contain
<code style="white-space: normal">typedef</code> for polymorphic implementation for each corresponding
a <code style="white-space: normal">typedef</code> for a polymorphic implementation for each corresponding
templated one. For example, the headers
<a target=polymorphic_text_iarchive_hpp href="../../../boost/archive/polymorphic_text_iarchive.hpp"><code style="white-space: normal">polymorphic_text_iarchive.hpp</code></a>
and
@@ -383,16 +390,29 @@ of the standard text archive classes
and
<a target=text_oarchive_hpp href="../../../boost/archive/text_oarchive.hpp"><code style="white-space: normal">text_oarchive.hpp</code></a>
respectively. All included polymorphic archives use the same naming scheme.
<h4>Usage</h4>
Polymorphic archives address the issues raised above regarding templated implementation.
That is, there is no replicated code, and no recompilation for new archives. This will
result in smaller executables for program which use more than one type of archive, and
smaller DLLS. There is a
penalty for calling archive functions through a virtual function dispatch table and there
is no possibility for a compiler to <code style="white-space: normal">inline</code> archive functions. This will result
in a detectable degradation in performance for saving and loading archives.
smaller DLLS. There is a penalty for calling archive functions through a virtual function
dispatch table and there is no possibility for a compiler to <code style="white-space: normal">inline</code>
archive functions. This will result in a detectable degradation in performance for
saving and loading archives.
<p>
The main utility of polymorphic archives will be to permit the buiding of class DLLs that will
Note that the concept of polymorphic archives is fundamentally incompatible with the
serialization of new types that are marked "primitive" by the user with:
<pre><code>
BOOST_CLASS_IMPLEMENTATION(my_primitive_type, boost::serialization::primitive_type)
</code></pre>
Code to implement serialization for these types is instantiated "on the fly" in the user's program.
But this conflicts with the whole purpose of the polymorphic archive. An attempt to
serialize such a primitive type will result in a compilation error since the common polymorphic
interface is static and cannot instantiate code for a new type.
<p>
The main utility of polymorphic archives will be to permit the building of class DLLs that will
include serialization code for all present and future archives with no redundant code.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
+257 -311
View File
@@ -1,7 +1,7 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Archives</title>
@@ -14,278 +14,225 @@
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Archive Concept</h2>
<h2 align="center">Archive Concepts</h2>
</td>
</tr>
</table>
<hr>
<dl class="page-index">
<dt><a href="#saving_interface">Saving</a>
<dt><a href="#loading_interface">Loading</a>
<dt><a href="#saving_interface">Saving Archive Concept</a>
<dt><a href="#loading_interface">Loading Archive Concept</a>
<dt><a href="#archive_models">Models</a>
<dt><a href="#exceptions">Exceptions</a>
<dt><a href="#charactersets">Character Sets</a>
</dl>
An <strong>Archive</strong> contains a sequence of bytes created from
an arbitrary nested set of C++ data structures.
<h4><a name="saving_interface">Saving</a></h4>
An object that saves data to an archive implements the following interface.
<pre><code>
class oarchive : ...
{
...
public:
// called to save objects
template&lt;class T&gt;
oarchive & operator&lt;&lt;(const T & t);
template&lt;class T&gt;
oarchive & operator&(T & t){
return *this &lt;&lt; t;
}
void save_binary(const void *address, std::size_t count);
template&lt;class T&gt;
register_type(T * t = NULL);
unsigned int library_version() const;
struct is_saving {
typedef mpl::bool_&lt;true&gt; type;
BOOST_STATIC_CONSTANT(bool, value=true);
};
struct is_loading {
typedef mpl::bool_&lt;false&gt; type;
BOOST_STATIC_CONSTANT(bool, value=false);
};
...
};
</code></pre>
The template parameter <code>T</code> must correspond to a type which
models the <a href="serialization.html"><strong>Serializable</strong></a> concept.
<dl>
<dt><h4><code>
template&lt;class T&gt;
oarchive & operator&lt;&lt;(const T & t);
template&lt;class T&gt;
oarchive & operator&(T & t);
</code></h4></dt>
<dd>
<p>
Appends an object of type T to the archive. The object may be
<h4>Notation</h4>
In the following descriptions
<ul>
<li>A primitive data type such as int, char, float, etc.
<li>A class or struct for which a <code style="white-space: normal">serialize</code>
function has been defined.
<li>A pointer to a serializable object.
<li><code>SA</code> is an type modeling the <a href="#saving_interface">Saving Archive Concept</a>.
<li><code>sa</code> is an instance of type SA.
<li><code>LA</code> is an type modeling the <a href="#loading_interface">Loading Archive Concept</a>.
<li><code>la</code> is an instance of type LA.
<li><code>T</code> is an <a href="serialization.html"><strong>Serializable</strong></a> Type.
<li><code>x</code> is an instance of type T Type.
<li><code>u,v</code> is a pointer to a an instance of type T.
<li><code>count</code> is an instance of a type that can be converted to <code>std::size_t</code>.
</ul>
</dd>
<dt><h4><code>
void save_binary(const void *address, std::size_t count);
</code></h4></dt>
<dd>
Appends to the archive <code style="white-space: normal">count</code> bytes found at
<code style="white-space: normal">address</code>.
</dd>
<dt><h4><code>
template&lt;class T&gt;
register_type(T * t = NULL);
</code></h4></dt>
<dd>
Appends a sequential integer to the archive. This integer becomes the "key" used
to look up the class type when the archive is later loaded. This process is
referred to as "class registration". It is only necessary to invoke this function for
objects of derived classes which are serialized through a base class pointer. This
is explained in detail in
<a href="special.html#derivedpointers">Special Considerations - Derived Pointers</a>.
</dd>
<dt><h4><code>
unsigned int library_version() const;
</code></h4></dt>
<dd>
Returns the version number of the serialization library that created the archive.
This number will be incremented each time the library is altered in such a way
that serialization could be altered for some type. For example, suppose the type
used for a count of collection members is changed. The code that loads collections
might be conditioned on the library version to make sure that libraries created by
previous versions of the library can still be read.
</dd>
<dt><h4><code>
is_saving::type = mpl::bool&lt;true&gt;;
is_saving::value= true;
is_loading::type = mpl::bool&lt;false&gt;;
is_loading::value= false;
</code></h4></dt>
<dd>
These integral constants permit archive attributes to be queried at compiler
or execution time. They can used to generate code with boost
<a href="../../mpl/doc/index.html">mpl</a>
. For and example
showing how these can beused, see the implementation of
<a target="splithpp" href="../../../boost/serialization/split_free.hpp">split_free.hpp</a>.
</dd>
<h4><a name="saving_interface">Saving Archive Concept</a></h4>
<h4>Associated Types</h4>
Intuitively, a type modeling this concept will generate a sequence of bytes
corresponding to an arbitrary set of C++ data structures. Each type modeling the
Saving Archive concept (SA) may be associated with another type modeling the
<a href="#loading_interface">Loading Archive Concept</a>(LA).
This associated type will perform the inverse operation.
That is, given a sequence of bytes generated by SA, it will generate a set of
C++ data structures that is equivalent to the original.
The notion of equivalence is defined by the implementations of the pair of archives and the
way the data are rendered <a href="serialization.html">serializable</a>.
<p>
<h4>Valid Expressions</h4>
<dl>
<dt><h4><code>
SA::is_saving
</code></h4></dt>
<dd>
Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;true&gt;
</dd>
<dt><h4><code>
SA::is_loading
</code></h4></dt>
<dd>
Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;false&gt;
</dd>
<dt><h4><code>
sa &lt;&lt; x
<br>
sa &amp; x
</code></h4></dt>
<dd>
These expressions must perform exactly the same function. They append the
value of <code style="white-space: normal">x</code> along with other information to <code>sa</code>.
This other information is defined by the implementation of the archive.
Typically this information is that which is required by a corresponding
Loading Archive type to properly restore the value of <code>x</code>.
<p>
Returns a reference to <code>sa</code>.
</dd>
<dt><h4><code>
sa.save_binary(u, count)
</code></h4></dt>
<dd>
Appends to the archive <code style="white-space: normal">size_t(count)</code> bytes found at
<code style="white-space: normal">u</code>.
</dd>
<dt><h4><code>
sa.register_type&lt;T&gt;()
<br>
sa.register_type(u)
</code></h4></dt>
<dd>
Appends information about class T to the archive. This information is used to
construct the correct class when a derived pointer is loaded by a corresponding
Loading Archive type.
Invocation of this member function is referred to as "class registration".
This is explained in detail in
<a href="special.html#derivedpointers">Special Considerations - Derived Pointers</a>.
The second syntax is included to permit this function to be called on non-conforming
compilers when <code style="white-space: normal">sa</code> is a template argument.
For more information, see <a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
</dd>
<dt><h4><code>
sa.get_library_version()
</code></h4></dt>
<dd>
Returns an unsigned integer containing the current version number of the serialization
library. This number will be incremented each time the library is altered in such a
way that serialization could be altered for some type. For example, suppose the type
used for a count of collection members is changed. The code that loads collections
might be conditioned on the library version to make sure that libraries created by
previous versions of the library can still be read.
</dd>
<dt><h4><code>
sa.get_helper&lt;Helper&gt;(void * const helper_instance_id = 0)
</code></h4></dt>
<dd>
See <code>la.get_helper&lt;Helper&gt;(void * const helper_instance_id = 0)</code>
below.
</dd>
</dl>
<h4><a name="loading_interface">Loading</a></h4>
An object that saves data to an archive implements the following interface.
<pre><code>
class iarchive : ...
{
...
public:
// called to load objects
template&lt;class T&gt;
iarchive & operator&gt;&gt;(T & t);
template&lt;class T&gt;
iarchive & operator&(T & t){
return *this &gt;&gt; t;
}
void delete_created_pointers();
void load_binary(void *address, std::size_t count);
template&lt;class T&gt;
register_type(T * t = NULL);
reset_object_address(void * old_address, void * new_address);
unsigned int library_version() const;
struct is_saving {
typedef mpl::bool_&lt;false&gt; type;
BOOST_STATIC_CONSTANT(bool, value=false);
};
struct is_loading {
typedef mpl::bool_&lt;true&gt; type;
BOOST_STATIC_CONSTANT(bool, value=true);
};
...
};
} //namespace archive
) //namespace boost
</code></pre>
<h4><a name="loading_interface">Loading Archive Concept</a></h4>
<h4>Associated Types</h4>
Each model of this concept presumes the
existence of a corresponding type modeling the
<a href="#saving_interface">Saving Archive Concept</a>.
The purpose of an instance of this concept is to convert a sequence of bytes
generated by this corresponding type to a set of C++ data structures
equivalent to the original.
<h4>Valid Expressions</h4>
<dl>
The template parameter <code>T</code> must correspond to a type which
models the <a href="serialization.html"><strong>Serializable</strong></a> concept.
<dt><h4><code>
template&lt;class T&gt;
iarchive & operator&gt;&gt;(T & t);
template&lt;class T&gt;
iarchive & operator&(T & t);
</code></h4></dt>
<dd>
<p>
Retrieves an object of type T from the archive. The object may be
<ul>
<li>A primitive data type such as int, char, float, etc.
<li>A class or struct for which a <code style="white-space: normal">serialize</code>
function has been defined.
<li>A pointer to a serializable object.
</ul>
</dd>
<dt><h4><code>
void load_binary(void *address, std::size_t count);
</code></h4></dt>
<dd>
Retrieves from the archive <code style="white-space: normal">count</code> bytes and stores
them in memory starting at <code style="white-space: normal">address</code>.
</dd>
<dt><h4><code>
void delete_created_pointers();
</code></h4></dt>
<dd>
Deletes all objects created by the loading of pointers. This can be used to
avoid memory leaks that might otherwise occur if pointers are being loaded
and the archive load encounters an exception.
</dd>
<dt><h4><code>
template&lt;class T&gt;
register_type(T * t = NULL);
</code></h4></dt>
<dd>
Retrieves the next integer from the archive and adds an entry to a table which
relates the integer to the type T. When pointers are loaded, this integer is
used to indicate which object type should be created. This process is
referred to as "class registration". It is only necessary to invoke this function for
objects of derived classes which are serialized through a base class pointer. If this
function is called during the saving of data to the archive, it should be called during the
loading of the data from the archive at the same point in the serialization process.
This is explained in detail in
<a href="special.html#derivedpointers">Special Considerations - Derived Pointers</a>
</dd>
<dt><h4><code>
void reset_object_address(void * new_address, void * old_address);
</code></h4></dt>
<dd>
In order to facilitate loading of objects through a pointer
and to elminate redundant loading of objects, this system implements object address tracking.
Normally this is done automatically with no action required on the part of the user. However,
there are cases when an object must be de-serialized to a temporary location then
moved to its final destination. This is common in loading collections.
<p>
In such cases, reset_object_address should be invoked to communicate the final address
of the last item loaded. This permits the internal tables to be correctly maintained
in these special case.
</dd>
<dt><h4><code>
unsigned int library_version() const;
</code></h4></dt>
<dd>
Returns the version number of the serialization library that created the archive.
This number will be incremented each time the library is altered in such a way
that serialization could be altered for some type. For example, suppose the type
used for a count of collection members is changed. The code that loads collections
might be conditioned on the library version to make sure that libraries created by
previous versions of the library can still be read.
</dd>
<dt><h4><code>
is_saving::type = mpl::bool&lt;false&gt;;
is_saving::value= false;
is_loading::type = mpl::bool&lt;true&gt;;
is_loading::value= true;
</code></h4></dt>
<dd>
These integral constants permit archive attributes to be queried at compiler
or execution time. They can used to generate code with boost
<a href="../../mpl/doc/index.html">mpl</a>
. For and example
showing how these can beused, see the implementation of
<a target="splithpp" href="../../../boost/serialization/split_free.hpp">split_free.hpp</a>.
</dd>
<dt><h4><code>
LA::is_saving
</code></h4></dt>
<dd>
Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;false&gt;
</dd>
<dt><h4><code>
LA::is_loading
</code></h4></dt>
<dd>
Returns the Boost MPL Integral Constant type boost::mpl::bool_&lt;true&gt;
</dd>
<dt><h4><code>
la &gt;&gt; x
<br>
la &amp; x
</code></h4></dt>
<dd>
These expressions must perform exactly the same function.
Sets <code>x</code> to a value retrieved from <code>la</code>.
<p>
Returns a reference to <code>la</code>.
</dd>
<dt><h4><code>
la.load_binary(u, count)
</code></h4></dt>
<dd>
Retrieves from <code style="white-space: normal">la</code> <code style="white-space: normal">size_t(count)</code> bytes and stores
them in memory starting at <code style="white-space: normal">u</code>.
</dd>
<dt>
<dt><h4><code>
la.register_type&lt;T&gt;()
<br>
la.register_type(u)
</code></h4></dt>
<dd>
Retrieves information about class T from the archive. This information is used to
construct the correct class when loading a pointer to a derived class not
otherwise referred to in the program by name.
Invocation of this member function is referred to as "class registration".
This is explained in detail in
<a href="special.html#derivedpointers">Special Considerations - Derived Pointers</a>.
The second syntax is included to permit this function to be called on non-conforming
compilers when <code style="white-space: normal">la</code> is a template argument.
For more information, see <a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
</dd>
<dt><h4><code>
la.get_library_version()
</code></h4></dt>
<dd>
Returns an unsigned integer containing the version number of the serialization
library that created the archive. This number will be incremented each time the
library is altered in such a way that serialization could be altered for some type.
For example, suppose the type used for a count of collection members is changed.
The code that loads collections might be conditioned on the library version to make
sure that libraries created by previous versions of the library can still be read.
</dd>
<dt><h4><code>
la.get_helper&lt;Helper&gt;(void * const helper_instance_id)
</code></h4></dt>
<dd>
Some otherwise unserializable types can be made serializable by inclusion of
a helper object. The iconic example of this is shared_ptr which needs this
helper object to keep track of previously loaded shared_ptr instances so they
can be "matched up" with subsequently loaded ones.
The first time <code style="white-space: normal">la.get_helper&lt;Helper&gt;(void * const helper_instance_id)</code>
is invoked for a given helper_instance_id, <code style="white-space: normal">Helper</code>, a default-constructed
<code style="white-space: normal">Helper</code> object is created, attached to
<code style="white-space: normal">la</code> and a reference to it is returned. Subsequent
invocations of <code style="white-space: normal">la.get_helper&lt;Helper&gt;(void * const helper_instance_id)</code> with the same id value return
a reference to the formerly constructed object. All objects created in this manner are
destroyed upon <code style="white-space: normal">la</code> destruction time. The purpose
of helper objects is discussed in
<a href="special.html#helpersupport">Special Considerations - Helper Support</a>.
</dd>
<dt><h4><code>
la.reset_object_address(v, u)
</code></h4></dt>
<dd>
Communicates to the archive that the object originally at address u has been
moved to address v.
<p>
When an object is loaded to a temporary variable and later moved to another location,
this function must be called in order communicate this fact. This permits the
archive to properly implement object tracking. Object tracking is required in order
to correctly implement serialization of pointers to instances of derived classes.
</dd>
<dt><h4><code>
la.delete_created_pointers()
</code></h4></dt>
<dd>
Deletes all objects created by the loading of pointers. This can be used to
avoid memory leaks that might otherwise occur if pointers are being loaded
and the archive load encounters an exception.
</dd>
</dl>
There are archives based on text, binary and XML file
formats but all have the above interface. Given that all archives present
the same public interface, specifcation of serialization is exactly the same
the same public interface, specification of serialization is exactly the same
for all archives. Archive classes have other members not mentioned here.
However they are related to the internal functioning of the library and
are not meant to be called by users of an archive. Implementation of new
@@ -294,7 +241,7 @@ archives is discussed in
<p>
The existence of the <code style="white-space: normal">&lt;&lt;</code>
and <code style="white-space: normal">&gt;&gt;</code> suggest
and <code style="white-space: normal">&gt;&gt;</code> suggests
a relationship between archives and C++ i/o streams. <strong>Archives are not
C++ i/o streams</strong>. All the archives included with this system take a stream
as an argument in the constructor and that stream is used for output or input.
@@ -303,12 +250,11 @@ archive interface. It just turns out that the archives written so far have
found it useful to base their implementation on streams.
<h3><a name="archive_models">Archive Models</a></h3>
This library includes a various implementation of the Archive concept.
This library includes various implementations of the Archive concept.
An archive is defined by two complementary classes. One is for saving data while
the other is for loading it.
This library includes a number of archive implementations that are "ready to go" for the
most common requirements. These classes implement the archive concept for differing data formats.
They can be used "as is" or as a basis for developing one's own particular type of archive.
@@ -319,31 +265,34 @@ these archives, one or more of the following header files must be
included in the code module containing the serialization code.
<pre><code>
// a portable text archive</a>
<a href="../../../boost/archive/text_oarchive.hpp" target="text_oarchive_cpp">boost::archive::text_oarchive(ostream &s)</a> // saving
<a href="../../../boost/archive/text_iarchive.hpp" target="text_iarchive_cpp">boost::archive::text_iarchive(istream &s)</a> // loading
<a href="../../../boost/archive/text_oarchive.hpp" target="text_oarchive_cpp">boost::archive::text_oarchive</a> // saving
<a href="../../../boost/archive/text_iarchive.hpp" target="text_iarchive_cpp">boost::archive::text_iarchive</a> // loading
// a portable text archive using a wide character stream</a>
<a href="../../../boost/archive/text_woarchive.hpp">boost::archive::text_woarchive(wostream &s)</a> // saving
<a href="../../../boost/archive/text_wiarchive.hpp">boost::archive::text_wiarchive(wistream &s)</a> // loading
<a href="../../../boost/archive/text_woarchive.hpp">boost::archive::text_woarchive</a> // saving
<a href="../../../boost/archive/text_wiarchive.hpp">boost::archive::text_wiarchive</a> // loading
// a non-portable native binary archive</a>
<a href="../../../boost/archive/binary_oarchive.hpp" target="binary_oarchive_cpp">boost::archive::binary_oarchive(ostream &s)</a> // saving
<a href="../../../boost/archive/binary_iarchive.hpp" target="binary_iarchive_cpp">boost::archive::binary_iarchive(istream &s)</a> // loading
<!--
// a non-portable native binary archive which use wide character streams
<a href="../../../boost/archive/binary_woarchive.hpp">boost::archive::binary_woarchive(wostream &s)</a> // saving
<a href="../../../boost/archive/binary_wiarchive.hpp">boost::archive::binary_wiarchive(wistream &s)</a> // loading
-->
// a portable XML archive</a>
<a href="../../../boost/archive/xml_oarchive.hpp" target="xml_oarchive_cpp">boost::archive::xml_oarchive(ostream &s)</a> // saving
<a href="../../../boost/archive/xml_iarchive.hpp" target="xml_iarchive_cpp">boost::archive::xml_iarchive(istream &s)</a> // loading
<a href="../../../boost/archive/xml_oarchive.hpp" target="xml_oarchive_cpp">boost::archive::xml_oarchive</a> // saving
<a href="../../../boost/archive/xml_iarchive.hpp" target="xml_iarchive_cpp">boost::archive::xml_iarchive</a> // loading
// a portable XML archive which uses wide characters - use for utf-8 output</a>
<a href="../../../boost/archive/xml_woarchive.hpp" target="xml_woarchive_cpp">boost::archive::xml_woarchive(wostream &s)</a> // saving
<a href="../../../boost/archive/xml_wiarchive.hpp" target="xml_wiarchive_cpp">boost::archive::xml_wiarchive(wistream &s)</a> // loading
<a href="../../../boost/archive/xml_woarchive.hpp" target="xml_woarchive_cpp">boost::archive::xml_woarchive</a> // saving
<a href="../../../boost/archive/xml_wiarchive.hpp" target="xml_wiarchive_cpp">boost::archive::xml_wiarchive</a> // loading
// a non-portable native binary archive</a>
<a href="../../../boost/archive/binary_oarchive.hpp" target="binary_oarchive_cpp">boost::archive::binary_oarchive</a> // saving
<a href="../../../boost/archive/binary_iarchive.hpp" target="binary_iarchive_cpp">boost::archive::binary_iarchive</a> // loading
<!--
// a non-portable native binary archive which use wide character streams
<a href="../../../boost/archive/binary_woarchive.hpp">boost::archive::binary_woarchive</a> // saving
<a href="../../../boost/archive/binary_wiarchive.hpp">boost::archive::binary_wiarchive</a> // loading
-->
</code></pre>
All of these archives implement the same inteface. Hence, it should suffice to describe only one
All of these archives implement the same interface. Hence, it should suffice to describe only one
of them in detail. For this purpose we will use the text archive.
@@ -354,7 +303,7 @@ namespace archive {
enum archive_flags {
no_header = 1, // suppress archive header info
no_codecvt = 2, // suppress alteration of codecvt facet
no_xml_tag_checking = 4 // suppress checking of xml tags - igored on saving
no_xml_tag_checking = 4 // suppress checking of xml tags - ignored on saving
};
} // archive
@@ -365,14 +314,13 @@ enum archive_flags {
namespace boost {
namespace archive {
template&lt;class OStream&gt;
class text_oarchive : ...
{
...
public:
... // implementation of <strong>Archive</strong> concept
oarchive(OStream & os, unsigned int flags = 0);
~oarchive();
... // implementation of the <strong>Saving Archive</strong> concept
text_oarchive(std::ostream &amp; os, unsigned int flags = 0);
~text_oarchive();
};
} // archive
@@ -381,19 +329,11 @@ public:
<dl>
<dt><h4>
Template parameter <code>OStream</code>
</h4></dt>
<dd>
An class derived from <code style="white-space: normal">basic_istream&lt;char&gt;
</code>
</dd>
<dt><h4><code>
oarchive(OStream & os, unsigned int flags = 0);
text_oarchive(std::ostream &amp; os, unsigned int flags = 0);
</code></h4></dt>
<dd>
Contructs an archive given an open <code style="white-space: normal">stream</code> as
Constructs an archive given an open <code style="white-space: normal">stream</code> as
an argument and optional flags. For most applications there will be no need to use flags.
Flags are defined by <code style="white-space: normal">enum archive_flags</code> enumerator.
Multiple flags can be combined with the <code style="white-space: normal">|</code> operator.
@@ -403,7 +343,7 @@ output with initial data which helps identify them as archives produced by this
This permits a more graceful handling of the case where an attempt is made to load an archive
from an invalid file format. In addition to this, each type of archive might have
its own information. For example, native binary archives include information about
sizes of native types and endianess to gracefully handle the case where it has been
sizes of native types and endianness to gracefully handle the case where it has been
erroneously assumed that such an archive is portable across platforms. In some cases,
where this extra overhead might be considered objectionable, it can be suppressed with the
<code style="white-space: normal">no_header</code> flag.
@@ -420,12 +360,12 @@ tags, use <code style="white-space: normal">no_xml_tag_checking</code> flag.
</dd>
<dt><h4><code>
~oarchive();
~text_oarchive();
</code></h4></dt>
<dd>
Destructor for an archive. This should be called before the stream is
closed. It restores any altered stream facets to their state before the
the archive was opened.
archive was opened.
</dd>
</dl>
@@ -434,14 +374,13 @@ the archive was opened.
namespace boost {
namespace archive {
template&lt;class IStream&gt;
class text_iarchive : ...
{
...
public:
... // implementation of <strong>Archive</strong> concept
iarchive(IStream & is, unsigned int flags = 0);
~iarchive();
... // implementation of the <strong>Loading Archive</strong> concept
text_iarchive(std::istream &amp; is, unsigned int flags = 0);
~text_iarchive();
};
} //namespace archive
@@ -451,43 +390,50 @@ public:
<dl>
<dt><h4>
Template parameter <code>IStream</code>
</h4></dt>
<dd>
An class derived from <code style="white-space: normal">basic_ostream&lt;char&gt;
</code>
</dd>
<dt><h4><code>
iarchive(IStream & is, unsigned int flags = 0);
text_iarchive(std::istream &amp; is, unsigned int flags = 0);
</code></h4></dt>
<dd>
Contructs an archive given an open <code style="white-space: normal">stream</code> as
Constructs an archive given an open <code style="white-space: normal">stream</code> as
an argument and optional flags. If flags are used, they should be the same
as those used when the archive was created. Function and usage of flags is described
above.
</dd>
<dt><h4><code>
~iarchive();
~text_iarchive();
</code></h4></dt>
<dd>
Destructor for an archive. This should be called before the stream is
closed. It restores any altered stream facets to thier state before the
closed. It restores any altered stream facets to their state before the
the archive was opened.
</dd>
</dl>
<p>
The <code style="white-space: normal">binary_oarchive</code> and
<code style="white-space: normal">binary_iarchive</code> classes are
implemented in terms of the more basic
<code style="white-space: normal">std::streambuf</code>. So, in addition
to the common class interface described above, they include the following
constructors:
<dl>
<dt><h4><code>
binary_oarchive(std::streambuf &amp; bsb, unsigned int flags = 0);
</code></h4></dt>
and
<dt><h4><code>
binary_iarchive(std::streambuf &amp; bsb, unsigned int flags = 0);
</code></h4></dt>
</dl>
<h3><a name="exceptions">Exceptions</h3>
All of the archive classes included may throw exceptions. The list of exceptions that might
be throw can be found in section <a target="detail" href="exceptions.html">Archive Exceptions</a>
be thrown can be found in section <a target="detail" href="exceptions.html">Archive Exceptions</a>
of this documentation.
<h3><a name="charactersets">Character Sets</h3>
This library includes two archive classes for XML. The wide character
version (<code style="white-space: normal">xml_w?archive</code>) renders it output as UTF-8 which can
version (<code style="white-space: normal">xml_w?archive</code>) renders its output as UTF-8 which can
handle any wide character without loss of information.
<code style="white-space: normal">std::string</code> data is converted from multi-byte format to wide
character format using the current <code style="white-space: normal">
+6 -5
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Bibliography</title>
@@ -36,22 +36,23 @@ http://www.boost.org/LICENSE_1_0.txt)
<li>Allen Holub, "Roll Your Own Persistence", <u>Microsoft
Systems Journal</u> vol 11, no 6 Jun 1996
<a name="4"></a>
<li><a href="www.codefarms.com">Code Farms, Inc.</a>
<li>Tasos Kontogiorgos &amp; Michael Kim, "A C++
Template-Based Application Architecture", <u>C++ Report</u>
<a name="5"></a>
<li>Scott Meyers, <u>Effective C++</u>, Addison-Wesley, 1992
<a name="6"></a>
<li>Bjarne Stroustrup, <u>The C++ Programming Langage</u>, Addison-Wesley, 1997
<li>Bjarne Stroustrup, <u>The C++ Programming Language</u>, Addison-Wesley, 1997
<a name="7"></a>
<li>Alexandrescu, Andrei, <u>Modern C++ Design</u>, Addison-Wesley, 2001
<a name="8"></a>
<li>Jm Hyslop, and Herb Sutter, "Factory Redux, Part2",
<li>Jim Hyslop, and Herb Sutter, "Factory Redux, Part2",
<u>C/C++ User's Journal</u>, vol 21, No. 8, August 2003
<a name="9"></a>
<li>David Vandevoorde and Nicolai M. Josuttis,
<u>C++ Templates - The Complete Guide</u>, Addison-Wesley, 2003
<a name="10"></a>
<li>Herb Sutter, "Pimples--Beauty Marks You Can Depend On",
<li>Herb Sutter, "Pimpls--Beauty Marks You Can Depend On",
<u>C++ Report</u>, from <u>More C++ Gems</u>, Cambridge University Press, 2000
<a name="11"></a>
<li>James Coplien, "Curiously Recurring Template Patterns",
@@ -62,7 +63,7 @@ http://www.boost.org/LICENSE_1_0.txt)
<a name="13"></a>
<li>Stephan Beal, "s11n serialization library", <a href="http://www.s11n.net">www.s11n.net</a>
<a name="14"></a>
<li>Vandervoorde and Josuttis, <b>C++ Templates - A Complete Guide</b>, Addison-Wesley, 2003</a>
<li>Vandevoorde and Josuttis, <b>C++ Templates - A Complete Guide</b>, Addison-Wesley, 2003</a>
</ol>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
+41 -41
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
Use, modification and distribution is subject to the Boost Software
@@ -7,7 +7,7 @@ http://www.boost.org/LICENSE_1_0.txt)
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Archive Class Diagram</title>
@@ -20,7 +20,7 @@ http://www.boost.org/LICENSE_1_0.txt)
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Archive Class Diagram</h2>
<h2 align="center">Text Archive Class Diagram</h2>
</td>
</tr>
</table>
@@ -29,136 +29,136 @@ http://www.boost.org/LICENSE_1_0.txt)
<pre><code>
basic_iarchive <a href="../../../boost/archive/detail/basic_iarchive.hpp">-></a>
basic_oarchive <a href="../../../boost/archive/detail/basic_oarchive.hpp">-&gt;</a>
|
|
| interface_iarchive&lt;text_iarchive&gt; <a href="../../../boost/archive/detail/interface_iarchive.hpp">-></a>
| interface_oarchive&lt;text_oarchive&gt; <a href="../../../boost/archive/detail/interface_oarchive.hpp">-&gt;</a>
| /
| /
| _________/
| /
| /
| /
common_iarchive&lt;text_iarchive&gt; <a href="../../../boost/archive/detail/common_iarchive.hpp">-></a>
common_oarchive&lt;text_oarchive&gt; <a href="../../../boost/archive/detail/common_oarchive.hpp">-&gt;</a>
|
|
<font color="blue">basic_text_iarchive&lt;text_iarchive&gt;</font> <a href="../../../boost/archive/basic_text_iarchive.hpp">-></a>
<font color="blue">basic_text_oarchive&lt;text_oarchive&gt;</font> <a href="../../../boost/archive/basic_text_oarchive.hpp">-&gt;</a>
|
|
| <font color="blue">basic_text_iprimitive&lt;basic_istream&gt;</font> <a href="../../../boost/archive/basic_text_iprimitive.hpp">-></a>
| <font color="blue">basic_text_oprimitive&lt;basic_ostream&gt;</font> <a href="../../../boost/archive/basic_text_oprimitive.hpp">-&gt;</a>
| /
| /
| _________/ interface_iarchive&lt;polymorphic_iarchive&gt; <a href="../../../boost/archive/detail/interface_iarchive.hpp">-></a>
| _________/ interface_oarchive&lt;polymorphic_oarchive&gt; <a href="../../../boost/archive/detail/interface_oarchive.hpp">-&gt;</a>
| / |
| / |
| / |
<font color="blue">text_iarchive_impl&lt;text_iarchive&gt;</font> <a href="../../../boost/archive/text_iarchive.hpp">-></a> <font color="red">polymorphic_iarchive</font> <a href="../../../boost/archive/polymorphic_iarchive.hpp">-></a>
<font color="blue">text_oarchive_impl&lt;text_oarchive&gt;</font> <a href="../../../boost/archive/text_oarchive.hpp">-&gt;</a> polymorphic_oarchive_impl <a href="../../../boost/archive/polymorphic_oarchive.hpp">-&gt;</a>
| \ |
| \ |
| \_____________________________________ |
| \_____________________________________ <font color="red">polymorphic_oarchive</font> <a href="../../../boost/archive/polymorphic_oarchive.hpp">-&gt;</a>
| \ /
| \ /
| \ /
<font color="red">text_iarchive</font> <a href="../../../boost/archive/text_iarchive.hpp">-></a> polymorphic_iarchive_impl&lt;text_iarchive_impl&lt;text_iarchive&gt; &gt; <a href="../../../boost/archive/detail/polymorphic_iarchive_impl.hpp">-></a>
<font color="red">text_oarchive</font> <a href="../../../boost/archive/text_oarchive.hpp">-&gt;</a> polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt; <a href="../../../boost/archive/detail/polymorphic_oarchive_route.hpp">-&gt;</a>
|
|
|
<font color="red">polymorphic_text_iarchive</font> <a href="../../../boost/archive/polymorphic_text_iarchive.hpp">-></a>
<font color="red">polymorphic_text_oarchive</font> <a href="../../../boost/archive/polymorphic_text_oarchive.hpp">-&gt;</a>
</code></pre>
This diagram shows the relationship between the various classes that implement loading (input
serialization) for text files. The hierachy and organization is identical for saving and for
This diagram shows the relationship between the various classes that implement saving (output
serialization) for text archives. The hierarchy and organization is similar for loading and for
other types of archives as well. In the diagram, classes written in <font color="blue">blue</font>
implement loading for a given archive type. (in this case its text archives).
Users include classes in <font color="red">red</font> to load their data from a partcular
type of archive. Other classes whose names are in black implment the library and should
implement saving for a given archive type. (in this case it's text archives).
Users include classes in <font color="red">red</font> to save their data from a particular
type of archive. Other classes whose names are in black implement the library and should
never change. They are in <code>namespace boost::archive::detail</code>
<dl>
<dt><code>
<a href="../../../boost/archive/detail/basic_iarchive.hpp">basic_iarchive</a>
<a href="../../../boost/archive/detail/basic_oarchive.hpp">basic_oarchive</a>
</code></dt>
<dd>
Implements the core library functions for class export, versioning, and object tracking. It is compiled
into the library as it has no template parameters.
</dd>
<p><dt><code>
<a href="../../../boost/archive/detail/interface_iarchive.hpp">interface_iarchive&lt;text_iarchive&gt;</a>
<a href="../../../boost/archive/detail/interface_oarchive.hpp">interface_oarchive&lt;text_oarchive&gt;</a>
</code></dt>
<dd>
A class that declares the standard archive interface. This has been factored out so that it
can be used as a base class for <code style="white-space: normal">polymorphic_iarchive</code>
can be used as a base class for <code style="white-space: normal">polymorphic_oarchive</code>
as well as for archive implementations.
<p><dt><code>
<a href="../../../boost/archive/detail/common_iarchive.hpp">common_iarchive&lt;text_iarchive&gt;</a>
<a href="../../../boost/archive/detail/common_oarchive.hpp">common_oarchive&lt;text_oarchive&gt;</a>
</code></dt>
<dd>
The function of this class is to make the connection between the virtual function
interface used by <code>basic_iarchive</code> and the template interface used by archive
interface used by <code>basic_oarchive</code> and the template interface used by archive
class implementations.
<p><dt><code>
<a href="../../../boost/archive/basic_text_iarchive.hpp">basic_text_iarchive&lt;text_iarchive&gt;</a>
<a href="../../../boost/archive/basic_text_oarchive.hpp">basic_text_oarchive&lt;text_oarchive&gt;</a>
</code></dt>
<dd>
Implements the basic functionality for simple text archives. The primitive load functions have been
Implements the basic functionality for simple text archives. The primitive save functions have been
factored out so it can be used in other text based archives like XML archives.
<p><dt><code>
<a href="../../../boost/archive/basic_text_iprimitive.hpp">basic_text_iprimitive&lt;basic_istream&gt;</a>
<a href="../../../boost/archive/basic_text_oprimitive.hpp">basic_text_oprimitive&lt;basic_ostream&gt;</a>
</code></dt>
<dd>
Implements the save overloads for all primitive types. This is a template with a parameter
Implements the save oversaves for all primitive types. This is a template with a parameter
which describes the stream.
<p><dt><code>
<a href="../../../boost/archive/text_iarchive.hpp">text_iarchive_impl&lt;text_iarchive&gt;</a>
<a href="../../../boost/archive/text_oarchive.hpp">text_oarchive_impl&lt;text_oarchive&gt;</a>
</code></dt>
<dd>
Inherits from the above two classes to implement text archives.
</dd>
<p><dt><code>
<a href="../../../boost/archive/text_iarchive.hpp">text_iarchive</a>
<a href="../../../boost/archive/text_oarchive.hpp">text_oarchive</a>
</code></dt>
<dd>
This is just a short hand for <code style="white-space: normal">text_iarchive_impl&lt;text_iarchive&gt;</code> .
This is just a short hand for <code style="white-space: normal">text_oarchive_impl&lt;text_oarchive&gt;</code> .
We can't use <code style="white-space: normal">typedef</code> because a
<code style="white-space: normal">typedef</code> can't refer to it self in its definition.
This is the class name that is used to serialize to a text archive.
</dd>
<p><dt><code>
<a href="../../../boost/archive/detail/interface_iarchive.hpp">interface_iarchive&lt;polymorphic_iarchive&gt;</a>
<a href="../../../boost/archive/detail/interface_oarchive.hpp">interface_oarchive&lt;polymorphic_oarchive&gt;</a>
</code></dt>
<dd>
Same template as above. However, this time the Archive parameter refers to the polymorphic archive
with a virtual function interface rather than that the template interface that
<code style="white-space: normal">common_iarchive</code> uses.
<code style="white-space: normal">common_oarchive</code> uses.
<p><dt><code>
<a href="../../../boost/archive/polymorphic_iarchive.hpp">polymorphic_iarchive</a>
<a href="../../../boost/archive/polymorphic_oarchive.hpp">polymorphic_oarchive</a>
</code></dt>
<dd>
A class with a list of virtual <code style="white-space: normal">load(T &t)</code>
A class with a list of virtual <code style="white-space: normal">save(T &amp;t)</code>
for all primitive types T. This is the class that is used to do pre-compile serialization of classes
for all archives present and future.
<p><dt><code>
<a href="../../../boost/archive/detail/polymorphic_iarchive_impl.hpp">polymorphic_iarchive_impl&lt;text_iarchive_impl&lt;text_iarchive&gt; &gt;</a>
<a href="../../../boost/archive/detail/polymorphic_oarchive_route.hpp">polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt;</a>
</code></dt>
<dd><p>
This class implements the <code style="white-space: normal">polymorphic_iarchive</code> in terms of a specific
concrete class. Virtual function calls are forwarded to the implementing class. In this example,
that impelenting class would be text_iarchive_impl.
This class implements the <code style="white-space: normal">polymorphic_oarchive</code> in terms of a specific
concrete class. Virtual function calls are routed to the implementing class. In this example,
that implementing class would be text_oarchive_impl.
<p><dt><code>
<a href="../../../boost/archive/polymorphic_text_iarchive.hpp">polymorphic_text_iarchive</a>
<a href="../../../boost/archive/polymorphic_text_oarchive.hpp">polymorphic_text_oarchive</a>
</code></dt>
<dd>
this is just a typedef so we can write polymorphic_text_archive rather than
<code style="white-space: normal">polymorphic_iarchive_impl&lt;text_iarchive_impl&lt;text_iarchive&gt; &gt;</code>
this is just a typedef so we can write <code style="white-space: normal">polymorphic_text_archive</code> rather than
<code style="white-space: normal">polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt;</code>
</dl>
<hr>
+4 -4
View File
@@ -11,7 +11,7 @@
== representations about the suitability of this software for any
== purpose. It is provided "as is" without express or implied warranty.
-->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<head>
@@ -28,7 +28,7 @@ width="277" height="86"> <br clear="all">
<a name="sec:utf8-codecvt-facet-class"></a>
<h1>UTF-8 Codecvt Facet</h1>
<h1><code>utf8_codecvt_facet</code></h1>
<pre>
@@ -42,7 +42,7 @@ template&lt;
<h2>Rationale</h2>
UTF-8 is a method of encoding Unicode text in environments where
UTF-8 is a method of encoding Unicode text in environments
where data is stored as 8-bit characters and some ascii characters
are considered special (i.e. Unix filesystem filenames) and tend
to appear more commonly than other characters. While
@@ -88,7 +88,7 @@ template&lt;
<h2>Requirements</h2>
<tt>utf8_codecvt_facet</tt> defaults to using <tt>char</tt> as
it's external data type and <tt>wchar_t</tt> as it's internal
its external data type and <tt>wchar_t</tt> as its internal
datatype, but on some architectures <tt>wchar_t</tt> is
not large enough to hold UCS-4 characters. In order to use
another internal type.You must also specialize <tt>std::codecvt</tt>
+1 -1
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Configuration</title>
+254 -205
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<title>Serialization</title>
@@ -83,212 +83,261 @@ function initialize() {
<img src="dot.gif" onclick="collapse_all()">Collapse All
-->
<p>
<dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="release_notes"><a target="detail" href="release.html">Release Notes</a></dt>
<dd><div id="release_notes_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#requirements">Requirements</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#recent_improvements">Differences from version 1.32</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#todo">Pending Issues</a></dt>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="overview"><a target="detail" href="overview.html">Overview</a></dt>
<dd><div id="overview_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="overview.html#Requirements">Requirements</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="overview.html#Otherimplementations">Other Implementations</a></dt>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="tutorial"><a target="detail" href="tutorial.html">Tutorial</a></dt>
<dd><div id="tutorial_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#simplecase">A Very Simple Case</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#nonintrusiveversion">Non Intrusive Version</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#serializablemembers">Serializable Members</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#derivedclasses">Derived Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#pointers">Pointers</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#arrays">Arrays</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#stl">STL Collections</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#versioning">Class Versioning</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#splitting">Splitting <code>serialize</code> into <code>save/load</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#archives">Archives</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#examples">List of Examples</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="reference"><a target="detail" href="archives.html">Reference</a></dt>
<dd><div id="reference_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="archive_concept"><a target="detail" href="archives.html">Archive Concept</a>
<dd><div id="archive_concept_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#saving_interface">Saving</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#loading_interface">Loading</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#archive_models">Archive Models</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#exceptions">Exceptions</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#charactersets">Character Sets</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="serialization"><a target="detail" href="serialization.html">Serializable Concept</a>
<dd><div id="serialization_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#primitiveoperators">Primitive Types</a>
<dt><img style="display:none" src="dot.gif" id="class"><a target="detail" href="serialization.html#classoperators">Class Types</a>
<dd><div id="class_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#member">Member Function</a>
<dt><img style="display:none" src="plus.gif" id="splitfree"><a target="detail" href="serialization.html#free">Free Function</a>
<dd><div id="splitfree_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#namespaces">Namespaces for Free Function Overrides</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="members"><a target="detail" href="serialization.html#classmembers">Class Members</a>
<dd><div id="members_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#base">Base Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#const"><code>const</code> Members</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#templates">Templates</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#versioning">Versioning</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#splitting">Splitting <code>serialize</code> into <code>save/load</code></a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="pointers"><a target="detail" href="serialization.html#pointeroperators">Pointers</a>
<dd><div id="pointers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#constructors">Non-Default Constructors</a>
<dt><img style="display:none" src="plus.gif" id="derivedpointers"><a target="detail" href="serialization.html#derivedpointers">Pointers to Objects of Derived Classes</a>
<dd><div id="derivedpointers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#registration">Registration</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#instantiation">Instantiation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#selectivetracking">Selective Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#runtimecasting">Runtime Casting</a>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#references">References</a>
<dt><img style="display:none" src="plus.gif" id="wrappers"><a target="detail" href="wrappers.html">Serialization Wrappers</a>
<dd><div id="wrappers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#binaryobjects">Binary Objects</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#strong_type"><code style="white-space: normal">strong_type</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#nvp">Name-Value Pairs</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#composition">Composition</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="traits"><a target="detail" href="traits.html#Traits">Class Serialization Traits</a>
<dd><div id="traits_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#version">Version</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#level">Implementation Level</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#tracking">Object Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#export">Export Key</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#Abstract">Abstract</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#typeinfo">Type Information Implementation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#templates">Template Serialization Traits</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#models">Models - Serialization Implementations Included in the Library</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="special"><a target="detail" href="special.html">Special Considerations</a>
<dd><div id="special_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#headersequence">Header Inclusion Sequence</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#objecttracking">Object Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#classinfo">Class Information</a>
<dt><img style="display:none" src="plus.gif" id="portability"><a target="detail" href="special.html#portability">Archive Portability</a>
<dd><div id="portability_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#numerics">Numerics</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#traits">Traits</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#binary_archives">Binary Archives</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#xml_archives">XML Archives</a>
<dt><img style="display:none" src="plus.gif" id="exceptions"><a target="detail" href="exceptions.html">Archive Exceptions</a>
<dd><div id="exceptions_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unregistered_class"><code>unregistered_class</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#invalid_signature"><code>invalid_signature</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unsupported_version"><code>unsupported_version</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#pointer_conflict"><code>pointer_conflict</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#incompatible_native_format"><code>incompatible_format</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#array_size_too_short"><code>array_size_too_short</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#stream_error"><code>stream_error</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#invalid_class_name"><code>invalid_class_name</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unregistered_cast"><code>unregistered_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_parse_error"><code>xml_archive_parse_error</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_tag_mismatch"><code>xml_archive_tag_mismatch</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_tag_name_error"><code>xml_archive_tag_name_error</code></a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exception_safety.html">Exception Safety</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="archive_reference"><a target="detail" href="archive_reference.html">Archive Class Reference</a>
<dd><div id="archive_reference_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#implementation">Implementation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#usage">Usage</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#testing">Testing</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#polymorphic">Polymorphic Archives</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="implementation"><a target="detail" href="implementation.html">Implementation Notes</a>
<dd><div id="implementation_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#functiontemplateordering">Partial Function Template Ordering</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#charencoding">Character Encoding</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#partialtemplatespecialization">Partial Template Specialization</a>
<dt><img style="display:none" src="plus.gif" id="othercompilerissues"><a target="detail" href="implementation.html#othercompilerissues">Specific Compiler/Library Issues</a>
<div id="othercompilerissues_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#gcc3x">GCC 3.x</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#gcc295">GCC 2.95</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#intel80">Intel 8.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc71">Visual C++ 7.1</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc70">Visual C++ 7.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc6">Visual C++ 6.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#borland">Borland 5.64 and 5.51</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#comeau">Comeau 4.3.3</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#codewarrior">Code Warrior 8.3</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#tru64">TRU64</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#dinkumware">Dinkumware Library</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#stlport">STLPort 4.5.3</a>
</dl></div>
<dt><img style="display:none" src="plus.gif" id="headers"><a target="detail" href="headers.html">Code Structure</a>
<div id="headers_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="userincludes"><a target="detail" href="headers.html#userincludes">Files Included by User Programs</a>
<div id="userincludes_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archiveimplementations">Archive Implementations</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#serializationdeclarations">Serialization Declarations</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#serializationimplementations">Serialization Implementations</a>
</dl></div>
<dt><img style="display:none" src="plus.gif" id="libraryimplementation"><a target="detail" href="headers.html#libraryimplementation">Files Which Implement the Library</a>
<div id="libraryimplementation_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archivedevelopment">Archive Development</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archiveinternals">Archive Internals</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#codemodules">Archive Library Code Modules</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#dataflowiterators">Dataflow Iterators</a>
</dl></div>
</dl></div>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="case_studies">Case Studies
<dd><div id="case_studies_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="shared_ptr.html">Template serialization - <code>shared_ptr&lt;class T&gt;</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="shared_ptr2.html"><code>shared_ptr&lt;class T&gt;</code>Revisited</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="pimpl.html">PIMPL</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="derivation.html">Derivation from an Existing Archive Class</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="miscellaneous">Miscellaneous
<dd><div id="miscellaneous_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="extended_type_info"><a target="detail" href="extended_type_info.html"><code>extended_type_info</code></a>
<dd><div id="extended_type_info_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#motivation">Motivation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#runtime">Runtime Interface</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#requirements">Requirements</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#models">Models</a>
</dl>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="void_cast.html"><code>void_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="codecvt.html">utf-8 code_cvt</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="strong_typedef.html"><code>BOOST_STRONG_TYPEDEF</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="state_saver.html"><code>state_saver</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="dataflow.html">Dataflow Iterators</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="smart_cast.html"><code>smart_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="static_warning.html"><code>BOOST_STATIC_WARNING</code></a>
<dl class="page-index">
<dt><img style="display:none" src="dot.gif" id="release_notes"><a target="detail" href="release.html">Release Notes</a></dt>
<dt><img style="display:none" src="plus.gif" id="overview"><a target="detail" href="overview.html">Overview</a></dt>
<dd><div id="overview_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="overview.html#Requirements">Requirements</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="overview.html#Otherimplementations">Other Implementations</a></dt>
</dl></div></dd>
<!--
<dt><img style="display:none" src="dot.gif"><a target="detail" href="configuration.html">Configuration Information</a></dt>
-->
<dt><img style="display:none" src="plus.gif" id="rationale"><a target="detail" href="rationale.html">Rationale</a></dt>
<dd><div id="rationale_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#serialization">The term "serialization" is preferred to "persistence"</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#archives">Archives are not streams</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#typeid"><code style="white-space: normal">typeid</code> information is not included in archives</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#trap">Compile time trap when saving a non-const value</a></dt>
</dl>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="history.html">History</a>
<!--
<dt><img style="display:none" src="dot.gif"><a target="detail" href="definitions.html">Definitions</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="faq.html">Frequently Asked Questions (FAQs)</a></dt>
-->
<dt><img style="display:none" src="dot.gif"><a target="detail" href="bibliography.html">Bibliography</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="acknowledgments.html">Acknowledgments</a></dt>
<dt><img style="display:none" src="plus.gif" id="tutorial"><a target="detail" href="tutorial.html">Tutorial</a></dt>
<dd><div id="tutorial_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#simplecase">A Very Simple Case</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#nonintrusiveversion">Non Intrusive Version</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#serializablemembers">Serializable Members</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#derivedclasses">Derived Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#pointers">Pointers</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#arrays">Arrays</a>
</dl></div>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#stl">STL Collections</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#versioning">Class Versioning</a>
<dt><img style="display:none" src="dot.gif">
<a target="detail" href="tutorial.html#splitting">
Splitting <code>serialize</code> into <code>save/load</code>
</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#archives">Archives</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#examples">List of Examples</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="reference"><a target="detail" href="reference.html">Reference</a></dt>
<dd><div id="reference_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="archive_concept"><a target="detail" href="archives.html">Archive Concepts</a>
<dd><div id="archive_concept_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#saving_interface">Saving Archive Concept</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#loading_interface">Loading Archive Concept</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#archive_models">Archive Models</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#exceptions">Exceptions</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archives.html#charactersets">Character Sets</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="serialization"><a target="detail" href="serialization.html">Serializable Concept</a>
<dd><div id="serialization_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#primitiveoperators">Primitive Types</a>
<dt><img style="display:none" src="dot.gif" id="class"><a target="detail" href="serialization.html#classoperators">Class Types</a>
<dd><div id="class_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#member">Member Function</a>
<dt><img style="display:none" src="plus.gif" id="splitfree"><a target="detail" href="serialization.html#free">Free Function</a>
<dd><div id="splitfree_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#namespaces">Namespaces for Free Function Overrides</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="members"><a target="detail" href="serialization.html#classmembers">Class Members</a>
<dd><div id="members_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#base">Base Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#const"><code>const</code> Members</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#templates">Templates</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#versioning">Versioning</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="tutorial.html#splitting">
Splitting <code>serialize</code> into <code>save/load</code>
</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="pointers"><a target="detail" href="serialization.html#pointeroperators">Pointers</a>
<dd><div id="pointers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#constructors">Non-Default Constructors</a>
<dt><img style="display:none" src="plus.gif" id="derivedpointers"><a target="detail" href="serialization.html#derivedpointers">Pointers to Objects of Derived Classes</a>
<dd><div id="derivedpointers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#registration">Registration</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#export">Export</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#instantiation">Instantiation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#selectivetracking">Selective Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#runtimecasting">Runtime Casting</a>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#references">References</a>
<dt><img style="display:none" src="plus.gif" id="traits"><a target="detail" href="traits.html">Class Serialization Traits</a>
<dd><div id="traits_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#version">Version</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#level">Implementation Level</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#tracking">Object Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#export">Export Key</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#Abstract">Abstract</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#typeinfo">Type Information Implementation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#wrappers">Wrappers</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#bitwise">Bitwise Serialization</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#templates">Template Serialization Traits</a>
<dt><img style="display:none" src="plus.gif" id="compiletimemessages"><a target="detail" href="traits.html#compiletime_messages">Compile Time Warnings and Errors</a>
<dd><div id="compiletimemessages_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#object_level">object_level</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#object_versioning">object_versioning</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#object_tracking">object_tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#pointer_level">pointer_level</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#pointer_tracking">pointer_tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="traits.html#const_loading">const_loading</a>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="wrappers"><a target="detail" href="wrappers.html">Serialization Wrappers</a>
<dd><div id="wrappers_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#binaryobjects">Binary Objects</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#arrays">Arrays</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#strong_type"><code style="white-space: normal">strong_type</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#collection_size_type">Collection Sizes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#nvp">Name-Value Pairs</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="wrappers.html#composition">Composition</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="serialization.html#models">Models - Serialization Implementations Included in the Library</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="special"><a target="detail" href="special.html">Special Considerations</a>
<dd><div id="special_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#objecttracking">Object Tracking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#classinfo">Class Information</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#helpersupport">Helper Support</a>
<dt><img style="display:none" src="plus.gif" id="portability"><a target="detail" href="special.html#portability">Archive Portability</a>
<dd><div id="portability_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#numerics">Numerics</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#traits">Traits</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#binary_archives">Binary Archives</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#xml_archives">XML Archives</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#export">Exporting Class Serialization</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#static_libraries">Static Libraries and Serialization</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#dlls">DLLS - Serialization and Runtime Linking</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#plugins">Plugins</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#multi_threading">Multi-Threading</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="special.html#optimizations">Optimizations</a>
<dt><img style="display:none" src="plus.gif" id="exceptions"><a target="detail" href="exceptions.html">Archive Exceptions</a>
<dd><div id="exceptions_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unregistered_class"><code>unregistered_class</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#invalid_signature"><code>invalid_signature</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unsupported_version"><code>unsupported_version</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#pointer_conflict"><code>pointer_conflict</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#incompatible_native_format"><code>incompatible_format</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#array_size_too_short"><code>array_size_too_short</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#stream_error"><code>stream_error</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#invalid_class_name"><code>invalid_class_name</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#unregistered_cast"><code>unregistered_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_parsing_error"><code>xml_archive_parsing_error</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_tag_mismatch"><code>xml_archive_tag_mismatch</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exceptions.html#xml_archive_tag_name_error"><code>xml_archive_tag_name_error</code></a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="exception_safety.html">Exception Safety</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="archive_reference"><a target="detail" href="archive_reference.html">Archive Class Reference</a>
<dd><div id="archive_reference_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#trivial">Trivial Archive</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#implementation">More Useful Archive Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#usage">Usage</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#testing">Testing</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="archive_reference.html#polymorphic">Polymorphic Archives</a>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="implementation"><a target="detail" href="implementation.html">Implementation Notes</a>
<dd><div id="implementation_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#charencoding">Character Encoding</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#partialtemplatespecialization">Partial Template Specialization</a>
<dt><img style="display:none" src="plus.gif" id="othercompilerissues"><a target="detail" href="implementation.html#othercompilerissues">Specific Compiler/Library Issues</a>
<dd><div id="othercompilerissues_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#gcc3x">GCC 3.X,4.X</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#gcc295">GCC 2.95</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#intel80">Intel 8.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc80">Visual C++ 8.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc71">Visual C++ 7.1</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc70">Visual C++ 7.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#vc6">Visual C++ 6.0</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#borland">Borland 5.64 and 5.51</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#comeau">Comeau 4.3.3</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#codewarrior">Code Warrior 8.3</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#tru64">TRU64</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#dinkumware">Dinkumware Library</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="implementation.html#stlport">STLPort 4.5.3</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="headers"><a target="detail" href="headers.html">Code Structure</a>
<dd><div id="headers_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="userincludes"><a target="detail" href="headers.html#userincludes">Files Included by User Programs</a>
<dd><div id="userincludes_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archiveimplementations">Archive Implementations</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#serializationdeclarations">Serialization Declarations</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#serializationimplementations">Serialization Implementations</a>
</dl></div>
<dt><img style="display:none" src="plus.gif" id="libraryimplementation"><a target="detail" href="headers.html#libraryimplementation">Files Which Implement the Library</a>
<dd><div id="libraryimplementation_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archivedevelopment">Archive Development</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#archiveinternals">Archive Internals</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#codemodules">Archive Library Code Modules</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="headers.html#dataflowiterators">Dataflow Iterators</a>
</dl></div></dd>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="case_studies">Case Studies
<dd><div id="case_studies_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="shared_ptr.html">Template serialization - <code>shared_ptr&lt;class T&gt;</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="shared_ptr2.html"><code>shared_ptr&lt;class T&gt;</code>Revisited</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="pimpl.html">PIMPL</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="private_base.html">Private Base Classes</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="simple_log.html">A Simple Logging Archive Class</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="derivation.html">Derivation from an Existing Archive Class</a>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="otherclasses">Other Classes
<dd><div id="otherclasses_detail"><dl class="page-index">
<dt><img style="display:none" src="plus.gif" id="extended_type_info"><a target="detail" href="extended_type_info.html"><code>extended_type_info</code></a>
<dd><div id="extended_type_info_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#motivation">Motivation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#runtime">Runtime Interface</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#requirements">Requirements</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="extended_type_info.html#models">Models</a>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="void_cast.html"><code>void_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="codecvt.html"><code>utf8_codecvt_facet</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="strong_typedef.html"><code>BOOST_STRONG_TYPEDEF</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="state_saver.html"><code>state_saver</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="dataflow.html">Dataflow Iterators</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="smart_cast.html"><code>smart_cast</code></a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="static_warning.html"><code>BOOST_STATIC_WARNING</code></a>
<dt><img style="display:none" src="plus.gif" id="singleton"><a target="detail" href="singleton.html"><code>singleton</code></a>
<dd><div id="singleton_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#motivation">Motivation</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#features">Features</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#classinterface">Class Interface</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#requirements">Requirements</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#examples">Examples</a>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="singleton.html#multithreading">Multi-Threading</a>
</dl></div></dd>
</dl></div></dd>
<!--
<dt><img style="display:none" src="dot.gif"><a target="detail" href="configuration.html">Configuration Information</a></dt>
-->
<dt><img style="display:none" src="dot.gif"><a target="detail" href="faq.html">Tips and Tricks</a>
<dt><img style="display:none" src="plus.gif" id="rationale"><a target="detail" href="rationale.html">Rationale</a></dt>
<dd><div id="rationale_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#serialization">The term "serialization" is preferred to "persistence"</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#archives">Archives are not streams</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="rationale.html#typeid"><code style="white-space: normal">typeid</code> information is not included in archives</a></dt>
</dl></div></dd>
<dt><img style="display:none" src="plus.gif" id="todo"><a target="detail" href="todo.html">To Do</a></dt>
<dd><div id="todo_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#portablebinaryarchive">Portable Binary Archive</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#performancetesting">Performance Testing and Profiling</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#backversioning">Back Versioning</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="todo.html#nortti">Environments without RTTI</a></dt>
<dt><img style="display:none" src="plus.gif" id="newcasestudies"><a target="detail" href="new_case_studies.html">Proposed Case Studies</a></dt>
<dd><div id="newcasestudies_detail"><dl class="page-index">
<dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#functionobject">Serializing a Function Object</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#archiveadaptor">Archive Adaptors</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="new_case_studies.html#archivehelper">Archive Helpers</a></dt>
</dl></div></dd>
</dl></div></dd>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="history.html">History</a>
<!--
<dt><img style="display:none" src="dot.gif"><a target="detail" href="definitions.html">Definitions</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="faq.html">Frequently Asked Questions (FAQs)</a></dt>
-->
<dt><img style="display:none" src="dot.gif"><a target="detail" href="bibliography.html">Bibliography</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="acknowledgments.html">Acknowledgments</a></dt>
</dl></div>
</small>
</body>
</html>
+11 -25
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Dataflow Iterators</title>
@@ -35,26 +35,26 @@ We would prefer the solution that is:
<ul>
<li>Decomposable. so we can code, test, verify and use each (simple) stage of the conversion
independently.
<li>Composable. so we can used this composite as a new component somewhere else.
<li>Composable. so we can use this composite as a new component somewhere else.
<li>Efficient, so we're not required to re-implement it again.
<li>Scalable, so that it works well for short and arbitrarily long sequences.
</ul>
The approach that comes closest to meeting these requirements is that described
and implemented with <a href="../../iterator/doc/index.html">Iterator Adaptors</a>.
The fundamental feature of an Iterator Adaptor template that makes in interesting to
The fundamental feature of an Iterator Adaptor template that makes it interesting to
us is that it takes as a parameter a base iterator from which it derives its
input. This suggests that something like the following might be possible.
<pre><code>
typedef
insert_linebreaks&lt; // insert line breaks every 72 characters
base64_from_binary&lt; // convert binary values ot base64 characters
insert_linebreaks&lt; // insert line breaks every 76 characters
base64_from_binary&lt; // convert binary values to base64 characters
transform_width&lt; // retrieve 6 bit integers from a sequence of 8 bit bytes
const char *,
6,
8
&gt;
&gt;
,72
,76
&gt;
base64_text; // compose all the above operations in to a new iterator
@@ -71,12 +71,12 @@ included is <a target="transform_iterator" href="../../iterator/doc/transform_it
transform_iterator</a>, which can be used to implement 6 bit integer =&gt; base64 code.
<h3>Dataflow Iterators</h3>
Unfortunately, not all iterators which inherit from Iterator Adaptors are guarenteed
Unfortunately, not all iterators which inherit from Iterator Adaptors are guaranteed
to meet the composability goals stated above. To accomplish this purpose, they have
to be written with some additional considerations in mind.
We define a Dataflow Iterator as an class inherited from <code style="white-space: normal">iterator_adaptor</code> which
fulfills as a small set of additional requirements.
fulfills a small set of additional requirements.
<h4>Templated Constructors</h4>
<p>
@@ -110,22 +110,8 @@ std::copy(
The recursive application of this template is what automatically generates the
constructor <code style="white-space: normal">base64_text(const char *)</code> in our example above. The original
Iterator Adaptors include a <code style="white-space: normal">make_xxx_iterator</code> to fulfill this function.
However, I believe these are unwieldy to use compared to the above solution usiing
However, I believe these are unwieldy to use compared to the above solution using
Templated constructors.
<p>
Unfortunately, some systems which fail to properly support partial function template
ordering cannot support the concept of a templated constructor as implemented above.
A special"wrapper" macro has been created to work around this problem. With this "wrapper"
the above example is modified to:
<pre><code>
std::copy(
base64_text(BOOST_MAKE_PFTO_WRAPPER(address)),
base64_text(BOOST_MAKE_PFTO_WRAPPER(address + count)),
ostream_iterator&lt;char&gt;(os)
);
</code></pre>
This macro is defined in <a target="pfto" href="../../../boost/pfto.hpp">&lt;boost/pfto.hpp&gt;</a>.
For more information about this topic, check the source.
<h4>Dereferencing</h4>
Dereferencing some iterators can cause problems. For example, a natural
@@ -149,7 +135,7 @@ Iterators which fulfill the above requirements should be composable and the abov
code should implement our binary to base64 conversion.
<h3>Iterators Included in the Library</h3>
Dataflow iterators for the serialization library are all defined in the hamespace
Dataflow iterators for the serialization library are all defined in the namespace
<code style="white-space: normal">boost::archive::iterators</code> included here are:
<dl class="index">
<dt><a target="base64_from_binary" href="../../../boost/archive/iterators/base64_from_binary.hpp">
@@ -195,7 +181,7 @@ The standard stream iterators don't quite work for us. On systems which impleme
as unsigned short integers (E.G. VC 6) they didn't function as I expected. I also made some
adjustments to be consistent with our concept of Dataflow Iterators. Like the rest of our
iterators, they are found in the namespace <code style="white-space: normal">boost::archive::interators</code> to avoid
conflict the standard library version.
conflicts with the standard library versions.
<dl class = "index">
<dt><a target="istream_iterator" href="../../../boost/archive/iterators/istream_iterator.hpp">
istream_iterator</a></dt>
+1 -1
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Definitions</title>
+55 -62
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Derivation from an Existing Archive</title>
@@ -26,42 +26,48 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<dl class="page-index">
<dt><a target="detail" href="#portable_archives">Portable Binary Archives</a>
<dt><a target="detail" href="#fast_archives">Fast Binary Archives</a>
</dl>
<a name=portable_archives>
<h3>Portable Binary Archives</h3>
<h3>Log Archive</h3>
It may happen that one wants to create a new archive class by derivation from one
of the included ones. Included is a sample program that shows how to derive a
new archive from one of the ones included with the library. The first example is
<a href="../example/demo_portable_archive.cpp" target="demo_portable_archive_cpp">demo_portable_archive.cpp</a>.
This binary archive save/loads integers in a portable format. To this end
it is derived from the native binary archive and the save/load functions for
integers are overridden with special versions which convert to big endian
format if necessary. It also implements an exception for the case where an
integer saved on one platform is too large for the platform which is loading
the archive. This example doesn't address floating point types.
This examples illustrates several issues that have to be addressed when doing
something like this. The discussion below refers to the output archive only but it
applies equally to input archives as well.
<a href="../example/demo_log.cpp" target="demo_log_cpp">
demo_log.cpp</a>.
<p>
This derivation from the xml archive writes output in xml without the extra
information required to read the data back into the application. It might be
used to export one's data as simple xml for other applications or for logging
data while debugging.
<p>
To this end it is derived from the included xml archive and the save functions for
some types are specialized for this application.
<p>
The serialization library is
implemented using the <b>C</b>uriously <b>R</b>ecurring <b>T</b>emplate
<b>P</b>attern (<b>CRTP</b>). Also, all common code is factored out into
separate modules to minimize code repetition. This makes derivation from
an existing archive less straightforward than it would otherwise be.
<p>
This example illustrates several issues that have to be addressed when doing
something like this
<ol>
<li><i>It is derived from</i> <code style="white-space: normal">binary_oarchive_impl<portable_binary_oarchive></code>
<b>NOT</b> <code style="white-space: normal">binary_oarchive</code> <br>
<li><i>It is derived from</i> <code style="white-space: normal">xml_oarchive_impl<log_archive></code>
<b>NOT</b> <code style="white-space: normal">xml_oarchive</code> <br>
As described in the comments in
<a href="../../../boost/archive/binary_oarchive.hpp" target="binary_oarchive_hpp">binary_oarchive.hpp</a>.
<code style="white-space: normal">binary_oarchive</code> really a shorthand name for
<code style="white-space: normal">binary_oarchive_impl&lt;binary_oarchive&gt;</code>. So we should derive
from <code style="white-space: normal">binary_oarchive_impl&lt;portable_binary_oarchive&gt;</code> rather
than <code style="white-space: normal">binary_oarchive</code>.
<a href="../../../boost/archive/xml_oarchive.hpp" target="xml_oarchive_hpp">xml_oarchive.hpp</a>.
<code style="white-space: normal">xml_oarchive</code> really a shorthand name for
<code style="white-space: normal">xml_oarchive_impl&lt;xml_oarchive&gt;</code>. So we should derive
from <code style="white-space: normal">xml_oarchive_impl&lt;log_archive&gt;</code> rather
than <code style="white-space: normal">xml_oarchive</code>.
<pre><code>
class portable_binary_oarchive :
// don't derive from binary_oarchive !!!
public binary_oarchive_impl&lt;portable_binary_oarchive&gt;
class log_archive :
// don't derive from xml_oarchive !!!
public xml_oarchive_impl&lt;log_archive&gt;
{
...
</code></pre>
<li><i>Note the</i> <code style="white-space: normal">portable_binary_oarchive</code> <i>between the</i> &lt;&gt;
<li><i>Note the</i> <code style="white-space: normal">log_archive</code> <i>between the</i> &lt;&gt;
This is required so that base classes can downcast their <code style="white-space: normal">this</code> pointer
to the most derived class. This is referred to as <b>C</b>uriously <b>R</b>ecurring
<b>T</b>emplate <b>P</b>attern (<b>CRTP</b>) <a href="bibliography.html#11">[11]</a>.
@@ -70,20 +76,21 @@ It is used to implement static polymorphism.
This can be done by making members public or by including friend declarations for
the base classes.
<pre><code>
typedef portable_binary_oarchive derived_t;
friend class detail::common_oarchive&lt;derived_t&gt;;
friend class basic_binary_oarchive&lt;derived_t&gt;;
friend class basic_binary_oprimitive&lt;derived_t, std::ostream&gt;;
friend class detail::common_oarchive&lt;log_archive&gt;;
friend class basic_xml_oarchive&lt;log_archive&gt;;
friend class boost::serialization::save_access;
</code></pre>
<li><i>Base class functions will usually need to be explicitly invoked</i>
We commonly overload the function name <code style="white-space: normal">save</code> for saving primitives.
This is very convenient. Usage of a function name in a derived class
<li><i></i>Reread <a target="detail" href="headers.html#archiveinternals">Archive Internals</a>.
This describes the class hierarchy so that you know what to override.
<li><i>Base class functions will usually need to be explicitly invoked.</i>
We commonly specialize the function name <code style="white-space: normal">save_override</code>
for saving primitives. Usage of a function name in a derived class
"hides" similarly named functions of the base class. That is,
function name overloading doesn't automatically
include base classes. To address this, we can use:
<pre><code>
using binary_oarchive_impl&lt;derived_t&gt;::save;
using xml_oarchive_impl&lt;derived_t&gt;::save;
void save(const unsigned int t);
...
</code></pre>
@@ -92,14 +99,14 @@ that the following equivalent works on more compilers.
<pre><code>
// default fall through for any types not specified here
template&lt;class T&gt;
void save(const T & t){
binary_oarchive_impl&lt;derived_t&gt;::save(t);
void save(const T &amp; t){
xml_oarchive_impl&lt;derived_t&gt;::save(t);
}
void save(const unsigned int t);
...
</code></pre>
so it's what I use.
<li><i>Template definitions of base classes may have to be included.</i>
<li><i>Template definitions of base classes may have to be explicitly instantiated.</i>
The demo includes
<pre><code>
// explicitly instantiate for this type of binary stream
@@ -107,48 +114,34 @@ so it's what I use.
</code></pre>
for just this purpose. Failure to include required template definitions
will result in undefined symbol errors when the program is linked.
<li><i>Without alteration, this class cannot be further derived from</i><br>
<li><i>Without alteration, this class cannot be further derived from.</i><br>
Base classes using <b>CRTP</b> must be templates with a parameter corresponding to
the most derived class. As presented here, this class doesn't qualify, so
it cannot be used as a base class. In order to derive further from this class,
it would have to be reorganized along the lines of the original <code style="white-space: normal">binary_oarchive</code>.
it would have to be reorganized along the lines of the original <code style="white-space: normal">xml_oarchive</code>.
Specifically, it would look something like:
<pre><code>
template&lt;class Archive&gt;
class portable_binary_oarchive_impl :
// don't derive from binary_oarchive !!!
public binary_oarchive_impl&lt;Archive&gt;
class log_archive_impl :
// don't derive from xml_oarchive !!!
public xml_oarchive_impl&lt;Archive&gt;
{
...
);
};
// do not derived from this class !!!
class portable_binary_oarchive :
public portable_binary_oarchive_impl&lt;portable_binary_oarchive&gt;
// do not derive from this class !!!
class log_archive :
public log_archive_impl&lt;log_archive&gt;
{
public:
portable_binary_oarchive(std::ostream & os, unsigned int flags = 0) :
portable_binary_oarchive_impl&lt;binary_oarchive&gt;(os, flags)
log_archive(std::ostream &amp; os, unsigned int flags = 0) :
log_archive_impl&lt;xml_oarchive&gt;(os, flags)
{}
};
</code></pre>
</ol>
<a name=fast_archives>
<h3>Fast Binary Archives</h3>
The second example
<a href="../example/demo_fast_archive.cpp" target="demo_fast_archive_cpp">demo_fast_archive.cpp</a>.
is similar to the first one. The difference is that it intercepts the serialization before
the default serialization is invoked. In this case we want to replace the default
serialization of C arrays of integers with a faster one. The default version
will invoke serialization of each element of the array. If its an array of
integers, and we're not concerned with the archive being portable to another platform
we can just save/load the whole array as a binary string of bytes. This should
be faster than the default element by element method.
<p>
The same considerations that applied when overriding the the save/load of primitives
above apply here, and the code is very similar.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
Distributed under the Boost Software License, Version 1.0. (See
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 838 B

After

Width:  |  Height:  |  Size: 846 B

+3 -3
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Reference</title>
@@ -70,7 +70,7 @@ an invalid pointer, or creating a memory leak.
If an exception occurs, <i>referenced</i> pointers will not need to be deleted
so there will be no memory leaks. The destructor of this class won't attempt to
delete these pointers so there will be no problem with dangling references.
<i>owned</i> pointers are handled exactly as described above.
<i>Owned</i> pointers are handled exactly as described above.
<p>
<li><h4>class contains <i>referenced</i> pointers which might be created by load</h4>
If a <i>referenced</i> pointer is loaded before its corresponding <i>owned</i>
@@ -81,7 +81,7 @@ an invalid pointer, or creating a memory leak.
<li>Trap exceptions with a <code style="white-space: normal">try/catch</code> block.
<li>Within the catch part, invoke the archive function
<code style="white-space: normal">delete_created_pointers()</code> to delete any pointers
created by the class load. Without out other action, objects created in
created by the class load. Without other action, objects created in
this way would end up as memory leaks as they are not considered <i>owned</i>
pointers and hence aren't destroyed.
<li>The object's destructor won't try
+66 -28
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Archive Exceptions</title>
@@ -29,12 +29,15 @@ http://www.boost.org/LICENSE_1_0.txt)
<dt><a href="#unregistered_class"><code style="white-space: normal">unregistered_class</code></a>
<dt><a href="#invalid_signature"><code style="white-space: normal">invalid_signature</code></a>
<dt><a href="#unsupported_version"><code style="white-space: normal">unsupported_version</code></a>
<dt><a href="#unsupported_class_version"><code style="white-space: normal">unsupported_class_version</code></a>
<dt><a href="#pointer_conflict"><code style="white-space: normal">pointer_conflict</code></a>
<dt><a href="#incompatible_native_format"><code style="white-space: normal">incompatible_native_format</code></a>
<dt><a href="#array_size_too_short"><code style="white-space: normal">array_size_too_short</code></a>
<dt><a href="#stream_error"><code style="white-space: normal">stream_error</code></a>
<dt><a href="#input_stream_error"><code style="white-space: normal">input_stream_error</code></a>
<dt><a href="#output_stream_error"><code style="white-space: normal">output_stream_error</code></a>
<dt><a href="#invalid_class_name"><code style="white-space: normal">invalid_class_name</code></a>
<dt><a href="#unregistered_class"><code style="white-space: normal">unregistered_class</code></a>
<dt><a href="#multiple_code_instantiation"><code style="white-space: normal">multiple_code_instantiation</code></a>
<dt><a href="#xml_archive_parsing_error"><code style="white-space: normal">xml_archive_parsing_error</code></a>
<dt><a href="#xml_archive_tag_mismatch"><code style="white-space: normal">xml_archive_tag_mismatch</code></a>
<dt><a href="#xml_archive_tag_name_error"><code style="white-space: normal">xml_archive_tag_name_error</code></a>
@@ -43,8 +46,9 @@ http://www.boost.org/LICENSE_1_0.txt)
Archive operators can throw a <code style="white-space: normal">boost::archive_exception</code>
object which can be caught by an application program. These exceptions are defined
in the files <a target="archive_exception_hpp" href="../../../boost/archive/archive_exception.hpp">
boost/archive/archive_exception.hpp</a> and <a target="archive_xml_exception_hpp" href="../../../boost/archive/archive_exception.hpp">
boost/archive/archive_xml_exception.hpp</a>.
archive_exception.hpp</a>
and <a target="basic_xml_archive_hpp" href="../../../boost/archive/basic_xml_archive.hpp">
basic_xml_archive.hpp</a>.
<pre><code>
namespace boost {
namespace archive {
@@ -53,7 +57,7 @@ class archive_exception : public std::exception
{
public:
typedef enum {
unregistered_class, // attempt to serialize a pointer of an
unregistered_class, // attempt to serialize a pointer of
// an unregistered class
invalid_signature, // first line of archive does not contain
// expected string
@@ -62,17 +66,23 @@ public:
pointer_conflict // an attempt has been made to directly serialize
// an object after having already serialized the same
// object through a pointer. Were this permitted,
// it the archive load would result in the creation
// of extraneous object.
// the archive load would result in the creation
// of an extraneous object.
incompatible_native_format, // attempt to read native binary format
// on incompatible platform
array_size_too_short, // array being loaded doesn't fit in array allocated
stream_error // i/o error on stream
input_stream_error // error on stream input
invalid_class_name, // class name greater than the maximum permitted.
// most likely a corrupted archive or an attempt
// to insert virus via buffer overrun method.
unregistered_cast // base - derived relationship not registered with
unregistered_cast, // base - derived relationship not registered with
// void_cast_register
unsupported_class_version, // type saved with a version # greater than the
// one used by the program. This indicates that the program
// needs to be rebuilt.
multiple_code_instantiation, // code for implementing serialization for some
// type has been instantiated in more than one module.
output_stream_error // error on stream output
} exception_code;
exception_code code;
archive_exception(exception_code c) : code(c) {}
@@ -99,7 +109,7 @@ public:
<h3><a name="unregistered_class"><code style="white-space: normal">unregistered_class</code></a></h3>
An attempt has been made to serialize a polymorphic class through a pointer
without either registering it or associating it with an export key. This can also occur
when using a new archive how class name has not been added to the system with the
when using a new archive whose class name has not been added to the system with the
<code style="white-space: normal">BOOST_ARCHIVE_CUSTOM_ARCHIVE_TYPES</code> macro.
<h3><a name="invalid_signature"><code style="white-space: normal">invalid_signature</code></a></h3>
@@ -108,10 +118,10 @@ the archive is opened, It is presumed that this file is not a valid archive and
exception is thrown.
<h3><a name="unsupported_version"><code style="white-space: normal">unsupported_version</code></a></h3>
This system assigns a version number of 2 to all archives created. Note that this is in
This system records the current library version number to all archives created. Note that this is in
no way related to version number of classes used by application programs. This refers
to the version of the serialization system used to create the archive. Future versions
of this serialization system will be able to identify archives created under previous
of this serialization system will be able to identify archives created under a previous
(i.e. this) system and alter the loading procedure accordingly. Hence, future enhancements
to this serialization system should not obsolete any existing archive files. It is only
necessary to increment this version number when the newer system creates archives
@@ -119,27 +129,35 @@ incompatible in format with the current one.
<p>Should it ever occur that an older program attempts to read newer archives whose
format has changed, this exception is thrown.
<h3><a name="unsupported_class_version"><code style="white-space: normal">unsupported_class_version</code></a></h3>
An attempt has been made to load a class whose version has been incremented since the
program was written. Suppose that a class has been assigned version number 3 and the program
has been built and sent to third parties. Now suppose that the definition of that class
has been altered, the version number has been incremented to 4 and new archives have been
built. If one attempts to load these new archives with the original program, this
exception will be thrown.
<h3><a name="pointer_conflict"><code style="white-space: normal">pointer_conflict</code></a></h3>
To understand what this exception means consider the following scenario
<pre><code>
template&lt;class Archive&gt;
void T::save(Archive &ar) const
void T::save(Archive &amp;ar) const
{
const A * aptr = &a;
ar << aptr; // save an instance of object of class A through a pointer
const A * aptr = &amp;a;
ar &lt;&lt; aptr; // save an instance of object of class A through a pointer
...
ar << a; // save an instance of an object of class A
assert(aptr == &a); // this must be true
ar &lt;&lt; a; // save an instance of an object of class A
assert(aptr == &amp;a); // this must be true
}
template&lt;class Archive&gt;
void T::load(Archive &ar)
void T::load(Archive &amp;ar)
{
A * aptr;
ar >> aptr; // create and initialize a new instance of class A
ar &gt;&gt; aptr; // create and initialize a new instance of class A
...
ar >> a; // restore state of on object of class A
assert(aptr == &a); // this won't be true
ar &gt;&gt; a; // restore state of on object of class A
assert(aptr == &amp;a); // this won't be true
}
</pre></code>
An object is saved first through a pointer then directly. Upon loading back
@@ -161,8 +179,16 @@ An attempt has been made to read an array that is larger than the array size.
This should only occur when the size of an array in code is reduced after an
archive has already been created.
<h3><a name="stream_error"><code style="white-space: normal">stream_error</code></a></h3>
An error has occured durring stream input or ouput. This includes
<h3>
<a name="input_stream_error"><code style="white-space: normal">input_stream_error</code></a>
<br>
<a name="output_stream_error"><code style="white-space: normal">output_stream_error</code></a>
</h3>
An error has occurred during stream input or ouput. Aside from the common
situations such as a corrupted or truncated input file, there are
several less obvious ones that sometimes occur.
<p>
This includes
an attempt to read past the end of the file. Text files need a terminating
new line character at the end of the file which is appended when the
archive destructor is invoked. Be sure that an output archive on a stream
@@ -189,10 +215,17 @@ std::vector&lt;V&gt; v;
ia &gt;&gt; v;
}
</code></pre>
<p>
Another one is the passing of uninitialized data. In general, the behavior
of the serialization library when passed uninitialized data is undefined.
If it can be detected, it will invoke an assertion in debug builds.
Otherwise, depending on the type of archive, it may pass through without
incident or it may result in an archive with unexpected data in it.
This, in turn, can result in the throwing of this exception.
<h3><a name="invalid_class_name"><code style="white-space: normal">invalid_class_name</code></a></h3>
Class name length greater than the maximum permitted. Most likely cause is a corrupted
archive or an attempt to insert virus via buffer overrun method.
archive or an attempt to insert a virus via the buffer overrun method.
<h3><a name="unregistered_cast"><code style="white-space: normal">unregistered_cast</code></a></h3>
In order to support casting between pointers of base and derived classes
@@ -200,10 +233,15 @@ at runtime, a collection of legitimate conversions is maintained by the system.
Normally this collection is maintained without any explicit action
on the part of the user of the library. However, there are special cases
where this might have to be done explicitly and could be overlooked. This
is described in <a href="special.html#runtimecasting">Runtime Casting</a>.
is described in <a href="serialization.html#runtimecasting">Runtime Casting</a>.
This exception is thrown if an attempt is made to convert between two pointers
whose relationship has not been registered,
<h3><a name="multiple_code_instantiation"><code style="white-space: normal">multiple_code_instantiation</code></a></h3>
This exception is thrown when it is detected that the serialization of the same type
has been instantiated more than once. This might occur when
serialization code is instantiated in both the mainline and one or more DLLS.
<h3><a name="xml_archive_parsing_error"><code style="white-space: normal">xml_archive_parsing_error</code></a></h3>
The XML generated by the serialization process is intimately coupled to the
C++ class structure, relationships between objects and the serialization
@@ -212,8 +250,8 @@ to the loading serialization and this exception might be thrown. This might
occur for one of the following reasons:
<ul>
<li>The archive has been edited outside the serialization system. This might
be possible if only the data is changed and not the XML attributes and nesting
structure is left unaltered. But any other editing is likely to render the
be possible if only the data is changed and the XML attributes and nesting
structure are left unaltered. But any other editing is likely to render the
archive unreadable by the serialization library.
<li>The serialization has been altered and an archive generated by the old
code is being read. That is, versioning has not been properly employed to
@@ -221,7 +259,7 @@ properly deserialize previously created archives.
</ul>
<h3><a name="xml_archive_tag_mismatch"><code style="white-space: normal">xml_archive_tag_mismatch</code></a></h3>
This exception will be thrown if the start or end tag of and XML element doesn't match
This exception will be thrown if the start or end tag of an XML element doesn't match
the name specified for the object in the program.
<h3><a name="xml_archive_tag_name_error"><code style="white-space: normal">xml_archive_tag_name_error</code></a></h3>
+241 -147
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - extended_type_info</title>
@@ -30,9 +30,9 @@ http://www.boost.org/LICENSE_1_0.txt)
<dt><a href="#runtime">Runtime Interface</a>
<dt><a href="#requirements">Requirements</a>
<dt><a href="#models">Models</a>
<dt><a href="#example">Example</a>
</dl>
<h3><a name="motivation">Motivation</a></h3>
The serialization library needs a system like
<code style="white-space: normal">type_info/typeid()</code> to perform
@@ -49,7 +49,7 @@ the following functions
The main function we require - <code style="white-space: normal">std::typeid()</code>
is not available in all environments. Support for this function depends upon
runtime typing(RTTI) support from the compiler. This may be non-existent
or not enabled for reasons such as a percieved inefficiency.
or not enabled for reasons such as a perceived inefficiency.
<li>
<code style="white-space: normal">std::type_info</code> includes a string
containing type name. This would seem to satisfy 2) above.
@@ -57,128 +57,128 @@ the following functions
and operating systems. This makes it unusable for support of portable archives.
<li>
Even if the type name string could somehow be made portable, there is no
guarentee that class headers would be included in the same name space accross
guarantee that class headers would be included in the same namespace accross
different applications. In fact, including different headers in different
name spaces is an accepted method used to avoid name space conflicts.
namespaces is an accepted method used to avoid namespace conflicts.
Thus the namespace::class_name can't be used as a key.
<li>
We may want the ability to serialize objects through a base class even though
they have no <code style="white-space: normal">virtual</code> function. That
is, objects of classes which are not polymorphic in the strict C++ sense. This
is not supported by the standard system.
<li>
There exists the possibility that different classes use different type id
mechanism. The class header might include this information. If we want to
import class headers accross applications, its convenient that the type id
mechanisms. The class header might include this information. If we want to
import class headers accross applications, it's convenient that the type id
mechanism support inter-operability accross different type id systems.
</ul>
<h3>Features</h3>
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code> is an implementation
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">
extended_type_info</a></code> is an implementation
of <code style="white-space: normal">std::type_info</code> functionality with the
following features:
<ul>
<li>
Maintains a global table of <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code> records - one for each type known
to the program.
Builds a set of <a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">
<code style="white-space: normal">extended_type_info</a></code> records - one for each type
serialized.
<li>
permits association of an arbitrary key with a type. Often this key would
permits association of an arbitrary string key with a type. Often this key would
be the class name - but it doesn't have to be. This key is referred to as
a GUID - Globally Unique IDentifier. Presumably it should be unique in the universe.
Typically this GUID would be in header files and be used to match type accross
applications.
applications. The macro BOOST_CLASS_EXPORT can be invoked to associate a string
key with any known type. We'll refer to these types as "exported types"
<li>
permits the "mixing" of type info systems. For example, one class might use
<code style="white-space: normal">typeid()</code> to find the external identifier
of a class while another might not.
</ul>
The serialization system maintains two global tables.
<ul>
<li>The first is a global type table. it and has with an entry for each type used.
Each entry is an instance of a class derived from
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>. This table is used
to retrieve the unique <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
information for any given type.
<li>The second is global key table. It has an entry for each type which has been assigned a GUID string key.
This table is used to retrieve the unique
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code> given its GUID.
</ul>
This library includes two different type id systems:
<ul>
<li>
<code style="white-space: normal"><a target="extended_type_info_typeid.hpp" href = "../../../boost/serialization/extended_type_info_typeid.hpp">extended_type_info_typeid</a></code>
which is implemented in terms of the standard
<code style="white-space: normal">typeid()</code>.
<li>
<code style="white-space: normal"><a target="extended_type_info_no_rtti.hpp" href="../../../boost/serialization/extended_type_info_no_rtti.hpp">extended_type_info_no_rtti</a></code>
which is implemented in a way that doesn't rely on the existence
RTTI. However, it does require that all classes for which type id is to be used
be explictly assigned an external key - which otherwise would be optional.
</ul>
Exported types are maintained in a global table so that given a string key, the
corresponding type can be found. This facility is used by the serialization library
in order to construct types serialized through a base class pointer.
<h3><a name="runtime">Runtime Interface</a></h3>
<pre><code">
<pre><code>
namespace boost {
namespace serialization {
class BOOST_SERIALIZATION_DECL extended_type_info :
private boost::noncopyable
class extended_type_info
{
protected:
extended_type_info(const char * type_info_key);
// this class can't be used as is. It's just the
// common functionality for all type_info replacement
// systems. Hence, make these protected
extended_type_info(
const unsigned int type_info_key,
const char * key
);
~extended_type_info();
void key_register();
void key_unregister();
public:
void self_register();
void key_register(const char *key);
const char * get_key() const;
bool operator<(const extended_type_info &rhs) const;
bool operator==(const extended_type_info &rhs) const;
bool operator!=(const extended_type_info &rhs) const;
bool operator&lt;(const extended_type_info &amp;rhs) const;
bool operator==(const extended_type_info &amp;rhs) const;
bool operator!=(const extended_type_info &amp;rhs) const {
return !(operator==(rhs));
}
// for plugins
virtual void * construct(unsigned int count = 0, ...) const;
virtual void destroy(void const * const p) const;
static const extended_type_info * find(const char *key);
static const extended_type_info * find(const extended_type_info * t);
};
} // namespace serialization
} // namespace boost
</code></pre>
There must be one and only one <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
instance created for each type. For this reason, this class is marked is derived from
<code style="white-space: normal">boost::noncopyable</code>.
<p>
Generally, there will be one and only one
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
instance created for each type. However, this is enforced only at the executable
module level. That is, if a program includes some shared libraries or DLLS,
there may be more than one instance of this class corresponding to a particular type.
For this reason the comparison functions below can't just compare the addresses of
this instance but rather must be programmed to compare the actual information
the instances contain.
<dl>
<dt><h4><pre><code>
extended_type_info(const char * type_info_key);</code></pre></h4></dt>
<dd>
This constructor should be called by all derived classes. It should be passed
a pointer to a const string which identifies the type id system being used. This
type id is used to distinguish among the various type id system that might be used
and allow them to interoperate.
</dd>
<dt><h4><pre><code>
void self_register();
extended_type_info(unsigned int type_info_key, const char *key);
</code></pre></h4></dt>
<dd>
This function adds entry for an entry to the global type table. It would usually be
called from the constructor of the derived class which implements the
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code> functionality.
</dd>
<dt><h4><pre><code>
void key_register(const char *key);
</code></pre></h4></dt>
<dd>
Assign a unique character string identifier to this
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
instance and add it to the corresponding global trable.
This key is used to identify a type accross different instances of the program.
In this way, one instance may know what type to create when necessary.
For this purpose, it must be the same in all program instances which
refer to the same type.
This constructor should be called by all derived classes.
The first argument should be the particular implementation.
For this default implementation base on typeid(), this is the
value 1. Each system must have its own integer. This value
is used to permit the inter-operability of different typeinfo
systems.
<p>
The second argument is a const string which is the external
name of the type to which this record corresponds.
It may sometimes be referred to as a GUID - a <b>G</b>lobal <b>U</b>nique <b>ID</b>entifier.
It is passed through archives from one program invocation to
another to uniquely identify the types that the archive contains.
If the "export" facility is not going to be used,
this value may be NULL.
</dd>
<dt><h4><pre><code>
void key_register();
void key_unregister();
</code></pre></h4></dt>
<dd>
This system maintains a global table which relates
external strings to
<code style="white-space: normal">extended_type_info</code> records.
This table is used when loading pointers to objects serialized
through a base class pointer. In this case, the archive
contains a string which is looked up in this table to
determine which <code style="white-space: normal">extended_type_info</code>
to use for creating a new object.
<p>
These functions are called by constructors and
destructors of classes which implement
<code style="white-space: normal">extended_type_info</code>
to add and remove entries from this table.
</dd>
<dt><h4><pre><code>
const char *get_key() const;
</code></pre></h4></dt>
@@ -188,58 +188,80 @@ instance. If no key has been associated with the instance, then a NULL is retur
</dd>
<dt><h4><pre><code>
bool operator&lt;(const extended_type_info &rhs) const;
bool operator==(const extended_type_info &rhs) const;
bool operator!=(const extended_type_info &rhs) const;
bool operator<(const extended_type_info &amp; rhs) const;
bool operator==(const extended_type_info &amp; rhs) const;
bool operator!=(const extended_type_info &amp; rhs) const;
</code></pre></h4></dt>
<dd>
These functions are used to compare two <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code> objects.
Among other things, these are used for lookup in the tables.
These functions are used to compare
<a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">
<code style="white-space: normal">
extended_type_info
</code>
</a>
objects. They impose a strict total ordering on all
<code style="white-space: normal">extended_type_info</code> records.
</dd>
<dt><h4><pre><code>
virtual void * construct(unsigned int count = 0, ...) const;
</code></pre></h4></dt>
<dd>
Construct a new instance of the type to which this
<a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">
<code style="white-space: normal">
extended_type_info
</code>
</a>
record corresponds. This function takes a variable list of up to 4 arguments
of any type. These arguments are passed to the type's constructor
at runtime. In order to use the facility,
one must declare a type sequence for the constructor arguments.
Arguments for this function must match in number and type
with those specified when the type was exported.
This function permits one to create instances of
any exported type given only the exported <strong>GUID</strong> assigned
with BOOST_CLASS_EXPORT.
If these types are defined in DLLS or shared libraries loaded at runtime,
these constructors can be called until the module is unloaded.
Such modules are referred to as <b>plugins</b>.
</code>
</dd>
<dt><h4><pre><code>
virtual void destroy(void const * const p) const;
</code></pre></h4></dt>
<dd>
Destroy an instance created by the above constructor.
</dd>
<dt><h4><pre><code>
static const extended_type_info * find(const char *key);
</code></pre></h4></dt>
<dd>
Given a character string key or <strong>GUID</strong>, return the address of the
unique corresponding <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
Given a character string key or <strong>GUID</strong>, return the address of a
corresponding <code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
object.
<dt><h4><pre><code>
static const extended_type_info * find(const extended_type_info * t);
</code></pre></h4></dt>
<dd>
Given a pointer to an
<code style="white-space: normal"><a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>,
return the address of the instance of the same type in the main table.
That is the argument t is used as a search argment to find the main
table entry for a given type. It would be used like this:
<code><pre>
// return the global type entry for our type T
return find(some_extended_type_info_implementation&lt;T&gt;())
</pre></code>
</dl>
<h3><a name="requirements">Requirements</a></h3>
<h3><a name="requirements">Requirements for an Implementation</a></h3>
In order to be used by the serialization library, an implementation of
<code style="white-space: normal">extended_type_info</code>,
(referred to as ETI here), must implement the following:
(referred to as ETI here), must be derived from
<a target="extended_type_info.hpp" href = "../../../boost/serialization/extended_type_info.hpp">
<code style="white-space: normal">
extended_type_info
</code>
</a>
and also implement the following:
<dl>
<dt><h4><code style="white-space: normal"><pre>
template&lt;class ETI&gt;
virtual bool
ETI::less_than(const extended_type_info &rhs) const;
</pre></code></h4></dt>
<dd>
Impose a strict total ordering on all instances of the class ETI.
</dd>
<dt><h4><code style="white-space: normal"><pre>
template&lt;class ETI&gt;
static const extended_type_info *
ETI::get_derived_extended_type_info(const T & t);
const extended_type_info *
ETI::get_derived_extended_type_info(const T &amp; t) const;
</pre></code></h4></dt>
<dd>
Return a pointer to the
@@ -247,45 +269,51 @@ Return a pointer to the
instance that corresponds to
the "true type" of the type T. The "true type" is the lowest type in the
hierarchy of classes. The type T can always be cast to the "true type" with
a static cast. Implemention of this function will vary among type id systems
a static cast. Implementation of this function will vary among type id systems
and sometimes will make presumptions about the type T than can be identified
with a particular <code style="white-space: normal">extended_type_info implementation</code>.
with a particular <code style="white-space: normal">extended_type_info</code> implementation.
</dd>
<dt><h4><code style="white-space: normal"><pre>
template&lt;class ETI&gt;
static extended_type_info *
ETI::get_instance();
virtual bool ETI::is_less_than(const extended_type_info &amp;rhs) const;
</pre></code></h4></dt>
<dd>
Return a pointer to the instance of
<code style="white-space: normal">extended_type_info</code>
which corresponds to type T. Normally these instances are static objects so
this just amounts to returning the address of this static object.
Compare this instance to another one using the same
<code style="white-space: normal">extended_type_info</code> implementation.
</dd>
<dt><h4><code style="white-space: normal"><pre>
static void
template&lt;class ETI&gt;
ETI::export_register(const char * key);
virtual bool ETI::is_equal(const extended_type_info &amp;rhs) const;
</pre></code></h4></dt>
<dd>
The main function is to invoke key_register to add the GUID to the
global table. Depending on the type id system being used, it might
perform other initializaition functions as well.
Compare this instance to another one using the same
<code style="white-space: normal">extended_type_info</code> implementation.
Return <code style="white-space: normal">true</code> if the types referred
to are the same. Otherwise return
<code style="white-space: normal">false</code>
</dd>
</dl>
It must define the following
<a href="../../mpl/doc/refmanual/integral-constant.html">
Itegral Constant</a>
of type
<a href="../../mpl/doc/refmanual/bool.html">bool</a>:
<dl>
<dt><h4><code style="white-space: normal"><pre>
ETI::is_polymorphic
const char ETI::get_key() const;
</pre></code></h4></dt>
<dd>
Retrieve the external key (aka GUID) for this class.
</dd>
<dt><h4><code style="white-space: normal"><pre>
virtual void * construct(unsigned int count, ...) const;
</pre></code></h4></dt>
<dd>
Construct an instance of the corresponding type
with the include argument list.
</dd>
<dt><h4><code style="white-space: normal"><pre>
virtual void * destroy(void const * const ptr ) const;
</pre></code></h4></dt>
<dd>
Destroy an instance of this type. This calls the
proper destructor and recovers allocated memory.
</dd>
</dl>
@@ -301,22 +329,88 @@ by the compiler.
<p>
<code style="white-space: normal"><h4><a target="extended_type_info_no_rtti.hpp" href="../../../boost/serialization/extended_type_info_no_rtti.hpp">
extended_type_info_no_rtti</a></h4></code>
is implemented in a way that doesn't rely on the existence RTTI.
However, it does require that all classes for which type id is to be used implement
a virtual function of the signiture:
is implemented in a way that doesn't rely on the existence RTTI.
Instead, it requires that all polymorphic types be explicitly exported.
In addition, if the export facility is to be used to serialize types
through base class pointers, those types are required to implement
a virtual function with the signature:
<code><pre>
virtual const char * get_key();
</pre></code>
which returns a unique string the most derived object this class.
This function must be virtual in order to implement the functionality required by
<code style="white-space: normal">ETI::get_derived_extended_type_info</code>
as described above. The test program <code style="white-space: normal"><a target="test_no_rtti" href="../test/test_no_rtti.cpp">test_no_rtti</a></code>
as described above.
<h3><a name="example">Example</a></h3>
The test program <code style="white-space: normal"><a target="test_no_rtti" href="../test/test_no_rtti.cpp">test_no_rtti</a></code>
implements this function in terms of the <code style="white-space: normal"><a target="extended_type_info_no_rtti.hpp" href="../../../boost/serialization/extended_type_info_no_rtti.hpp">
extended_type_info</a></code> API above to return the export key associated with the class.
This requires that non-abstract types be exported.
This requires that non-abstract types be exported. It also demonstrates the
inter-operability between two different implementations of
<code style="white-space: normal">extended_type_info</code>.
<h3><a name="type_requirements">Requirements for Each Type</a></h3>
Each type to be managed by the system must be
"registered" individually. This is accomplished by instantiating
templates. For example, if the type T is to use the <code style="white-space: normal">type_info</code> system
one would include the following code:
<code style="white-space: normal"><pre>
namespace boost {
namespace serialization {
template
struct extended_type_info_typeid&lt;T&gt;;
template
struct extended_type_info_typeid&lt;const T&gt;;
} // serialization
} // boost
</pre></code>
For those using the serialization library, this step can be skipped
as it is done automatically. The serialization library includes
the macro:
<code style="white-space: normal"><pre>
BOOST_CLASS_TYPE_INFO(
my_type,
extended_type_info_typeid&lt;my_class&gt;
)
</pre></code>
which is used to specify which <code>extended_type_info</code> system is to
be used for a given type.
<p>
<code>extended_type_info</code> includes a facility for constructing
instances of types without knowing what the exact types are. This is done
with the function
<code>
virtual void * extended_type_info::construct(unsigned int count = 0, ...) const;
</code>
. For example:
<br>
<code><pre>
struct base {
...
};
struct derived : public base {
...
};
...
extended_type_info *eti = extended_type_info::find("my_class")
base * b = eti-&gt;construct(...);
</pre></code>
<br>
The <code>construct</code> takes an argument count and up to
four parameters of any type. The arguments are passed to the
constructor of "my_class".
A complete example of this can be found
<a target="test_dll_plugin.cpp" href="../test/test_dll_plugin.cpp">here</a>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2005.
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2005-2009.
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)
</i></p>
+38 -4
View File
@@ -7,11 +7,45 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - FAQ</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Tips and Tricks</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3>
<a href="../../../index.htm">
<img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">
Serialization</h1>
<h2 align="center">
Tips and Tricks</h2>
</td>
</tr>
</table>
<hr>
This section will be used to list answers to questions raised in the mailing
lists. Most of these are due to subtle aspects of the library which are
overlooked even though they might be described in the documentation. Often,
these issues are very easy to address - but can be excruciatingly difficult to
find. Should you have such an experience, feel free to vent your frustration
in a constructive way by adding in your own item. The best way to do this
is to create a <a href="http://svn.boost.org/trac/boost/browser">"TRAK" item</a>
which includes the text you want to add to this list.
<ul>
<li><h4>
</h4></li>
</ul>
<hr>
<p>
<i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2009. 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) </i></p>
</body>
</html>
+80 -36
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Code Structure</title>
@@ -42,10 +42,10 @@ http://www.boost.org/LICENSE_1_0.txt)
</dl>
</dl>
This library includes a large number of files. The are organized and classified
according to purpose listed in the above index.
This library includes a large number of files. They are organized and classified
according to the purposes listed in the above index.
<p>
<code style="white-space: normal">namespace</code> of a classes and templates is syncronized
<code style="white-space: normal">namespace</code> of classes and templates is synchronized
with the directory in which the file is found. For example, the class declaration
<pre><code>
boost::archive::text_oarchive
@@ -58,7 +58,7 @@ is included with the following declaration
<a name="userincludes">
<h3>Files Included by User Programs</h3>
Using this library entails including headers listed in this section.
It should not be necessary to explictly include any other header files.
It should not be necessary to explicitly include any other header files.
<a name="archiveimplementations">
<h4>Archive Implementations</h4>
@@ -95,7 +95,7 @@ boost/archive/text_oarchive.hpp
<dt><a target="text_wiarchive" href="../../../boost/archive/text_wiarchive.hpp">
boost/archive/text_wiarchive.hpp
</a>
<dd>wide character text input archive used forloading.</dd>
<dd>wide character text input archive used for loading.</dd>
<dt><a target="text_woarchive" href="../../../boost/archive/text_woarchive.hpp">
boost/archive/text_woarchive.hpp
@@ -161,13 +161,14 @@ boost/serialization/export.hpp
</a>
<dd>For serialization of pointers to derived classes via key export.</dd>
<dt><a target="is_abstract" href="../../../boost/serialization/is_abstract.hpp">
boost/serialization/is_abstract.hpp
<dt><a target="assume_abstract" href="../../../boost/serialization/assume_abstract.hpp">
boost/serialization/assume_abstract.hpp
</a>
<dd>For serialization of pointers to abstract base classes. A generic implementation
of this is functional only on the most modern compilers. This one is just
a thin wrapper which permits one to specify "by hand" whether or not a base class
is abstract or not.</dd>
<dd>This is just a thin wrapper which permits one to explicitly specify that a
particular type is an abstract base class. It is necessary to use this
for compilers which don't support the boost type traits implementation of
is_abstact.
</dd>
</dl>
@@ -184,7 +185,7 @@ boost/serialization/version.hpp
<dt><a target="level" href="../../../boost/serialization/level.hpp">
boost/serialization/level.hpp
</a>
<dd>To override the default implementaton level trait for a type.</dd>
<dd>To override the default implementation level trait for a type.</dd>
<dt><a target="tracking" href="../../../boost/serialization/tracking.hpp">
boost/serialization/tracking.hpp
@@ -206,7 +207,7 @@ This group of headers includes templates which implement serialization for Stand
Library or Boost Library templates. Any program which uses these templates can
invoke serialization of objects of these types just by including the corresponding header.
<p>
By convention, these header files are named:
By convention these header files are named:
boost/serialization/xxx.hpp
@@ -256,7 +257,7 @@ for in all archive implementations. The serialization system relies on
certain special types such as <code style="white-space: normal">class_id_type</code> and others to
record information in archives that is required to reconstruct the original
data structure. These are handled exactly as any other serializable type.
That is, the can be handled as simple primitives such as they are in simple
That is, they can be handled as simple primitives such as they are in simple
text files, or with special code as they are in xml archives.
</dd>
@@ -268,7 +269,7 @@ boost/archive/basic_text_iprimitive.hpp
</a>
</dt>
<dd>
Implementation of serialization of primitive types in terms of an character
Implementation of serialization of primitive types in terms of character
or wide character text streams. This is used in the implementation of text and
xml archives. Presumably this would be useful for implementations of other variations
of text archives such as user friendly text or windows ini files.
@@ -282,7 +283,7 @@ boost/archive/basic_binary_iprimitive.hpp
</a>
</dt>
<dd>
Implementation of serialization of primitive types in terms of an character
Implementation of serialization of primitive types in terms of character
or wide character binary streams.
</dd>
@@ -293,16 +294,16 @@ boost/archive/basic_binary_oarchive.hpp
boost/archive/basic_binary_iarchive.hpp
</a>
<dd>
Implementation of serialization of all types in terms of an character
Implementation of serialization of all types in terms of character
or wide character binary streams. This is factored out separately from the
implementation of binary primitives above. This may facilitate the creation of
other types of binary archives in the future. It also preserves analogy and symetry with
other types of binary archives in the future. It also preserves analogy and symmetry with
the rest of the library which aids in understanding.
</dd>
<dt><a target="basic_text_oarchive" href="../../../boost/archive/basic_text_oarchive.hpp">
boost/archive/basic_text_oarchive.hpp
</a>
<dt><a target="basic_text_iarchive" href="../../../boost/archive/basic_text_iarchive.hpp">
<dt><a target="basic_te't_iarchive" href="../../../boost/archive/basic_text_iarchive.hpp">
boost/archive/basic_text_iarchive.hpp
</a>
</dt>
@@ -314,12 +315,12 @@ boost/archive/basic_xml_iarchive.hpp
</a>
</dt>
<dd>
Implementation of serialization of all types in terms of an character
Implementation of serialization of all types in terms of character
or wide character text streams. These classes specify archive type specific
behavior on a type by type basis. For example, <code style="white-space: normal">basic_xml_oarchive.hpp</code>
includes code to guarentee that any object not attached to a name will
includes code to guarantee that any object not attached to a name will
trap during compile time. On the other hand, <code style="white-space: normal">basic_text_oarchive.hpp</code>
contains code to strip out and ingore any names attached to objects.
contains code to strip out and ignore any names attached to objects.
<p>
<dt><a target="common_iarchive" href="../../../boost/archive/detail/common_iarchive.hpp">
boost/archive/detail/common_iarchive.hpp
@@ -328,7 +329,7 @@ boost/archive/detail/common_iarchive.hpp
boost/archive/detail/common_oarchive.hpp
</a>
<dd>
All archive implmentations are derived from these header files. They provide
All archive implementations are derived from these header files. They provide
the interface to the internal implementation details of the library.
</dd>
@@ -336,11 +337,54 @@ the interface to the internal implementation details of the library.
<a name="archiveinternals">
<h4>Archive Internals</h4>
The header files in the directory
<a target="basic_xml_iarchive" href="../../../boost/archive/detail">boost/archive/detail</a>
implement parts of the library itself. The should never need to be changed by users
of the library in order to implement either a class serialization or a new
archive type.
The interface (see <a target="detail" href="archives.html">Archive Concepts</a>)
and implementation are factored out into separate classes to minimize code duplication.
These files are found in the directory
<a target="boost_archive_detail" href="../../../boost/archive/detail">boost/archive/detail</a>.
These are included as necessary by the archive class implementations listed above.
This has the unfortunate side effect of making the implementation less transparent.
Users should never find it necessary to change these files.
<p>
The following discussion is based on the
<a target="class_diagram" href="class_diagram.html">class diagram</a>.
<p>
<dt><a target="interface_iarchive" href="../../../boost/archive/detail/interface_iarchive.hpp">
boost/archive/detail/interface_iarchive.hpp</a>
<dt><a target="interface_iarchive" href="../../../boost/archive/detail/interface_iarchive.hpp">
boost/archive/detail/interface_iarchive.hpp</a>
<dd>
Here are the declarations and definitions for the
<a href="archives.html">archive_concept</a>. This class redirects calls to the
archive interface to a function named <code>save_override</code> in the most derived
archive class.
</dd>
<code>save_override</code> is declared and implemented in each class in
the archive hierarchy.
<pre><code>
template&lt;class T&gt;
void save_override(T &amp; t, BOOST_PFTO int){
// All for otherwise unhandled types are forwarded to the base class.
// This emulates behavior for function overloading.
this-&gt;base::save_override(t, 0);
}
void save_override(const some_type &amp; t, int){
// any special handling for some type
// this will usually entail forwarding some other operation
// in the most derived class.
this-&gt;This()-&gt;...
// or in one of its parents basic_text_oprimitive
this-&gt;This()-&gt;save(static_cast&lt;int&gt;(t));
}
... // other special type handling
</code></pre>
Note the usage of
<a target="detail" href="implementation.html#functiontemplateordering">Partial Function Template Ordering</a>
to permit the correct save implementation to be selected.
</dd>
<a name="codemodules">
<h4>Archive Library Code Modules</h4>
@@ -358,13 +402,13 @@ library code for that part of the code which only depends upon the archive type.
Building of the library generates and compiles code for all archives implemented.
<ul>
<li>Serialization of user and primitive types runs a top speed. This is a noticiable
<li>Serialization of user and primitive types runs at top speed. This is a noticeable
difference with a previous version of the library which did not use templates for archives.
<li>Library implementation code that never changes need only be compiled once
rather than each time a user's program is recompiled. This can save much
development time.
<li>Headers which solely related to implementation need only be included
in the library code modules. This prevents a user program from accidently
in the library code modules. This prevents a user program from accidentally
depending on an implementation feature of the serialization library.
<li>In building the library I came to the conclusions that there can arise
situations regarding static code/data instantiation that could not be
@@ -373,22 +417,22 @@ Building of the library generates and compiles code for all archives implemented
</ul>
An example of this is the usage of the spirit library in the library.
It takes a long time to compile and includes lots of other files. Having this
only in the library is much more convenient that having to include in every
only in the library is much more convenient that having to include it in every
program which uses xml serialization.
<a name="dataflowiterators">
<h4>Dataflow Iterators</h4>
In the course of developing this library, it became convenient to make a set
of composable iterator adaptors for handling archive text. Applications include
escaping and unescaping xml text, implementing to/from base64 conversion among
escaping and unescaping xml text and implementing to/from base64 conversion among
others.
<p>
This is a ripe topic in itself. Its touched upon by the
This is a ripe topic in itself. It's touched upon by the
<a href="../../../libs/iterator/doc/index.html">boost iterator</a> libraries,
<a href="http://www.zib.de/weiser/vtl/index.html">View Template Library</a>, and others.
<p>
The code for these iterators is really independent of this library. But since it
hasn't been and probably won't be reviewed outside of this context. I've left in a directory
hasn't been and probably won't be reviewed outside of this context. I've left it in a directory
local to the serialization library:
<a target="archiveiterators" href="../../../boost/archive/iterators">boost/archive/iterators</a>.
These iterators are described in
+11 -11
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - History</title>
@@ -30,24 +30,24 @@ http://www.boost.org/LICENSE_1_0.txt)
<li>27 Feb 2002
<ul>
<li>divide interface from implementation for class
serialization to permit compiliation on gcc
<li>improved template instantanciation for type templates
serialization to permit compilation on gcc
<li>improved template instantantation for type templates
</ul>
<li>18 Mar 2002 - draft #2 uploaded to boost
<ul>
<li>elminated locale effects on archives
<li>added signature and library version to archive header
<li>improved detection of errors when objects are serializationed
as pointers and subsequently serializationed as objects
<li>improved detection of errors when objects are serialized
as pointers and subsequently serialized as objects
<li>permit non-portable binary archives
<li>implement work around for systems such as MSVC 6.0 that
don'tsupport partial ordering
<li>implement workaround for systems such as MSVC 6.0 that
don't support partial ordering
</ul>
<li>16 May 2002 - draft #3 uploaded to boost
<ul>
<li>Ability to specify serialization of other templates in a
non-intrusive way.
<li>Included and example which uses boost::shared_ptr.
<li>Included an example which uses boost::shared_ptr.
<li>improved documentation
<li>More test cases
<li>More testing and documentation of obscure situtations
@@ -65,7 +65,7 @@ http://www.boost.org/LICENSE_1_0.txt)
<li>minor corrections
<li>Additions to documentation to explicitly address issues of
exception safety.
<li>More test cases/demos to illustrate handlling of the above issues.
<li>More test cases/demos to illustrate handling of the above issues.
<li>Additions to documentation to include rationale for not depending
on type_id
<li>Implementation of serialization of boost::shared_ptr.
@@ -127,8 +127,8 @@ http://www.boost.org/LICENSE_1_0.txt)
</ul>
<li>1 November 2004 - final changes for first boost official release 1.32 .
<ul>
<li>Adjustments to address make package compatible with two-phase lookup.
<li>Many small adjustments to accomdate quirks of various compilers.
<li>Adjustments to address package compatible with two-phase lookup.
<li>Many small adjustments to accommodate quirks of various compilers.
<li>A few bug fixes.
</ul>
</ol>
+60 -208
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Implementation Notes</title>
@@ -26,19 +26,13 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<dl class="page-index">
<dt><a href="#functiontemplateordering">Partial Function Template Ordering</a>
<dt><a href="#charencoding">Character Encoding</a>
<dt><a href="#tempatesyntax">Template Invocation syntax</a>
<dt><a href="#partialtemplatespecialization">Partial Template Specialization</a>
<dt><a href="#othercompilerissues">Specific Compiler/Library Issues</a>
<dl class="page-index">
<dt><a href="#gcc3x">GCC 3.X, 4.x</a>
<dt><a href="#gcc295">GCC 2.95</a>
<dt><a href="#gcc4x">44.X</a>
<dt><a href="#intel80">Intel 8.0</a>
<dt><a href="#vc80">Visual C++ 8.0</a>
<dt><a href="#vc71">Visual C++ 7.1</a>
<dt><a href="#vc70">Visual C++ 7.0</a>
<dt><a href="#vc6">Visual C++ 6.0</a>
<dt><a href="#borland">Borland 5.64 and 5.51</a>
<dt><a href="#comeau">Comeau 4.3.3</a>
<dt><a href="#codewarrior9">Code Warrior 9.x</a>
<dt><a href="#codewarrior">Code Warrior 8.3</a>
@@ -48,86 +42,11 @@ http://www.boost.org/LICENSE_1_0.txt)
</dl>
</dl>
<h3><a name="functiontemplateordering">Partial Function Template Ordering</a></h3>
Not all C++ compilers correctly support partial function template ordering (PFTO).
For these compilers, the following code will fail to compile:
<pre><code>
template&lt;class Archive, class T&gt;
void serialize(
Archive & ar,
T & t,
const unsigned int file_version
){
...
}
template&lt;class Archive, class T&gt;
void serialize(
Archive & ar,
my_template&lt;T&gt & t,
const unsigned int file_version
){
...
}
</pre></code>
The serialization library works around this issue by using a different
default definition of the first template:
<pre><code>
template&lt;class Archive, class T&gt;
void serialize(
Archive & ar,
T & t,
const unsigned long int file_version // Note: change to long
){
...
}
</pre></code>
Now, the second template is not matched with the first one so there
is no PFTO and no compile error. When the serialization library invokes
<pre><code>
serialize(ar, t, 0);
</pre></code>
the function declaration is first matched against templates with
an integer for the third argument. If there is a match, the matching
template is instantiated and later invoked. If there is no match,
an attempt is made to match other templates by converting arguments to other types.
In this case the third argument can be converted to long to match
the first template - which is the default. So in this case, the first
template will be instantiated and later invoked. We have managed to
use function overloading to achieve the same effect as PFTO
were it correctly implemented.
<p>
This depends upon undefined behavior of a compiler already
determined to be non-conforming. In other words, there is no
guarantee that this will work on all compilers. If a compiler does not
correctly support PFTO and this method cannot be used to workaround
it, non-intrusive serialization cannot be supported for that compiler.
As of this writing, such a compiler has not been encountered.
<p>
It turns out that using this "trick" can create problems with
compilers that DO correctly support PFTO. For this reason we
define a macro <code style="white-space: normal">BOOST_PTFO</code> which
is defined to be <code style="white-space: normal">long</code>
for non-conforming compilers and nothing for conforming ones. So
the default definition is really:
The serialization library works around this issue by using a different
default definition of the first template:
<pre><code>
template&lt;class Archive, class T&gt;
void serialize(
Archive & ar,
T & t,
const unsigned BOOST_PFTO int file_version // Note: change to BOOST_PFTO
){
...
}
</pre></code>
<h3><a name="charencoding">Character Encoding</a></h3>
The whole question of character encoding combined with wide characters
is much more complicated than it would seem to be. The current library
defines in 3 formats (text, binary, and XML), wide and narrow characters,
an attempts to be portable between compiler libraries. The results of
and attempts to be portable between compiler libraries. The results of
a rather long consideration of all these factors has been to set
default encoding according to the following rules.
<ul>
@@ -148,7 +67,7 @@ default encoding according to the following rules.
</ul>
This character encoding is implemented by changing the <code style="white-space: normal">locale</code> of the
i/o stream used by an archive when the archive is constructed, the stream
local is changed back to its original value. This action can be overridden
locale is changed back to its original value. This action can be overridden
by specifying <code style="white-space: normal">boost::archive::no_codecvt</code>
when the archive is opened. In this case, the stream <code style="white-space: normal">locale</code> will
not be changed by the serialization library.
@@ -174,74 +93,75 @@ do the following.
<li>Create the archive with the flag <code style="white-space: normal">no_codecvt</code>.
</ul>
Naturally, the input process has to be symmetrical.
<h3><a name="partialtemplatespecialization">Partial Template Specialization</a></h3>
Compilers which fail to support partial template specialization will fail to compile
the following code. To make this compiler, the <code style="white-space: normal">const</code> has to be removed.
<pre><code>
void f(A const* a, text_oarchive& oa)
{
oa << a;
}
</code></pre>
<h3><a name="tempatesyntax">Template Invocation syntax</a></h3>
Some compilers may not recognize the syntax:
<pre><code>
ar.template register_type&lt;T&gt;();
</code></pre>
for "registering" derived pointers of polymorphic classes. The actual
function prototype is:
<pre><code>
template&lt;T&gt;
void register_type(T * t = NULL);
</code></pre>
so that one may write <code style="white-space: normal">ar.register_type(static_cast&lt;T *&gt;(NULL))</code> instead of
the syntax described above.
</ul>
<h3><a name="othercompilerissues">Specific Compiler/Library Issues</a></h3>
<h4><a name="gcc3x">GCC 3.X, 4.x</a></h4>
GCC versions for Cygwin and MinGW fail to support wide character I/O.
So all tests using wide char I/O fail. Note that if wide character I/O support
is added with STLPort, all tests complete successfully.
<h4><a name="gcc295">GCC 2.95</a></h4>
All of the above plus:<br>
<h4><a name="gcc4x">GCC 4.X</a></h4>
<ul>
<li>The serialization library depends on the templeted stream implemention
to function properly. So STLPort must be used to build the library.
<li>Polymorphic archive tests fail.
<li>XML serialization only works with version 1.6x of spirit. In order to build
and use this library with this compiler, one must use version 1.6x rather than the
latest version shipped with boost. See Release Notes.
<li>GCC versions for Cygwin and MinGW fail to support wide character I/O.
So all tests using wide char I/O fail. Note that if wide character I/O support
is added with STLPort, all tests complete successfully.
<li>This compiler generates long warning messages related to the usage of
non virtual destructors in polymorphic classes. These warnings have been
carefully considered and the code that generates these warning has been
unchanged. In this case the warning should should be ignored as in certain
usages of the library, making the destructors virtual could lead to problems.
As an alternative, base class destructors have been made "protected" to
address the concerns that motivate these warning messages. When building
the serialization library and tests with bjam, these warnings are suppressed.
When building one's own applications, these warnings can be suppressed by
adding the following to the compiler command line:
<pre><code>
-Wno-non-virtual-dtor
-Wno-ctor-dtor-privacy
</code></pre>
</ul>
<h4><a name="Intel80">Intel C++ 8.0</a></h4>
<h4><a name="intel80">Intel C++ 8.0</a></h4>
No known issues. All tests compile and run in debug and release modes.
<h4><a name="vc80">Visual C++ 8.0</a></h4>
This compiler emits warnings for calls to functions from the standard
library which are deemed security risks. The serialization depends upon
making some of these calls so programs which use the serialization library
will get warning messages. These messages can be suppressed from the command
line by including the following switch:
<pre><code>
/wd4996
</code></pre>
<h4><a name="vc71">Visual C++ 7.1</a></h4>
Derivation from an archive class defined in a DLL as described in ... will not work.
This is due to the way that VC++ handles templeted code with __decl(dllexport) and
This is due to the way that VC++ handles templated code with __decl(dllexport) and
__decl(dllimport) specifications. Basically, this compiler requires that all the
instantiations have the same specification - even though they have different
template arguments. The example <code style="white-space: normal">
demo_portable_iarchive.cpp</code> would have to reformulated as a library or dll
demo_portable_iarchive.cpp</code> would have to be reformulated as a library or dll
similar to the pre-defined archives in order to function.
<p>
This compiler does not have RTTI or exception handling turned on by default. Although
they are not strictly necessary to use the serialization package, the example and test
program presume that they are enabled. So be sure your command line or IDE settings
enable these features if you want
these switches are enabled if you want to build and run these programs.
programs presume that they are enabled. So be sure your command line or IDE settings
enable these features if you want to build and run these programs.
<p>
This compiler can treat <code style="white-space: normal">wchar_t</code> as either
a short integer or an intrinsic type.
If <code style="white-space: normal">/Zc:wchar_t</code> is specified on the
compile command line, <code style="white-space: normal">wchar_t</code> will be
considered an intrinsic type - otherwise
it will be treated as a synonym for a 16 bit integer. The library can be used
either way - <strong>BUT</strong> - both the library <strong>AND</strong> the application
must be compiled with the same switch settings. Note that <code style="white-space: normal">BJAM</code>
includes this switch by default. So if want to use the libraries that
<code style="white-space: normal">BJAM</code> builds, you should include this switch
when you compile your own applications.
<h5>Using the Visual C++ IDE</h5>
The library includes a VC++ 7.1 "Solution" - <code style="white-space: normal">BoostSerializationLibrary</code>
along with of a set of project files - one for each demo and test. Consider the following if you
decided to use these configurations.
along with a set of project files - one for each demo and test. Consider the following if you
decide to use these configurations.
<ul>
<li>The projects assume that the tests have been built with bjam using the default
locations. This will result in a <code style="white-space: normal">bin</code> subdirectory
within one's main boost directory. Below this there is a whole structure which maintains
object and library files according to the type of build. The easiest way to build this is to
invoke the runtest script which uses bjam. (see below) If the libraries are not in these locations,
invoke the runtest script which uses bjam (see below). If the libraries are not in these locations,
the projects will have to be modified accordingly.
<li>There are project configurations for all the combinations of build variants that boost
supports. That is for release, debug, static, static multi-threading, etc..
@@ -275,74 +195,6 @@ decided to use these configurations.
in sync with those included here.
</ul>
<h4><a name="vc70">Visual C++ 7.0</a></h4>
<ul>
<li>The "pimpl" demo fails to link. Cause and workaround for this is unknown
<li>XML serialization only works with version 1.6x of spirit. In order to build and use this
library with this compiler, one must use version 1.6x rather than the latest version
shipped with boost. See <a href="release.html#Installation">Release Notes</a>.
<li>This compiler does not support partial template specialization.
The implementation of the new <code>shared_ptr</code> serialization depends upon
compiler support for partial template specialization. This compiler doesn't implement this
feature. In order to serialize <code style="white-space: normal">shared_ptr&lt;A&gt;</code>,
invoke the macro <code style="white-space: normal">BOOST_SERIALIZATION_SHARED_PTR(A)</code>
in the header code.
</ul>
<h4><a name="vc6">Visual C++ 6.0</a></h4>
all the above issues for Visual C++ 7.0 plus:
<ul>
<li>Out of line template definitions are not recognized and fail with a confusing
error message. To function save/load/serialize member function templates must be defined
within the class definition. This feature is essential to <code style="white-space: normal">demo_pimpl</code>. Hence,
this program will fail to compile. In this case the problem can't be worked around and
still demonstrate this facility.
<li>This compiler does not support <code style="white-space: normal">wchar_t</code> as a separate type. It defines
<code style="white-space: normal">wchar_t</code> as an alias for <code style="white-space: normal">short int</code>. In general things will still
function. However certain customization, such as overloading archive operators for
saving/loading wide character arrays would produce surprises in this environment.
<li>Under certain circumstances, a program will fail to link with the message:
LIN1179 - "invalid or corrupt file: duplicate comdat". According
to <a href="http://groups.google.com/groups?th=8a05c82c4ffee280">
http://groups.google.com/groups?th=8a05c82c4ffee280
</a> (look for P78)
A LNK1179 error occurs when:
<ul>
<li>The template class takes at least two arguments.
<li>The template is used at least two times with identical first
and different second arguments.
<li>The static member variable is of an object type with at least one
base class. (In another scenario it also occurred using a member
without a base class.)
</ul>
Working around this in the implementation of the library for this compiler
entailed a ridiculous amount of effort. Even so, the effort wasn't entirely succesful.
With this compiler, this message will still appear under the following conditions:
<ul>
<li>When serializing a class with multiple base classes. This problem causes two
failure in the test suite. I have been unable to divise a way to work around this.
<li>Using more than one kind of archive in the same code module. This should be easy
to work around in practice.
</ul>
<li>Code modules exceeding some undetermined size that use the library will fail with
<i>fatal error C1204: compiler limit : internal structure overflow</i>. This can be addressed
by dividing the module into smaller ones.
<li>The library cannot be built as a DLL with this compiler.
</ul>
<h4><a name="borland">Borland 5.64 and 5.51</a></h4>
<ul>
<li><code style="white-space: normal">enum</code> data members cannot be serialized.
Conversion to/from integers will work around the problem.
<li>If class serialize functions are not accessable either by making them public or by
including <code style="white-space: normal">friend</code> declarations as described in
<a href="serialization.html#member">Class Serialization - Member Function</a>, the
will compile but fail at runtime.
<li>Tests using custom extended type which doesn't use rtti fails. (5.64 only !).
<li>Tests built in release mode fail. This seems to be an issue with the boost test system
with this compiler.
<li>XML serialization only works with version 1.6x of spirit. In order to build
and use this library with this compiler, one must use version 1.6x rather than the
latest version shipped with boost. See Release Notes.
</ul>
<h4><a name="comeau">Comeau 4.3.3</a></h4>
<ul>
<li>This compiler fails to make a DLL with export under windows.
@@ -353,7 +205,7 @@ all the above issues for Visual C++ 7.0 plus:
<h4><a name="codewarrior9">Code Warrior 9.x</a></h4>
<ul>
<li>Some tests and demos demos fail - still under investigation
<li>Some tests and demos fail - still under investigation
</ul>
<h4><a name="codewarrior">Code Warrior 8.3</a></h4>
@@ -373,10 +225,10 @@ Several compilers, including Visual C++ 6.0, use an older dinkumware library.
These platforms have several issues:
<ul>
<li>The dinkumware library shipped with this compiler does not change the locale facet
of an i/o stream unless the <code style="white-space: normal">imbue</code> function is called before the the
of an i/o stream unless the <code style="white-space: normal">imbue</code> function is called before the
stream is opened. In order to use this library with this environment to generate UTF-8
files, one cannot depend on the "automatic" setting of local that archives implement. The
stream local must be set explicitly on the stream before an archive is opened on it. The
files, one cannot depend on the "automatic" setting of locale that archives implement. The
stream locale must be set explicitly on the stream before an archive is opened on it. The
archive should be opened with the <code style="white-space: normal">no_codecvt</code> flag. Note this problem will
occur on all compilers shipped with this library.
<li>Other issues have been worked around in the file.
@@ -385,17 +237,17 @@ These platforms have several issues:
<h4><a name="stlport">STLPort 4.5.3</a></h4>
<ul>
<li>when built to use dynamic linking versions of C++ runtime code (<runtime-link>dynamic)
<li>when built to use the dynamic linking versions of the C++ runtime code (<runtime-link>dynamic)
all tests fail to link. This is due to a missing symbol in the stlport library related
to custom codecvt facets.
<li>the test_set fails to run correctly. It seems the hashed set interator doesn't
<li>the test_set fails to run correctly. It seems the hashed set iterator doesn't
implement the ++ operator correctly. This causes the test to fail by consuming all available
memory. Given this, this test is commented out.
</ul>
<hr>
<p>Revised 1 November, 2004
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2015.
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)
</i></p>
+1 -1
View File
@@ -7,7 +7,7 @@ Revised 1 November, 2004
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)
-->
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<title>Serialization</title>
</head>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 839 B

After

Width:  |  Height:  |  Size: 849 B

+91
View File
@@ -0,0 +1,91 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Proposed Case Studies</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Proposed Case Studies</h2>
</td>
</tr>
</table>
<hr>
<dl class="index">
<dt><a href="#functionobject">Serializing a Function Object</a></dt>
<dt><a href="#archiveadaptor">Archive Adaptors</a></dt>
<dt><a href="#archivehelper">Archive Helpers</a></dt>
</dl>
These are not part of the library itself, but rather
techniques on how to use the library to address specific situations.
<h2><a name="functionobject"></a>Serializing a Function Object</h2>
An example on how to serialize a function object. I believe this
could be done by serializing a pointer to the object in question. Since
the Serialization library resurrects a pointer of the correct type
this should be easily implementable.
<p>
If a group of function objects were all derived from the
same polymorphic base class - perhaps via multiple inheritance,
then the function object effectively becomes a "variable" which
encapsulates code.
<p>
This case study would show how to do this.
<h2><a name="archiveadaptor"></a>Archive Adaptors</h2>
Often users want to add their own special functionality to an
existing archive. Examples of this are performance enhancements
for specific types, adjustment of output syntax for xml archives,
and logging/debug output as archives are written and/or read.
If this functionality is implemented as an "adaptor" template
which takes the base class as a template argument, such functionality could be
appended to any archive for which that functionality makes sense.
For example, an adaptor for generating an xml schema could be
appended to both wide and narrow character versions of xml archives.
<p>
This case study would show how to make a useful archive adaptor.
<h2><a name="archivehelper"></a>Archive Helpers</h2>
Some types are not serializable as they stand. That is - they
do not fulfill the requirements of the "Serializable Concept".
The iconic example of this is boost::shared_ptr. Sometimes
these types could be made serializable by adding code inside
the library. Of course, doing that would create a lifetime
of unpaid employment for the library author. Rather than
adding a bunch of special code to the library itself, this
code can packaged as a "helper" or "mix-in" class. Then
a new archive is derived from both the "base" archive class
AND the "helper" class. This is how boost::shared_ptr
has been implemented.
<p>
It would also be possible to make a "generic runtime helper"
which would effectively extend the API of the library. Previously
the library included such a helper class. It was removed
in favor of the current implementation. But this functionality
should be added back in with another adaptor which would
become part of the library.
<hr>
<p>Revised 1 November, 2008
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2008.
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)
</i></p>
</body>
</html>
+3 -6
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Overview</title>
@@ -28,15 +28,12 @@ http://www.boost.org/LICENSE_1_0.txt)
<dl class="index">
<dt><a href="#Requirements">Requirements</a></dt>
<dt><a href="#otherimplementations">Other Implementations</a></dt>
<!--
<dt><a href="#footnotes">Footnotes</a></dt>
-->
</dl>
<p>Here, we use the term <strong>"serialization"</strong> to mean
the reversible deconstruction of an arbitrary set of C++ data structures
to a sequence of bytes. Such a system can be used to reconstitute
an equivalent structure in another program context. Depending on
this context, this might used implement object persistence, remote
the context, this might used implement object persistence, remote
parameter passing or other facility. In this system we use the term
<strong>"archive"</strong> to refer to a specific rendering of this
stream of bytes. This could be a file of binary data, text data,
@@ -130,7 +127,7 @@ XML, or some other created by the user of this library.
This library has similar goals to this one. Some aspects of the
implemenation are also similar. As of this writing, it would seem that:
<ul>
<li>Portability(1) is guarenteed only for recent versions of GCC.
<li>Portability(1) is guaranteed only for recent versions of GCC.
<li>Versioning(3) of class definitions is not explicitly supported by
the library.
<li>it doesn't seem to automatically account for shared pointers(5).
+30
View File
@@ -0,0 +1,30 @@
<html>
<head>
<title>Boost Library Status Automatic Test</title>
</head>
<body bgcolor="#ffffff" text="#000000">
<table border="0">
<tr>
<td><img border="0" src="../../../boost.png" width="277" height="86"></td>
<td>
<h1>Library Status: serialization</h1>
<b>Run Date:</b> 02:42:48 UTC, Tuesday 10 June 2008
</td>
</table>
<br>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<td rowspan="2">Test Name</td>
<td align="center" >gcc-3.4.4</td>
</tr><tr>
<td align="center" >profile</td>
</tr><tr><td>peformance_array_binary_archive</a></td><td align="right">Pass <a href="profile1.txt"><i>Profile</i></a></td></tr>
<tr><td>peformance_array_text_archive</a></td><td align="right">Pass <a href="profile1.txt"><i>Profile</i></a></td></tr>
<tr><td>peformance_array_text_warchive</a></td><td align="right"><i>Missing</i></td></tr>
<tr><td>peformance_array_xml_archive</a></td><td align="right">Pass <a href="profile1.txt"><i>Profile</i></a></td></tr>
<tr><td>peformance_array_xml_warchive</a></td><td align="right"><i>Missing</i></td></tr>
<tr><td>performance_iterators</a></td><td align="right">Pass <a href="profile2.txt"><i>Profile</i></a></td></tr>
<tr><td>performance_iterators_base64</a></td><td align="right">Pass <a href="profile3.txt"><i>Profile</i></a></td></tr>
</table>
</body>
</html>
+18 -15
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - PIMPL</title>
@@ -31,7 +31,7 @@ the "Handle Body Idiom". Included in this library is a program called
<a href="../example/demo_pimpl.cpp" target="demo_impl_cpp">demo_pimpl.cpp</a>
which illustrates how this is used. The file
<a href="../example/demo_pimpl_A.cpp" target="demo_impl__Acpp">demo_pimpl_A.hpp</a>
contains the declaration of the a class that hides its implementation
contains the declaration of the A class that hides its implementation
by including a pointer to struct B that is only defined as a pointer.
<pre><code>
// class whose declaration is hidden by a pointer
@@ -41,12 +41,15 @@ struct A {
// class a contains a pointer to a "hidden" declaration
B *pimpl;
template&lt;class Archive&gt;
void serialize(Archive & ar, const unsigned int file_version);
void serialize(Archive &amp; ar, const unsigned int file_version);
A();
};
</code></pre>
Serialization of A requires access to the definition of B in order so it
is defined in the separately compiled module:
Serialization of A requires access to the definition of B. But that doesn't mean
that it requires the this access from the header file. Since B is a pointer,
a declaration of class B is sufficient. The implemenation of the serialization
of A includes the definition of class B defined in the separately compiled module:
<a href="../example/demo_pimpl_A.cpp" target="demo_impl_A_cpp">demo_pimpl_A.cpp</a>
by:
<pre><code>
@@ -56,8 +59,8 @@ by:
struct B {
int b;
template&lt;class Archive&gt;
void serialize(Archive & ar, const unsigned int file_version){
ar & b;
void serialize(Archive &amp; ar, const unsigned int file_version){
ar &amp; b;
}
};
@@ -71,8 +74,8 @@ A::~A(){
// now we can define the serialization for class A
template&lt;class Archive&gt;
void A::serialize(Archive & ar, const unsigned int file_version){
ar & pimpl;
void A::serialize(Archive &amp; ar, const unsigned int file_version){
ar &amp; pimpl;
}
</code></pre>
As described in <a href="bibliography.html#10">[10]</a> this brings the
@@ -85,12 +88,12 @@ following advantages:
So, we compile the modules and everything is fine. However when we
link, we get an error. Two symbols are undefined:
<pre><code>
void A::serialize(boost::archive::text_oarchive & ar, const unsigned int file_version);
void A::serialize(boost::archive::text_iarchive & ar, const unsigned int file_version);
void A::serialize(boost::archive::text_oarchive &amp; ar, const unsigned int file_version);
void A::serialize(boost::archive::text_iarchive &amp; ar, const unsigned int file_version);
</code></pre>
The problem is that when compiling the above code,
there is no instantiation of the <code style="white-space: normal">serialize</code> template.
There can't be as its not "known" what types of archives
There can't be as it's not "known" what types of archives
the serialization is going to be used with. So these functions are "missing"
when an attempt to link is made. The solution is to explicitly instantiate
serialization code for those archives which are going to be used. In this
@@ -100,11 +103,11 @@ example, including the the following code in any *.cpp file does just that:
#include &lt;boost/archive/text_oarchive.hpp&gt;
template void A::serialize&lt;boost::archive::text_iarchive&gt;(
boost::archive::text_iarchive & ar,
boost::archive::text_iarchive &amp; ar,
const unsigned int file_version
);
template void A::serialize&lt;boost::archive::text_oarchive&gt;(
boost::archive::text_oarchive & ar,
boost::archive::text_oarchive &amp; ar,
const unsigned int file_version
);
</code></pre>
@@ -112,7 +115,7 @@ The program should now link as well as compile.
<p>
The downside of this is that one has to know which archives are going
to be used with hidden serializations. This is an effect of using template
driven code. One can invoke explicity instantiation for all known templates and
driven code. One can invoke explicitly instantiation for all known templates and
presume that the linker will exclude unreferenced code. This should
work but is platform dependent.
<hr>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 844 B

After

Width:  |  Height:  |  Size: 855 B

+170
View File
@@ -0,0 +1,170 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Private Base Classes</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Private Base Classes</h2>
</td>
</tr>
</table>
<hr>
In many cases, serialization of private or protected base classes present no special problems.
This is true for both simple classes and types as well as pointers to those
classes and types. That is, the following program compiles and runs exactly as one would expect.
<pre><code>
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// test_private_base.cpp
// (C) Copyright 2009 Eric Moyer - 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)
#include &lt;fstream&gt;
#include &lt;boost/config.hpp&gt;
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::remove;
}
#endif
#include &lt;boost/serialization/access.hpp&gt;
#include &lt;boost/serialization/base_object.hpp&gt;
#include &lt;boost/serialization/export.hpp&gt;
class Base {
friend class boost::serialization::access;
int m_i;
template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version){
ar &amp; BOOST_SERIALIZATION_NVP(m_i);
}
protected:
bool equals(const Base &amp;rhs) const {
return m_i == rhs.m_i;
}
Base(int i = 0) :
m_i(i)
{}
};
class Derived : private Base {
friend class boost::serialization::access;
private:
Base &amp; base_cast(){
return static_cast&lt;Base &amp;&gt;(*this);
}
template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version){
ar &amp; BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
}
public:
bool operator==(const Derived &amp;rhs) const {
return Base::equals(static_cast&lt;const Base &amp;&gt;(rhs));
}
Derived(int i = 0) :
Base(i)
{}
};
int
main( int /* argc */, char* /* argv */[] )
{
const char * testfile = boost::archive::tmpnam(NULL);
// serialize Derived and Base
Derived a(1), a1(2);
{
test_ostream os(testfile);
test_oarchive oa(os);
oa &lt;&lt; boost::serialization::make_nvp("a", a);
}
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia &gt;&gt; boost::serialization::make_nvp("a", a1);
}
std::remove(testfile);
if(a != a1)
return 1;
// serialize Derived and Base
Derived *ta = &amp;a;
Derived *ta1 = NULL;
{
test_ostream os(testfile);
test_oarchive oa(os);
oa &lt;&lt; boost::serialization::make_nvp("ta", ta);
}
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia &gt;&gt; boost::serialization::make_nvp("ta", ta1);
}
std::remove(testfile);
if(*ta != *ta1)
return 1;
return 0;
}
</code></pre>
Difficulties start to occur when the base class is made polymorphic by the designation
of one or more functions as "virtual". If a class is polymorphic, the library
presumes that one will want the ability to serialize a derived class through
a pointer to the base class. Included in the macro
<code>
BOOST_SERIALIZATION_BASE_OBJECT_NVP
</code>
is code which links derived and base class definitions in tables used to serialize
derived classes through pointers to a polymorphic base class. This code requires
the ability to invoke
<code>
static_cast&lt;Base &amp;&gt;(Derived &amp;)
</code>
which C++ will only permit from within the derived class if the base class is
private or protected. The program will fail to compile with an error message
indicating invalid cast.
<p>
In order for this
code compiler the following alteration must be made:
<pre><code>
template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version){
//ar &amp; BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar &amp; boost::serialization::make_nvp(
"Base",
static_cast&lt;Base &amp;&gt;(*this)
);
}
</code></pre>
With this change the program will now compile.
<p>
If we made one of the functions of <code>Base</code> <code>virtual</code>
in order to use the "export" functionality of the serialization library and permit serialization through
a pointer the the base class, we'll be disappointed. Without the ability to
cast to the base class, we can't use the functionality.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2015.
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)
</i></p>
</body>
</html>
+149
View File
@@ -0,0 +1,149 @@
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 200 0.00 0.00 void accumulate<unsigned long>(unsigned int&, unsigned long const&)
0.00 0.00 0.00 150 0.00 0.00 _pei386_runtime_relocator
0.00 0.00 0.00 1 0.00 0.00 std::ostream::operator<<(void const*)
0.00 0.00 0.00 1 0.00 0.00 __divdi3
% the percentage of the total running time of the
time program used by this function.
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
calls the number of times this function was invoked, if
this function is profiled, else blank.
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
Call graph (explanation follows)
granularity: each sample hit covers 4 byte(s) no time propagated
index % time self children called name
0.00 0.00 200/200 setvbuf [1286]
[4] 0.0 0.00 0.00 200 void accumulate<unsigned long>(unsigned int&, unsigned long const&) [4]
-----------------------------------------------
0.00 0.00 150/150 _cygwin_crt0_common@8 [1230]
[5] 0.0 0.00 0.00 150 _pei386_runtime_relocator [5]
-----------------------------------------------
0.00 0.00 1/1 _lseek64 [1234]
[6] 0.0 0.00 0.00 1 std::ostream::operator<<(void const*) [6]
-----------------------------------------------
0.00 0.00 1/1 __tcf_1 [1221]
[7] 0.0 0.00 0.00 1 __divdi3 [7]
-----------------------------------------------
2 main [1263]
[1263] 0.0 0.00 0.00 0+2 main [1263]
2 main [1263]
-----------------------------------------------
This table describes the call tree of the program, and was sorted by
the total amount of time spent in each function and its children.
Each entry in this table consists of several lines. The line with the
index number at the left hand margin lists the current function.
The lines above it list the functions that called this function,
and the lines below it list the functions this one called.
This line lists:
index A unique number given to each element of the table.
Index numbers are sorted numerically.
The index number is printed next to every function name so
it is easier to look up where the function in the table.
% time This is the percentage of the `total' time that was spent
in this function and its children. Note that due to
different viewpoints, functions excluded by options, etc,
these numbers will NOT add up to 100%.
self This is the total amount of time spent in this function.
children This is the total amount of time propagated into this
function by its children.
called This is the number of times the function was called.
If the function called itself recursively, the number
only includes non-recursive calls, and is followed by
a `+' and the number of recursive calls.
name The name of the current function. The index number is
printed after it. If the function is a member of a
cycle, the cycle number is printed between the
function's name and the index number.
For the function's parents, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the function into this parent.
children This is the amount of time that was propagated from
the function's children into this parent.
called This is the number of times this parent called the
function `/' the total number of times the function
was called. Recursive calls to the function are not
included in the number after the `/'.
name This is the name of the parent. The parent's index
number is printed after it. If the parent is a
member of a cycle, the cycle number is printed between
the name and the index number.
If the parents of the function cannot be determined, the word
`<spontaneous>' is printed in the `name' field, and all the other
fields are blank.
For the function's children, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the child into the function.
children This is the amount of time that was propagated from the
child's children to the function.
called This is the number of times the function called
this child `/' the total number of times the child
was called. Recursive calls by the child are not
listed in the number after the `/'.
name This is the name of the child. The child's index
number is printed after it. If the child is a
member of a cycle, the cycle number is printed
between the name and the index number.
If there are any cycles (circles) in the call graph, there is an
entry for the cycle-as-a-whole. This entry shows who called the
cycle (as parents) and the members of the cycle (as children.)
The `+' recursive calls entry shows the number of function calls that
were internal to the cycle, and the calls entry for each member shows,
for that member, how many times it was called from other members of
the cycle.
Index by function name
[4] void accumulate<unsigned long>(unsigned int&, unsigned long const&) [7] __divdi3
[6] std::ostream::operator<<(void const*) [5] _pei386_runtime_relocator
+203
View File
@@ -0,0 +1,203 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
100.00 0.01 0.01 __gnu_cxx::__atomic_add(int volatile*, int)
0.00 0.01 0.00 51 0.00 0.00 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
0.00 0.01 0.00 36 0.00 0.00 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill()
0.00 0.01 0.00 30 0.00 0.00 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)
0.00 0.01 0.00 11 0.00 0.00 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&)
0.00 0.01 0.00 9 0.00 0.00 void test_transform_width<6, 8>(unsigned int)
0.00 0.01 0.00 9 0.00 0.00 boost::archive::iterators::xml_unescape<char const*>::drain()
0.00 0.01 0.00 5 0.00 0.00 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*)
0.00 0.01 0.00 2 0.00 0.00 __static_initialization_and_destruction_0(int, int)
0.00 0.01 0.00 1 0.00 0.00 void test_xml_escape<char const>(char const*, char const*, unsigned int)
0.00 0.01 0.00 1 0.00 0.00 void test_xml_unescape<char const>(char const*, char const*, unsigned int)
0.00 0.01 0.00 1 0.00 0.00 void test_stream_iterators<char>(char const*, unsigned int)
0.00 0.01 0.00 1 0.00 0.00 test_main(int, char**)
0.00 0.01 0.00 1 0.00 0.00 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)
0.00 0.01 0.00 1 0.00 0.00 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)
% the percentage of the total running time of the
time program used by this function.
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
calls the number of times this function was invoked, if
this function is profiled, else blank.
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
Call graph (explanation follows)
granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.01 0.00 __gnu_cxx::__atomic_add(int volatile*, int) [1]
-----------------------------------------------
0.00 0.00 51/51 void test_transform_width<6, 8>(unsigned int) [9]
[5] 0.0 0.00 0.00 51 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]
-----------------------------------------------
0.00 0.00 36/36 void test_transform_width<6, 8>(unsigned int) [9]
[6] 0.0 0.00 0.00 36 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]
-----------------------------------------------
0.00 0.00 30/30 void test_transform_width<6, 8>(unsigned int) [9]
[7] 0.0 0.00 0.00 30 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]
-----------------------------------------------
0.00 0.00 11/11 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
[8] 0.0 0.00 0.00 11 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]
-----------------------------------------------
0.00 0.00 9/9 test_main(int, char**) [16]
[9] 0.0 0.00 0.00 9 void test_transform_width<6, 8>(unsigned int) [9]
0.00 0.00 51/51 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [5]
0.00 0.00 36/36 boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [6]
0.00 0.00 30/30 std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&) [7]
-----------------------------------------------
0.00 0.00 9/9 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
[10] 0.0 0.00 0.00 9 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
0.00 0.00 5/5 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]
-----------------------------------------------
0.00 0.00 5/5 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
[11] 0.0 0.00 0.00 5 boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [11]
-----------------------------------------------
0.00 0.00 1/2 global constructors keyed to main [38]
0.00 0.00 1/2 global destructors keyed to main [35]
[12] 0.0 0.00 0.00 2 __static_initialization_and_destruction_0(int, int) [12]
-----------------------------------------------
0.00 0.00 1/1 test_main(int, char**) [16]
[13] 0.0 0.00 0.00 1 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
0.00 0.00 11/11 boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [8]
-----------------------------------------------
0.00 0.00 1/1 test_main(int, char**) [16]
[14] 0.0 0.00 0.00 1 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
0.00 0.00 9/9 boost::archive::iterators::xml_unescape<char const*>::drain() [10]
-----------------------------------------------
0.00 0.00 1/1 test_main(int, char**) [16]
[15] 0.0 0.00 0.00 1 void test_stream_iterators<char>(char const*, unsigned int) [15]
0.00 0.00 1/1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
-----------------------------------------------
0.00 0.00 1/1 main [1211]
[16] 0.0 0.00 0.00 1 test_main(int, char**) [16]
0.00 0.00 9/9 void test_transform_width<6, 8>(unsigned int) [9]
0.00 0.00 1/1 void test_xml_escape<char const>(char const*, char const*, unsigned int) [13]
0.00 0.00 1/1 void test_xml_unescape<char const>(char const*, char const*, unsigned int) [14]
0.00 0.00 1/1 void test_stream_iterators<char>(char const*, unsigned int) [15]
-----------------------------------------------
0.00 0.00 1/1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
[17] 0.0 0.00 0.00 1 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]
-----------------------------------------------
0.00 0.00 1/1 void test_stream_iterators<char>(char const*, unsigned int) [15]
[18] 0.0 0.00 0.00 1 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&) [18]
0.00 0.00 1/1 char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag) [17]
-----------------------------------------------
This table describes the call tree of the program, and was sorted by
the total amount of time spent in each function and its children.
Each entry in this table consists of several lines. The line with the
index number at the left hand margin lists the current function.
The lines above it list the functions that called this function,
and the lines below it list the functions this one called.
This line lists:
index A unique number given to each element of the table.
Index numbers are sorted numerically.
The index number is printed next to every function name so
it is easier to look up where the function in the table.
% time This is the percentage of the `total' time that was spent
in this function and its children. Note that due to
different viewpoints, functions excluded by options, etc,
these numbers will NOT add up to 100%.
self This is the total amount of time spent in this function.
children This is the total amount of time propagated into this
function by its children.
called This is the number of times the function was called.
If the function called itself recursively, the number
only includes non-recursive calls, and is followed by
a `+' and the number of recursive calls.
name The name of the current function. The index number is
printed after it. If the function is a member of a
cycle, the cycle number is printed between the
function's name and the index number.
For the function's parents, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the function into this parent.
children This is the amount of time that was propagated from
the function's children into this parent.
called This is the number of times this parent called the
function `/' the total number of times the function
was called. Recursive calls to the function are not
included in the number after the `/'.
name This is the name of the parent. The parent's index
number is printed after it. If the parent is a
member of a cycle, the cycle number is printed between
the name and the index number.
If the parents of the function cannot be determined, the word
`<spontaneous>' is printed in the `name' field, and all the other
fields are blank.
For the function's children, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the child into the function.
children This is the amount of time that was propagated from the
child's children to the function.
called This is the number of times the function called
this child `/' the total number of times the child
was called. Recursive calls by the child are not
listed in the number after the `/'.
name This is the name of the child. The child's index
number is printed after it. If the child is a
member of a cycle, the cycle number is printed
between the name and the index number.
If there are any cycles (circles) in the call graph, there is an
entry for the cycle-as-a-whole. This entry shows who called the
cycle (as parents) and the members of the cycle (as children.)
The `+' recursive calls entry shows the number of function calls that
were internal to the cycle, and the calls entry for each member shows,
for that member, how many times it was called from other members of
the cycle.
Index by function name
[13] void test_xml_escape<char const>(char const*, char const*, unsigned int) [16] test_main(int, char**) [5] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
[14] void test_xml_unescape<char const>(char const*, char const*, unsigned int) [8] boost::archive::iterators::xml_escape<char const*>::fill(char const*&, char const*&) [1] __gnu_cxx::__atomic_add(int volatile*, int)
[9] void test_transform_width<6, 8>(unsigned int) [11] boost::archive::iterators::xml_unescape<char const*>::drain_residue(char const*) [17] char* std::string::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)
[15] void test_stream_iterators<char>(char const*, unsigned int) [10] boost::archive::iterators::xml_unescape<char const*>::drain() [18] std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*>(char*, char*, std::allocator<char> const&)
[12] __static_initialization_and_destruction_0(int, int) (performance_iterators.cpp) [6] boost::archive::iterators::transform_width<__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, 8, 6, char>::fill() [7] std::vector<char, std::allocator<char> >::_M_insert_aux(__gnu_cxx::__normal_iterator<char*, std::vector<char, std::allocator<char> > >, char const&)
+153
View File
@@ -0,0 +1,153 @@
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 200 0.00 0.00 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
0.00 0.00 0.00 150 0.00 0.00 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill()
0.00 0.00 0.00 2 0.00 0.00 __static_initialization_and_destruction_0(int, int)
0.00 0.00 0.00 1 0.00 0.00 void test_base64<char>()
0.00 0.00 0.00 1 0.00 0.00 std::_List_base<char, std::allocator<char> >::_M_clear()
% the percentage of the total running time of the
time program used by this function.
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
calls the number of times this function was invoked, if
this function is profiled, else blank.
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
Call graph (explanation follows)
granularity: each sample hit covers 4 byte(s) no time propagated
index % time self children called name
0.00 0.00 200/200 void test_base64<char>() [7]
[4] 0.0 0.00 0.00 200 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]
-----------------------------------------------
0.00 0.00 150/150 void test_base64<char>() [7]
[5] 0.0 0.00 0.00 150 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]
-----------------------------------------------
0.00 0.00 1/2 global constructors keyed to main [27]
0.00 0.00 1/2 global destructors keyed to main [24]
[6] 0.0 0.00 0.00 2 __static_initialization_and_destruction_0(int, int) [6]
-----------------------------------------------
0.00 0.00 1/1 main [1156]
[7] 0.0 0.00 0.00 1 void test_base64<char>() [7]
0.00 0.00 200/200 boost::archive::iterators::transform_width<char*, 6, 8, char>::fill() [4]
0.00 0.00 150/150 boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [5]
0.00 0.00 1/1 std::_List_base<char, std::allocator<char> >::_M_clear() [8]
-----------------------------------------------
0.00 0.00 1/1 void test_base64<char>() [7]
[8] 0.0 0.00 0.00 1 std::_List_base<char, std::allocator<char> >::_M_clear() [8]
-----------------------------------------------
This table describes the call tree of the program, and was sorted by
the total amount of time spent in each function and its children.
Each entry in this table consists of several lines. The line with the
index number at the left hand margin lists the current function.
The lines above it list the functions that called this function,
and the lines below it list the functions this one called.
This line lists:
index A unique number given to each element of the table.
Index numbers are sorted numerically.
The index number is printed next to every function name so
it is easier to look up where the function in the table.
% time This is the percentage of the `total' time that was spent
in this function and its children. Note that due to
different viewpoints, functions excluded by options, etc,
these numbers will NOT add up to 100%.
self This is the total amount of time spent in this function.
children This is the total amount of time propagated into this
function by its children.
called This is the number of times the function was called.
If the function called itself recursively, the number
only includes non-recursive calls, and is followed by
a `+' and the number of recursive calls.
name The name of the current function. The index number is
printed after it. If the function is a member of a
cycle, the cycle number is printed between the
function's name and the index number.
For the function's parents, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the function into this parent.
children This is the amount of time that was propagated from
the function's children into this parent.
called This is the number of times this parent called the
function `/' the total number of times the function
was called. Recursive calls to the function are not
included in the number after the `/'.
name This is the name of the parent. The parent's index
number is printed after it. If the parent is a
member of a cycle, the cycle number is printed between
the name and the index number.
If the parents of the function cannot be determined, the word
`<spontaneous>' is printed in the `name' field, and all the other
fields are blank.
For the function's children, the fields have the following meanings:
self This is the amount of time that was propagated directly
from the child into the function.
children This is the amount of time that was propagated from the
child's children to the function.
called This is the number of times the function called
this child `/' the total number of times the child
was called. Recursive calls by the child are not
listed in the number after the `/'.
name This is the name of the child. The child's index
number is printed after it. If the child is a
member of a cycle, the cycle number is printed
between the name and the index number.
If there are any cycles (circles) in the call graph, there is an
entry for the cycle-as-a-whole. This entry shows who called the
cycle (as parents) and the members of the cycle (as children.)
The `+' recursive calls entry shows the number of function calls that
were internal to the cycle, and the calls entry for each member shows,
for that member, how many times it was called from other members of
the cycle.
Index by function name
[7] void test_base64<char>() [5] boost::archive::iterators::transform_width<boost::archive::iterators::binary_from_base64<boost::archive::iterators::remove_whitespace<std::_List_iterator<char> >, char>, 8, 6, char>::fill() [8] std::_List_base<char, std::allocator<char> >::_M_clear()
[6] __static_initialization_and_destruction_0(int, int) (performance_iterators_base64.cpp) [4] boost::archive::iterators::transform_width<char*, 6, 8, char>::fill()
+3 -224
View File
@@ -7,10 +7,10 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Seriealization - Rationale</title>
<title>Serialization - Rationale</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
@@ -31,7 +31,6 @@ http://www.boost.org/LICENSE_1_0.txt)
<dt><a href="#archives">Archives are not streams</a></dt>
<dt><a href="#strings">Strings are treated specially in text archives</a></dt>
<dt><a href="#typeid"><code style="white-space: normal">typeid</code> information is not included in archives</a></dt>
<dt><a href="#trap">Compile time trap when saving a non-const value</a></dt>
<!--
<dt><a href="#footnotes">Footnotes</a></dt>
-->
@@ -50,7 +49,7 @@ streams even though they have similar syntax rules.
<ul>
<li>Archive classes are not kinds of streams though they
are implemented in terms of streams. This
distinction is addressed in <a href="bibliography.html#5">[5]</a> item number item 41 .
distinction is addressed in <a href="bibliography.html#5">[5]</a> item number 41.
<li>We don't want users to insert/extract&nbsp;data
directly into/from &nbsp;the stream .&nbsp; This could
create a corrupted archive. Were archives
@@ -110,226 +109,6 @@ and/or <code style="white-space: normal">export</code> facilities described in t
In effect, <code style="white-space: normal">export</code> generates a portable equivalent to
<code style="white-space: normal">typeid</code> information.
<h2><a name="trap"></a>Compile time trap when saving a non-const value</h2>
</p>
The following code will fail to compile. The failure will occur on a line with a
<code style="white-space: normal">BOOST_STATIC_ASSERT</code>.
Here, we refer to this as a compile time trap.
<code style="white-space: normal"><pre>
T t;
ar &lt;&lt; t;
</pre></code>
unless the tracking_level serialization trait is set to "track_never". The following
will compile without problem:
<code style="white-space: normal"><pre>
const T t
ar &lt;&lt; t;
</pre></code>
Likewise, the following code will trap at compile time:
<code style="white-space: normal"><pre>
T * t;
ar >> t;
</pre></code>
if the tracking_level serialization trait is set to "track_never".
<p>
This behavior has been contraversial and may be revised in the future. The criticism
is that it will flag code that is in fact correct and force users to insert
<code style="white-space: normal">const_cast</code>. My view is that:
<ul>
<li>The trap is useful in detecting a certain class of programming errors.
<li>Such errors would otherwise be difficult to detect.
<li>The incovenience caused by including this trap is very small in relation
to its benefits.
</ul>
The following case illustrates my position. It was originally used as an example in the
mailing list by Peter Dimov.
<code style="white-space: normal"><pre>
class construct_from
{
...
};
void main(){
...
Y y;
construct_from x(y);
ar &lt;&lt; x;
}
</pre></code>
Suppose that there is no trap as described above.
<ol>
<li>this example compiles and executes fine. No tracking is done because
construct_from has never been serialized through a pointer. Now some time
later, the next programmer(2) comes along and makes an enhancement. He
wants the archive to be sort of a log.
<code style="white-space: normal"><pre>
void main(){
...
Y y;
construct_from x(y);
ar &lt;&lt; x;
...
x.f(); // change x in some way
...
ar &lt;&lt; x
}
</pre></code>
<p>
Again no problem. He gets two different of copies in the archive, each one is different.
That is he gets exactly what he expects and is naturally delighted.
<p>
<li>Now sometime later, a third programmer(3) sees construct_from and says -
oh cool, just what I need. He writes a function in a totally disjoint
module. (The project is so big, he doesn't even realize the existence of
the original usage) and writes something like:
<code style="white-space: normal"><pre>
class K {
shared_ptr &lt;construct_from&gt; z;
template &lt;class Archive&gt;
void serialize(Archive & ar, const unsigned version){
ar &lt;&lt; z;
}
};
</pre></code>
<p>
He builds and runs the program and tests his new functionality. It works
great and he's delighted.
<p>
<li>Things continue smoothly as before. A month goes by and it's
discovered that when loading the archives made in the last month (reading the
log). Things don't work. The second log entry is always the same as the
first. After a series of very long and increasingly acrimonius email exchanges,
its discovered
that programmer (3) accidently broke programmer(2)'s code .This is because by
serializing via a pointer, the "log" object now being tracked. This is because
the default tracking behavior is "track_selectively". This means that class
instances are tracked only if they are serialized through pointers anywhere in
the program. Now multiple saves from the same address result in only the first one
being written to the archive. Subsequent saves only add the address - even though the
data might have been changed. When it comes time to load the data, all instances of the log record show the same data.
In this way, the behavior of a functioning piece of code is changed due the side
effect of a change in an otherwise disjoint module.
Worse yet, the data has been lost and cannot not be now recovered from the archives.
People are really upset and disappointed with boost (at least the serialization system).
<p>
<li>
After a lot of investigation, it's discovered what the source of the problem
and class construct_from is marked "track_never" by including:
<code style="white-space: normal"><pre>
BOOST_SERIALIZATION_TRACKING(construct_from, track_never)
</pre></code>
<li>Now everything works again. Or - so it seems.
<p>
<li><code style="white-space: normal">shared_ptr&lt;construct_from&gt;</code>
is not going to have a single raw pointer shared amongst the instances. Each loaded
<code style="white-space: normal">shared_ptr&lt;construct_from&gt;</code> is going to
have its own distince raw pointer. This will break
<code style="white-space: normal">shared_ptr</code> and cause a memory leak. Again,
The cause of this problem is very far removed from the point of discovery. It would
well be that the problem is not even discovered until after the archives are loaded.
Now we not only have difficult to find and fix program bug, but we have a bunch of
invalid archives and lost data.
</ol>
Now consider what happens when the trap is enabled:.
<ol>
<p>
<li>Right away, the program traps at
<code style="white-space: normal"><pre>
ar &lt;&lt; x;
</pre></code>
<p>
<li>The programmer curses (another %^&*&* hoop to jump through). If he's in a
hurry (and who isn't) and would prefer not to <code style="white-space: normal">const_cast</code>
- because it looks bad. So he'll just make the following change an move on.
<code style="white-space: normal"><pre>
Y y;
const construct_from x(y);
ar &lt;&lt; x;
</pre></code>
<p>
Things work fine and he moves on.
<p>
<li>Now programer (2) wants to make his change - and again another
annoying const issue;
<code style="white-space: normal"><pre>
Y y;
const construct_from x(y);
...
x.f(); // change x in some way ; compile error f() is not const
...
ar &lt;&lt; x
</pre></code>
<p>
He's mildly annoyed now he tries the following:
<ul>
<li>He considers making f() a const - but presumable that shifts the const
error to somewhere else. And his doesn't want to fiddle with "his" code to
work around a quirk in the serializaition system
<p>
<li>He removes the <code style="white-space: normal">const</code>
from <code style="white-space: normal">const construct_from</code> above - damn now he
gets the trap. If he looks at the comment code where the
<code style="white-space: normal">BOOST_STATIC_ASSERT</code>
occurs, he'll do one of two things
<ol>
<p>
<li>This is just crazy. Its making my life needlessly difficult and flagging
code that is just fine. So I'll fix this with a <code style="white-space: normal">const_cast</code>
and fire off a complaint to the list and mabe they will fix it.
In this case, the story branches off to the previous scenario.
<p>
<li>Oh, this trap is suggesting that the default serialization isn't really
what I want. Of course in this particular program it doesn't matter. But
then the code in the trap can't really evaluate code in other modules (which
might not even be written yet). OK, I'll at the following to my
construct_from.hpp to solve the problem.
<code style="white-space: normal"><pre>
BOOST_SERIALIZATION_TRACKING(construct_from, track_never)
</pre></code>
</ol>
</ul>
<p>
<li>Now programmer (3) comes along and make his change. The behavior of the
original (and distant module) remains unchanged because the
<code style="white-space: normal">construct_from</code> trait has been set to
"track_never" so he should always get copies and the log should be what we expect.
<p>
<li>But now he gets another trap - trying to save an object of a
class marked "track_never" through a pointer. So he goes back to
construct_from.hpp and comments out the
<code style="white-space: normal">BOOST_SERIALIZATION_TRACKING</code> that
was inserted. Now the second trap is avoided, But damn - the first trap is
popping up again. Eventually, after some code restructuring, the differing
requirements of serializating <code style="white-space: normal">construct_from</code>
are reconciled.
</ol>
Note that in this second scenario
<ul>
<li>all errors are trapped at compile time.
<li>no invalid archives are created.
<li>no data is lost.
<li>no runtime errors occur.
</ul>
It's true that these traps may sometimes flag code that is currently correct and
that this may be annoying to some programmers. However, this example illustrates
my view that these traps are useful and that any such annoyance is small price to
pay to avoid particularly vexing programming errors.
<!--
<h2><a name="footnotes"></a>Footnotes</h2>
<dl>
+42
View File
@@ -0,0 +1,42 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Serialization of Classes</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Serializable Concept</h2>
</td>
</tr>
</table>
<hr>
<dl class="page-index">
<dt><a href="archives.html">Archive Concepts</a>
<dt><a href="serialization.html">Serializable Concept</a>
<dt><a href="special.html">Special Considerations</a>
<dt><a href="archive_reference.html">Archive Class Reference</a>
<dt><a href="implementation.html">Implementation Notes</a>
</dl>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
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)
</i></p>
</body>
</html>
+256 -67
View File
@@ -7,38 +7,146 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Release Notes</title>
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Release Notes</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">Release Notes</h2>
</td>
</tr>
<tr>
<td valign="top" width="300">
<h3>
<a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">
Serialization</h1>
<h2 align="center">
Release Notes</h2>
</td>
</tr>
</table>
<hr>
<dl class="index">
<dt><a href="#requirements">Requirements</a></dt>
<dt><a href="#recent_improvements">Differences from version 1.32</a></dt>
<dt><a href="#todo">Pending Issues</a></dt>
<dt><a href="#differences_1_59">Differences from version 1.58</a></dt>
<dt><a href="#differences_1_58">Differences from version 1.48</a></dt>
<dt><a href="#differences_1_45">Differences from version 1.45</a></dt>
<dt><a href="#differences_1_43">Differences from version 1.43</a></dt>
<dt><a href="#differences_1_42">Differences from version 1.42</a></dt>
<dt><a href="#differences_1_41">Differences from version 1.41</a></dt>
<dt><a href="#differences_1_40">Differences from version 1.40</a></dt>
<dt><a href="#differences_1_39">Differences from version 1.39</a></dt>
<dt><a href="#differences_1_37">Differences from version 1.37</a></dt>
<dt><a href="#differences_1_35">Differences from version 1.35</a></dt>
<dt><a href="#differences_1_34">Differences from version 1.34</a></dt>
<dt><a href="#differences_1_33">Differences from version 1.33</a></dt>
<dt><a href="#differences_1_32">Differences from version 1.32</a></dt>
<dt><a href="#todo">Pending Issues</a></dt>
</dl>
This is the Boost 1.33 Serialization Library.
There are currently no known bugs. However, due to compiler/library quirks and or
bugs, some tests fail with some combinations of compilers and libraries.
<h2><a name="requirements"></a>Requirements</h2>
This library requires Boost version 1.33 or later.
As of this writing, there are no known bugs. However, due to compiler/library
quirks and or bugs, some tests fail with some combinations of compilers and
libraries.
<h2><a name="differences_1_59"></a>Differences from Boost 1.58</h2>
<ul>
<li>Eliminated support for Borland compilers and Microsoft compilers prior to version
7.1.
<li>Eliminated support for compilers which do not support Partial Function Template
Ordering (pfto).
<li>Added support for "visibility hidden" for GCC compilers. Shared libraries
will only expose symbols actually needed rather than all sympols in the library. This
should result in smaller shared libraries which are faster to load.
</ul>
<h2><a name="differences_1_58"></a>Differences from Boost 1.48</h2>
<ul>
<li>Added support for C++11 types such as std::shared_ptr, std::array, and others.
<li>Implemented the concept of a "Helper" which can be used to implement serialization of types which are otherwise not serializable."
<li>Made library compatible with C++11, Compatibility with C++03 has been maintained.
</ul>
<h2><a name="differences_1_45"></a>Differences from Boost 1.45</h2>
Since the release of version 1.42, it has been discovered that binary
archives created by versions 1.42-1.44 cannot always be read by the
recent binary archive code. Work has proceeded in detecting the source
of these anomolies and those which have been reported with test cases
have been fixed. As of this writing, it is not known whether all
binary archives created with these versions can be loaded.
<h2><a name="differences_1_43"></a>Differences from Boost 1.43</h2>
<ul>
<li>fixed bug in the serialization of virtual base classes. Due
to heroic efforts by Takatoshi Kondo.
<li>Native binary archives created under versions 1.42 and 1.43
suffer from a serious problem. It's likely they won't be readable
by this latest version. This due to the fact that 1.42 made some
changes in the binary format of some types. Normally this could
be addressed by detecting the library version number written into
the archive header. Unfortunately, this library version number
was not incremented at 1.42 as it should have been. So now we have
two different binary archive versions with the same library version
number.
<p>
This has been addressed by including a small utility in the example
directory named fix_six.cpp. This should be run with the command line<br>
<code><pre>
fix_six &lt;file name&gt;
</pre></code>
This will assign 7 to the library version number of the archive. This
fix will need to ba applied to native binary archives created with
boost versions 1.42 and 1.43.
</ul>
<h2><a name="differences_1_42"></a>Differences from Boost 1.42</h2>
<ul>
<li>fixed failure of shared_ptr serialization when serializing pointers
created from enable_shared_from_this.
<li>added example for a simple archive which can be used as a debug log.
This example illustrates the implemenation of the archive concept to aid
understanding required to create one's own archive classes. The resulting
archive is useful for debugging in that it only 160 lines of code and is
header only - that is, it doesn't required linking to the serialization library.
<li>replaced example used to show how to derive from an existing archive.
This example creates an XML archive class which doesn't include serialization
traits such as class_id, class_version, etc. It might be useful for exporting
one's class information to osme XML processor and/or debugging programs.
<li>compile time warnings have been implemented to detect practices which
though correct, will result in operation or side effects different than
a user probably intends.
<li>Some memory leaks associated with void_cast have been fixed.
</ul>
<h2><a name="differences_1_41"></a>Differences from Boost 1.41</h2>
<ul>
<li>adjustments have been made to minimize compile time warnings.
<li>compile time warnings have been implemented to detect practices which
though correct, will result in operation or side effects different than
a user probably intends.
<li>Some memory leaks associated with void_cast have been fixed.
</ul>
<h2><a name="differences_1_40"></a>Differences from Boost 1.40</h2>
This library has been tested against Boost version 1.39 and 1.40.
<p>
Changes have been made to archive classes included with the library. Users who
have used these a guide to making their own archive classes will find that
these will likely no longer compile. This can be remedied by making the
following changes in the code which instantiates these archive classes.
</p>
Old Code:<br>
<code><pre>
...
#include &lt;boost/archive/impl/archive_pointer_iserializer.ipp&gt;
...
template class detail::archive_pointer_iserializer&lt;naked_text_iarchive&gt; ;
...
template class detail::archive_pointer_iserializer&lt;text_iarchive&gt; ;
</pre></code>should be replaced with this new code: <code><pre>
#include &lt;boost/archive/impl/archive_serializer_map.ipp&gt;
...
template class detail::archive_serializer_map&lt;naked_text_iarchive&gt; ;
...
template class detail::archive_serializer_map&lt;text_iarchive&gt; ;
</pre></code>
<!--
<p>
The serialization library uses the boost spirit package to load XML archives.
We have found that all tests pass using spirit 1.6x. Spirit 1.8 and higher does not work with
older compilers - specificallly MSVC 6, Borland and GCC < 3.0.
older compilers - specifically MSVC 6, Borland and GCC < 3.0.
If you are using one of these compilers, you may download a version
of spirit 1.6 <a href="http://spirit.sourceforge.net/index.php?doc=download/index.html">here</a>.
To use this downloaded version rather than the one included with boost,
@@ -50,57 +158,138 @@ set SPIRIT_ROOT=c:/spirit16
If you're not using bjam and the Jamfile to build the library, be sure that
the directory which contains the version of spirit you plan to use is placed
at the front of the list of include paths.
<h2><a name="recent_improvements"></a>Differences from Boost 1.32</h2>
-->
<h2><a name="differences_1_39"></a>Differences from Boost 1.39</h2>
<ul>
<li>Dynamic Linking Library (DLLs and shared libraries) for platforms which support them. See
<a href="../../../more/getting_started.html#auto-link">Automatic Linking on Windows</a>.
<li>Implementation of auto-link for compilers which can support this.
<li>Better support for <em>Argument Dependent Lookup</em> and two-phase lookup.
This results in simpler rules regarding the placing of serialization specializations
namespaces.
<li>Enhanced documentation to help explain usage of the above.
<li>Adjustments to improve support for less conformant compilers.
<li>Improved <code>const</code> correctness for save/load operators. Note that this may
produce compile time errors in code which compiled without problem in earlier boost releases.
In most cases the fix is trivial. In other cases, code should be scrutinized to be
sure that it doesn't use the serializaton system in a way which may introduce subtle bugs in
to the program. A fuller explanation of this issue can be found
<a target="detail" href="traits.html#tracking">here</a>.
<li>A new implementation of serialization for <code style="white-space: normal">shared_ptr&lt;T&gt;</code>. This
is compatible with public interface of <code style="white-space: normal">shared_ptr&lt;T&gt;</code>
so it should be more robust and not have to change in the future. The implementation optionally
includes code to load <code style="white-space: normal">shared_ptr&lt;T&gt;</code> stored in
archives created with boost 1.32. This code is stored in the header:
<code style="white-space: normal">boost/serialization/shared_ptr_132.hpp</code>. If your application
needs to load archives created with boost 1.32 libraries, include the above header
before each inclusion of <code style="white-space: normal">boost/serialization/shared_ptr.hpp</code>.
<li>More compilers tested and supported.
<li>Miscelleanous bug fixes.
<li>
It is now possible to serialize an object through a pointer to a class which
implements its own <code style="white-space: normal">new/delete</code>
operators. This functionaly is not available on some compilers.
<li>
serialization of polymorphic objects has been sped up considerably.
</ul>
As of this writing, all bug reports filed as TRAK tickets have been addressed.
There are some TRAK tickets pending which would best be described as feature
requests. See <a href="#todo">Pending Issues</a>.
<h2><a name="differences_1_37"></a>Differences from Boost 1.37</h2>
There are no new features in this version. As of this writing, all bug reports
filed as TRAK tickets have been addressed. There are some TRAK tickets pending
which would best be described as feature requests. See <a href="#todo">Pending
Issues</a>.
<h2><a name="differences_1_36"></a>Differences from Boost 1.36</h2>
There are no new features in this version. As of this writing, all bug reports
filed as TRAK tickets have been addressed.
<h2><a name="differences_1_35"></a>Differences from Boost 1.35</h2>
<ul>
<li>
The library is now thread safe. That is, multiple archives can be open in
different threads. This has been implmented with a lock-free algorithm to avoid
any performance bottlenecks.
<li>
Serialization of types defined in shared libraries is now supported. shared
libraries (DLLS) can be loaded/unloaded dynamically at runtime. This includes
the serialization of instances of abstract base classes so that a program can
be written so as to be compatible with as yet undefined and un-implemented
code.
<li>
The extended type info system has been enhanced to in order to implement the
above. It is now a general purpose system for creating and casting of types
about which is only known a string ID and an abstract base class.
<li>
All bug reports filed as TRAK tickets have been addressed.
<li>
As of this writing, the library will fail build on older compilers such as MSVC
before version 7.1 and older versions of Borland compilers. This might or might
not change in the future.
</ul>
<h2><a name="differences_1_34"></a>Differences from Boost 1.34</h2>
<ul>
<li>
Enhanced support for fast serialization for native binary archives. By Mattias
Troyer.
<li>
Improved implementation of "export" functionality. Removes header ordering
requirement and eliminates the maintenance of a pre-determined list of "known
archives" By David Abrahams.
<li>
Improved support for STLPort.
</ul>
<h2><a name="differences_1_33"></a>Differences from Boost 1.33</h2>
<ul>
<li>
Native Binary archives use the <code style="white-space: normal">std::streambuf</code>
interface. This should result in noticeably faster execution in many cases.
</ul>
<h2><a name="differences_1_32"></a>Differences from Boost 1.32</h2>
<ul>
<li>
Dynamic Linking Library (DLLs and shared libraries) for platforms which support
them. See <a href="../../../more/getting_started/windows.html#auto-linking">Automatic
Linking on Windows</a>.
<li>
Implementation of auto-link for compilers which can support this.
<li>
Better support for <em>Argument Dependent Lookup</em>
and two-phase lookup. This results in simpler rules regarding the placing of
serialization specializations namespaces.
<li>
Enhanced documentation to help explain usage of the above.
<li>
Adjustments to improve support for less conformant compilers.
<li>
Improved <code>const</code> correctness for save/load operators. Note that this
may produce compile time errors in code which compiled without problem in
earlier boost releases. In most cases the fix is trivial. In other cases, code
should be scrutinized to be sure that it doesn't use the serialization system
in a way which may introduce subtle bugs in to the program. A fuller
explanation of this issue can be found <a target="detail" href="traits.html#tracking">
here</a>.
<li>
A new implementation of serialization for <code style="white-space: normal">shared_ptr&lt;T&gt;</code>.
This is compatible with public interface of <code style="white-space: normal">shared_ptr&lt;T&gt;</code>
so it should be more robust and not have to change in the future. The
implementation optionally includes code to load <code style="white-space: normal">shared_ptr&lt;T&gt;</code>
stored in archives created with boost 1.32. This code is stored in 'he header: <code style="white-space: normal">
boost/serialization/shared_ptr_132.hpp</code>. If your application needs to
load archives created with boost 1.32 libraries, include the above header
before each inclusion of <code style="white-space: normal">boost/serialization/shared_ptr.hpp</code>.
<li>
More compilers tested and supported.
<li>
Miscellaneous bug fixes.
</ul>
<h2><a name="todo"></a>Pending issues</h2>
<ul>
<li>Compile, and test on more platforms
<li>implement <code>is_virtual_base&lt;T&gt;</code> to automatically
eliminate redundancy in virtual base class serialization.
<li>currently can't serialize through a pointer an object a of class
that implements its own <code style="white-space: normal">new/delete</code> operators.
<li>Its possible that <code style="white-space: normal">std::string</code>
and <code style="white-space: normal">std::wstring</code> contain characters such as
'\0' which cannot be rendered in XML without an escape mechanism. Currently there is
no such escape mechanism implemented.
<li>
Rvalues cannot be serialized. It would be possible to implement this for
untracked types, but this has not been done.
<li>
Pointers to pointers cannot currently be serialized
<li>
It's possible that <code style="white-space: normal">std::string</code> and <code style="white-space: normal">
std::wstring</code>
contain characters such as '\0' and -1 (EOF) which cannot be rendered in text
and XML archives without an escape mechanism. Currently there is no such escape
mechanism implemented.
<li>
A subtle error in the implementation of serializaton of <code style="white-space: normal">
std::map</code> is fixed in this version. Unfortunately, the fix breaks
serialization of <code style="white-space: normal">std::map</code>
for those compilers which do not support partial template specialization. Also,
types which contain pointers or tracked types might not work correctly.
<li>
Serialization of virtual base classes relies upon RTTI. It will fail when used on
systems which don't have RTTI enabled.
</ul>
<p>
Aside from the above, there are a number of issus related to specific platforms.
These are listed in <a href="implementation.html#othercompilerissues">Specific Compiler/Library Issues</a>.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
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)
</i></p>
Aside from the above, there are a number of issues related to specific
platforms. These are listed in <a href="implementation.html#othercompilerissues">Specific
Compiler/Library Issues</a>.
<hr>
<p>
<i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2009.
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) </i>
</p>
</body>
</html>
+108 -83
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Serialization of Classes</title>
@@ -48,12 +48,13 @@ http://www.boost.org/LICENSE_1_0.txt)
<dt><a href="#splittingfreefunctions">Free Functions</a>
</dl>
</dl>
<dt><a href="#pointers">Pointers</a>
<dt><a href="#pointeroperators">Pointers</a>
<dl class="page-index">
<dt><a href="#constructors">Non-Default Constructors</a>
<dt><a href="#derivedpointers">Pointers to Objects of Derived Classes</a>
<dl class="page-index">
<dt><a href="#registration">Registration</a>
<dt><a href="#export">Export</a>
<dt><a href="#instantiation">Instantiation</a>
<dt><a href="#selectivetracking">Selective Tracking</a>
<dt><a href="#runtimecasting">Runtime Casting</a>
@@ -61,8 +62,8 @@ http://www.boost.org/LICENSE_1_0.txt)
</dl>
<dt><a href="#references">References</a>
<dt><a href="#arrays">Arrays</a>
<dt><a href="wrappers.html">Serialization Wrappers</a>
<dt><a href="traits.html">Class Serialization Traits</a>
<dt><a href="wrappers.html">Serialization Wrappers</a>
<dt><a href="#models">Models - Serialization Implementations Included in the Library</a>
</dl>
@@ -70,23 +71,20 @@ A type <code style="white-space: normal">T</code> is <strong>Serializable</stron
if and only if one of the following is true:
<ul>
<li>it is a primitive type.<br>
In this document, we use the term primitive type to mean
types whose data is simply saved/loaded to/from an archive
with no further processing. Arithmetic (including characters),
bool, enum and stl::string and stl::wstring types are primitive types. Using
<a target="detail" href="traits.html#Traits">serialization traits</a>,
any user type can also be designated as "primitive"
so that it is handled in this way.
<li>it is a class type one of the following is true for all archive classes:
it is a class type and for all <strong>Archive</strong> classes, one of the following
has been declared:
By <i>primitive type</i> we mean a C++ built-in type and <i>ONLY</i>
a C++ built-in type. Arithmetic (including characters), bool, enum are primitive types.
Below in <a target="detail" href="traits.html#Traits">serialization traits</a>,
we define a "primitive" implementation level in a different way for a
different purpose. This can be a source of confusion.
<li>It is a class type and one of the following has been declared according
to the prototypes detailed below:
<ul>
<li>a class member function <code style="white-space: normal">serialize</code>
<li>a global function <code style="white-space: normal">serialize</code>
</ul>
<li>it is a pointer to a <strong>Serializable</strong> type.
<li>it is a reference to a <strong>Serializable</strong> type.
<li>it is an native C++ Array of <strong>Serializable</strong> type.
<li>it is a native C++ Array of <strong>Serializable</strong> type.
</ul>
<h2><a name="primitiveoperators">Primitive Types</a></h2>
@@ -103,8 +101,8 @@ For class/struct types, the template operators &amp;, &lt;&lt;, and &gt;&gt;
will generate code that invokes the programmer's serialization code for the
particular data type. There is no default. An attempt to serialize a
class/struct for which no serialization has been explicitly specified
will result in a compile time error. The serialiation of a class can
be specified via either a class member function or a free funcation which
will result in a compile time error. The serialization of a class can
be specified via either a class member function or a free function which
takes a reference to an instance of the class as an argument.
<h3><a name="member">Member Function</a></h3>
@@ -138,7 +136,7 @@ be made accessible to the serialization library by including:
friend class boost::serialization::access;
</code></pre>
in the class definition. This latter method should be preferred over the option
of making member function public. This will prevent serialization functions from
of making the member function public. This will prevent serialization functions from
being called from outside the library. This is almost certainly an error. Unfortunately,
it may appear to function but fail in a way that is very difficult to find.
<p>
@@ -182,7 +180,7 @@ possible to serialize them. So in some instances, minor modifications to the
class to be serialized will be necessary even when using this "non-intrusive"
method. In practice this may not be such a problem as many libraries
(E.G. STL) expose enough information to permit implementation of non-intrusive
serialization with absolutly no changes to the library.
serialization with absolutely no changes to the library.
<h4><a name="namespaces">Namespaces for Free Function Overrides</a></h4>
For maximum portability, include any free functions templates and definitions in the
@@ -194,6 +192,12 @@ templates can be in any of the following namespaces:
<li>namespace of the archive class
<li>namespace of the type being serialized
</ul>
<p>
Note that, at first glance, this suggestion may seem to be wrong for compilers which implement
two phase lookup. In fact, the serialization library used a perhaps overly clever
method to support this rule even for such compilers. Those with an interest in studying
this further will find more information in
<a target=serialization_hpp href="../../../boost/serialization/serialization.hpp">serialization.hpp</a>
<h3><a name="classmembers">Serialization of Class Members</a></h3>
Regardless of which of the above methods is used, the body of the serialize function must
@@ -207,7 +211,6 @@ specify the data to be saved/loaded by sequential application of the archive
}
</code></pre>
<h4><a name="base">Base Classes</a></h4>
The header file
<a href="../../../boost/serialization/base_object.hpp" target="base_object_hpp">
@@ -216,7 +219,7 @@ base_object.hpp
includes the template:
<pre><code>
template&lt;class Base, class Derived&gt;
Base & base_object(Derived &d);
Base &amp; base_object(Derived &amp;d);
</code></pre>
which should be used to create a reference to an object of the base
which can be used as an argument to the archive serialization operators.
@@ -252,14 +255,14 @@ Loading <code style="white-space: normal">const</code> members can be addressed
ar &amp; const_cast&lt;T &amp;&gt;(t);
</code></pre>
Note that this violates the spirit and intention of the <code style="white-space: normal">const</code>
keyword. <code style="white-space: normal">const</code> members are intialized when a class instance
keyword. <code style="white-space: normal">const</code> members are initialized when a class instance
is constructed and not changed thereafter. However, this may
be most appropriate in many cases. Ultimately, it comes down to
the question about what <code style="white-space: normal">const</code> means in the context
of serialization.
<h4><a name="templates"></a>Templates</h4>
Implementation serialization for templates is exactly the same process
Implementation of serialization for templates is exactly the same process
as for normal classes and requires no additional considerations. Among
other things, this implies that serialization of compositions of templates
are automatically generated when required if serialization of the
@@ -270,7 +273,7 @@ class <code style="white-space: normal">my_t</code>, then serialization for
<code style="white-space: normal">std::list&lt; boost::shared_ptr&lt; my_t&gt; &gt;</code> is already available
for use.
<p>
See for an example that shows how this idea might be implemented for your own
For an example that shows how this idea might be implemented for your own
class templates, see
<a href="../example/demo_auto_ptr.cpp" target="demo_auto_ptr.cpp">
demo_auto_ptr.cpp</a>.
@@ -285,8 +288,7 @@ shared_ptr.hpp
</a>
<!--
Only the most minimal change to
<a href="../../../boost/serialization/shared_count.hpp" target="shared_count_hpp">
shared_count.hpp</a>
<code>shared_count.hpp</code>
(to gain access to some private members) was necessary to achieve this.
This should demonstrate how easy it is to non-intrusively
implement serialization to any data type or template.
@@ -432,9 +434,12 @@ is preferred. The key to the serialization implementation is that objects are s
and loaded in exactly the same sequence. Using the <code style="white-space: normal">&amp;</code>
operator and <code style="white-space: normal">serialize</code>
function guarantees that this is always the case and will minimize the
occurence of hard to find errors related to synchronization of
occurrence of hard to find errors related to synchronization of
<code style="white-space: normal">save</code> and <code style="white-space: normal">load</code>
functions.
<p>
Also note that <code style="white-space: normal">BOOST_SERIALIZATION_SPLIT_FREE</code>
must be used outside of any namespace.
<h2><a name="pointeroperators">Pointers</a></h2>
A pointer to any class instance can be serialized with any of the archive
@@ -458,7 +463,7 @@ following situations must be addressed:
be determined and saved. Upon restoration the correct type
must be created and its address correctly cast to the base
class. That is, polymorphic pointers have to be considered.
<li>NULL pointers must be dectected when saved and restored
<li>NULL pointers must be detected when saved and restored
to NULL when deserialized.
</ol>
@@ -477,7 +482,7 @@ Loading a pointer:
<ol>
<li>read a tag from the archive.
<li>determine the type of object to be created
<li>if the object has already been loaded, return it's address.
<li>if the object has already been loaded, return its address.
<li>otherwise, create a new instance of the object
<li>read the data back in using the operators described above
<li>return the address of the newly created object.
@@ -491,7 +496,7 @@ and <code style="white-space: normal">&gt;&gt;</code> operators
<li>Loading the same pointer object multiple times
results in only one object being created, thereby replicating
the original pointer configuration.
<li>Structures such as collections of polymorphic pointers,
<li>Structures, such as collections of polymorphic pointers,
are handled with no special effort on the part of users of this library.
</ul>
Serialization of pointers of derived types through a pointer to the
@@ -531,14 +536,18 @@ will have to be overridden. Here is a simple example:
class my_class {
private:
friend class boost::serialization::access;
int member;
const int m_attribute; // some immutable aspect of the instance
int m_state; // mutable state of this instance
template&lt;class Archive&gt;
void serialize(Archive &amp;ar, const unsigned int file_version){
ar &amp; member;
ar &amp; m_state;
}
public:
my_class(int m) :
member(m)
// no default construct guarantees that no invalid object
// ever exists
my_class(int attribute) :
m_attribute(attribute),
m_state(0)
{}
};
</code></pre>
@@ -550,7 +559,7 @@ inline void save_construct_data(
Archive &amp; ar, const my_class * t, const unsigned int file_version
){
// save data required to construct instance
ar &lt;&lt; t-&gt;member;
ar &lt;&lt; t-&gt;m_attribute;
}
template&lt;class Archive&gt;
@@ -558,10 +567,10 @@ inline void load_construct_data(
Archive &amp; ar, my_class * t, const unsigned int file_version
){
// retrieve data from archive required to construct new instance
int m;
ar &gt;&gt; m;
int attribute;
ar &gt;&gt; attribute;
// invoke inplace constructor to initialize instance of my_class
::new(t)my_class(m);
::new(t)my_class(attribute);
}
}} // namespace ...
</code></pre>
@@ -582,22 +591,31 @@ class derived_one : public base {
class derived_two : public base {
...
};
main(){
int main(){
...
base *b;
...
ar &amp; b;
}
</code></pre>
When saving <code style="white-space: normal">b</code> what kind of object should be saved?
When loading <code style="white-space: normal">b</code> what kind of object should be created?
An object of class <code style="white-space: normal">derived_one</code>,
Should it be an object of class <code style="white-space: normal">derived_one</code>,
<code style="white-space: normal">derived_two</code>, or maybe <code style="white-space: normal">base</code>?
<p>
If this situation is not addressed by one of the methods described below,
an <a target="detail" href="exceptions.html#unregistered_class">
<code style="white-space: normal">unregistered_class</code></a> exception will be thrown when serialization is
invoked.
<p>Many times this situation is resolved automatically by the serialization
library.
It turns out that the kind of object serialized depends upon whether the base class
(<code style="white-space: normal">base</code> in this case) is polymorphic or not.
If <code style="white-space: normal">base</code> is not polymorphic, that is if it has no
virtual functions, then an object of the type <code style="white-space: normal">base</code>
will be serialized. Information in any derived classes will be lost. If this is what is desired
(it usually isn't) then no other effort is required.
<p>
If the base class is polymorphic, an object of the most derived type
(<code style="white-space: normal">derived_one</code>
or <code style="white-space: normal">derived_two</code>
in this case) will be serialized. The question of which type of object is to be
serialized is (almost) automatically handled by the library.
<p>
The system "registers" each class in an archive the first time an object of that
class it is serialized and assigns a sequential number to it. Next time an
@@ -608,51 +626,58 @@ the class being read. Note that this implies that "registration" has to occur
during both save and load so that the class-integer table built on load
is identical to the class-integer table built on save. In fact, the key to
whole serialization system is that things are always saved and loaded in
the same sequence. This includes "registration"
the same sequence. This includes "registration".
<p>
In many situations the problem never comes up. Consider:
Expanding our previous example:
<pre><code>
main(){
int main(){
derived_one d1;
derived_two d2:
...
ar &gt;&gt; d1;
ar &gt;&gt; d2;
ar &amp; d1;
ar &amp; d2;
// A side effect of serialization of objects d1 and d2 is that
// the classes derived_one and derived_two become known to the archive.
// So subsequent serialization of those classes by base pointer works
// without any special considerations.
base *b;
...
ar &amp; b;
}
</code></pre>
Here, the problem doesn't present itself. When <code style="white-space: normal">b</code> is read it is
When <code style="white-space: normal">b</code> is read it is
preceded by a unique (to the archive) class identifier which
has previously been related to class <code style="white-space: normal">derived_one</code> or
<code style="white-space: normal">derived_two</code>.
<p>
If a derived class hasn't been automatically "registered" as described
above, we have the option of registering it explicitly. All archives are
If a derived class has NOT been automatically "registered" as described
above, an <a target="detail" href="exceptions.html#unregistered_class">
<code style="white-space: normal">unregistered_class</code></a> exception
will be thrown when serialization is invoked.
<p>
This can be addressed by registering the derived class explicitly. All archives are
derived from a base class which implements the following template:
<pre><code>
template&lt;class T&gt;
register_type();
register_type(T * = NULL);
</code></pre>
So our problem could just as well be addressed by writing:
<pre><code>
main(){
int main(){
...
ar.template register_type&lt;derived_one&gt;();
ar.template register_type&lt;derived_two&gt;();
base *b;
...
ar &amp; b;
}
</code></pre>
Note that if the serialization function is split between save and load, both
functions must include the registration. This is required to keep the save
and corresponding load in syncronization.
<p>
This will work but may be inconvenient. We don't always know which derived
and corresponding load in synchronization.
<h4><a name="export">Export</a></h4>
The above will work but may be inconvenient. We don't always know which derived
classes we are going to serialize when we write the code to serialize through
a base class pointer. Every time a new derived class is written we have to
go back to all the places where the base class is serialized and update the
@@ -665,9 +690,10 @@ So we have another method:
BOOST_CLASS_EXPORT_GUID(derived_one, "derived_one")
BOOST_CLASS_EXPORT_GUID(derived_two, "derived_two")
main(){
int main(){
...
base *b;
...
ar &amp; b;
}
</code></pre>
@@ -693,27 +719,11 @@ This means that serialization code must be instantiated for each
combination of archive and data type that is serialized in the program.
<p>
Polymorphic pointers of derived classes may never be referred to
explictly by the program so normally code to serialize such classes
explicitly by the program so normally code to serialize such classes
would never be instantiated. So in addition to including export key
strings in an archive, <code style="white-space: normal">BOOST_CLASS_EXPORT_GUID</code> explicitly
instantiates the class serialization code for all archive classes used
by the program.
<p>
In order to do this,
<a href="../../../boost/serialization/export.hpp" target="export_hpp">export.hpp</a>
includes meta programming code to build a <code style="white-space: normal">mpl::list</code>
of all the file types used by the module by checking for definition of the header
inclusion guards.
Using this list,
<code style="white-space: normal">BOOST_CLASS_EXPORT_GUID</code> will explicitly instantiate serialization
code for all exported classes.
For this implementaton to function, the header file
<a href="../../../boost/serialization/export.hpp" target="export_hpp">export.hpp</a>
has to come after all the archive header files. This is enforced
by code at the end of the header file:
<a href="../../../boost/archive/basic_archive.hpp" target="basic_archive_hpp">basic_archive.hpp</a>
which will trip a STATIC_ASSERT if this requirement is violated.
<h4><a name="selectivetracking">Selective Tracking</a></h4>
Whether or not an object is tracked is determined by its
@@ -745,7 +755,7 @@ can be used.
In order to properly translate between base and derived pointers
at runtime, the system requires each base/derived pair be found
in a table. A side effect of serializing a base object with
<code style="white-space: normal">boost::serialization::base_object&lt;Base&gt;(Derived &)</code>
<code style="white-space: normal">boost::serialization::base_object&lt;Base&gt;(Derived &amp;)</code>
is to ensure that the base/derived pair is added to the table
before the <code style="white-space: normal">main</code> function is entered.
This is very convenient and results in a clean syntax. The only
@@ -779,15 +789,18 @@ class derived : public base {
template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int file_version){
// method 1 : invoke base class serialization
boost::serialization::base_object&lt;base&gt;(*this);
ar &amp; boost::serialization::base_object&lt;base&gt;(*this);
// method 2 : explicitly register base/derived relationship
boost::serialization::void_cast_register&lt;derived, base&gt;();
boost::serialization::void_cast_register&lt;derived, base&gt;(
static_cast&lt;derived *&gt;(NULL),
static_cast&lt;base *&gt;(NULL)
)
}
};
BOOST_CLASS_EXPORT_GUID(derived, "derived")
main(){
int main(){
//...
std::stringstream ss;
boost::archive::text_iarchive ar(ss);
@@ -795,6 +808,17 @@ main(){
ar &gt;&gt; b;
}
</code></pre>
<p>
In order for this template to be invoked in code compiled by non-conforming
compilers, the following syntax may be used:
<pre><code>
boost::serialization::void_cast_register(
static_cast&lt;Derived *&gt;(NULL),
static_cast&lt;Base *&gt;(NULL)
);
</code></pre>
For more information, see <a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
<h3><a name="references"></a>References</h3>
Classes that contain reference members will generally require
@@ -883,11 +907,11 @@ rather than
<pre><code>
#include &lt;list&gt;
</code></pre>
Since the former includes the latter, this all that is necessary.
Since the former includes the latter, this is all that is necessary.
The same holds true for all STL collections as well as templates
required to support them (e.g. <code style="white-space: normal">std::pair</code>).
<p>
As of this writing, the library contains serialization of the following boost clases:
As of this writing, the library contains serialization of the following boost classes:
<ul>
<li>optional
<li>variant
@@ -895,8 +919,9 @@ As of this writing, the library contains serialization of the following boost cl
<li>shared_ptr
<li>auto_ptr (demo)
</ul>
C++17 <code style="white-space: normal">std::variant is supported as well</code>.
Others are being added to the list so check the boost files section and headers for
new implmentations!
new implementations!
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
Distributed under the Boost Software License, Version 1.0. (See
+17 -17
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Template serialization - shared_ptr</title>
@@ -92,36 +92,36 @@ instance of <code style="white-space: normal">sp_counted_base_impl<T, ...></code
doesn't have a default constructor, serialization requires
specification of the following overload:
<pre><code>
template&lt;class Archive, class P, class D>
template&lt;class Archive, class P, class D&gt;
inline void save_construct_data(
Archive &amp; ar,
const boost::detail::sp_counted_base_impl<P, D> * t,
const boost::detail::sp_counted_base_impl&lt;P, D&gt; * t,
const unsigned int file_version
){
// variables used for construction
ar &lt;&lt; t->ptr;
ar &lt;&lt; t-&gt;ptr;
ar &lt;&lt; *t;
}
template<class Archive, class P, class D>
template&lt;class Archive, class P, class D&gt;
inline void load_construct_data(
Archive &amp; ar,
boost::detail::sp_counted_base_impl<P, D> * t,
boost::detail::sp_counted_base_impl&lt;P, D&gt; * t,
const unsigned int file_version
){
P ptr_;
ar &gt;&gt; ptr_;
// placement new
::new(t)boost::detail::sp_counted_base_impl<P, D>(ptr_, D());
ar &gt;&gt;; *t;
::new(t)boost::detail::sp_counted_base_impl&lt;P, D&gt;(ptr_, D());
ar &gt;&gt; *t;
}
</code></pre>
The statement <code style="white-space: normal">ar &gt;&gt; ptr_</code> is key. This deserializes
the same pointer deserialzed above. Default object tracking will ensure
the same pointer deserialized above. Default object tracking will ensure
that no more than one instance of the object is created and that the
pointer returned by multiple deserializations are all the same. Hence,
regardless of how many instances of <code style="white-space: normal">shared_ptr/shared_count</code>
corresponding to a particular object are created, the will all point
corresponding to a particular object are created, they will all point
to the same object.
<p>
Since <code style="white-space: normal">sp_counted_base_impl&lt;P, D&gt;</code> is derived from
@@ -135,7 +135,7 @@ inline void serialize(
const unsigned int file_version,
int
){
ar & boost::serialization::base_object&lt;
ar &amp; boost::serialization::base_object&lt;
boost::detail::sp_counted_base
&gt;(*this);
}
@@ -150,7 +150,7 @@ inline void serialize(
){
}
</code></pre>
It would seem we're done, running the test program,
It would seem we're done, but running the test program,
<a href="../example/demo_shared_ptr.cpp" target="demo_shared_ptr_cpp">
demo_shared_ptr.cpp
</a>,
@@ -170,7 +170,7 @@ This indicates that we're not quite done. Due to default object
tracking, <code style="white-space: normal">sp_counted_base_impl&lt;P, D&gt;</code> is only
created once regardless of how many shared pointers point to the
same object. Of course, it has to be this way. The reference
count starts at 1 and is never incrememented. Code must be added
count starts at 1 and is never incremented. Code must be added
to the serialization functions to maintain the proper reference
count.
<p>
@@ -191,13 +191,13 @@ In this case we need only the latter function so we can replace the
base object serialization with:
<pre><code>
// register the relationship between each derived class
// its polymorphic base
// and its polymorphic base
void_cast_register&lt;
boost::detail::sp_counted_base_impl&lt;P, D&gt;
boost::detail::sp_counted_base,
&gt;();
</code></pre>
and we don't have to include a trival serializer for <code style="white-space: normal">sp_counted_base</code>
and we don't have to include a trivial serializer for <code style="white-space: normal">sp_counted_base</code>.
<p>
Finally we need to specify name-value pair wrappers if we want to be able
to use this serialization with XML archives.
@@ -219,9 +219,9 @@ shared pointers:
BOOST_SHARED_POINTER_EXPORT(T)
BOOST_SHARED_POINTER_EXPORT_GUID(T, K)
</pre></code>
These are specialize versions of the macros used for exporting classes serialized through raw pointers.
These are specialized versions of the macros used for exporting classes serialized through raw pointers.
<p>
Clearly, complete, correct and exception safe serialization of smart pointers is going to
Clear, complete, correct and exception safe serialization of smart pointers is going to
be a challenge. I hope that this implementation provides a useful
starting point for such an effort.
<hr>
+15 -15
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Template serialization - shared_ptr</title>
@@ -20,19 +20,19 @@ http://www.boost.org/LICENSE_1_0.txt)
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center"><code style="white-space: normal">shared_ptr&lt;class T&gt;</code> Revisted</h2>
<h2 align="center"><code style="white-space: normal">shared_ptr&lt;class T&gt;</code> Revisited</h2>
</td>
</tr>
</table>
<hr>
The previously described serialization of <code style="white-space: normal">shared_ptr</code>
illustrates the straight forward way of serializing a moderatly compiicated class structure.
illustrates the straightforward way of serializing a moderately complicated class structure.
Unfortunately, this way of doing it suffered from some undesirable features
<ul>
<li>It was dependent on the Boost implementation of <code style="white-space: normal">shared_ptr</code>.
The <code style="white-space: normal">shared_ptr</code> interface has been included
in <code style="white-space: normal">std::tr1</code> and may someday be included in the standard
C++ library. An implementation which depends only on the public interface can be guarenteed to
C++ library. An implementation which depends only on the public interface can be guaranteed to
function with any other future implementation of <code style="white-space: normal">shared_ptr</code>.
<li>It required extra macros for export.
</ul>
@@ -40,24 +40,24 @@ Unfortunately, this way of doing it suffered from some undesirable features
<pre><code>
template&lt;class Archive, class T&gt;
inline void save(
Archive & ar,
const boost::shared_ptr&ltT&gt; &t,
Archive &amp; ar,
const boost::shared_ptr&lt;T&gt; &amp;t,
const unsigned int /* file_version */
){
const T * t_ptr = t.get();
// just seriailize the underlying raw pointer
ar &lt;&lt: boost::serialization::make_nvp("px", t_ptr);
// just serialize the underlying raw pointer
ar &lt;&lt; boost::serialization::make_nvp("px", t_ptr);
}
template&lt;class Archive, class T&gt
template&lt;class Archive, class T&gt;
inline void load(
Archive & ar,
boost::shared_ptr&lt;T&gt; &t,
Archive &amp; ar,
boost::shared_ptr&lt;T&gt; &amp;t,
const unsigned int file_version
){
T* r;
// recover the underlying raw poiter
ar >> boost::serialization::make_nvp("px", r);
// recover the underlying raw pointer
ar &gt;&gt; boost::serialization::make_nvp("px", r);
// To Do - match up with other shared pointers which
// use this same raw pointer.
@@ -65,13 +65,13 @@ inline void load(
}
</code></pre>
In priniciple this is very much simpler than the original implementation. Completion of
In principle, this is very much simpler than the original implementation. Completion of
this code requires:
<ol>
<li>Filling in the "To Do". This required making an extra map for
<code style="white-space: normal">shared_ptr</code> instances.
<li>A method for identifing pointers to the same objects from pointers to their base classes.
<li>A method for identifying pointers to the same objects from pointers to their base classes.
<li>Backward compatibility with pointers serialized by the previous method. This exploits
the serialization class versioning.
<li>Proper handling of <code style="white-space: normal">weak_ptr</code>.
+95
View File
@@ -0,0 +1,95 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-10 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Derivation from an Existing Archive</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">A Simple Logging Archive Class</h2>
</td>
</tr>
</table>
<hr>
The purpose of this example is to help clarify the usage of the
<a href="archives.html"><strong>Archive Concept</strong></a>
so that one can implement his own archive classes.
<a href="../example/simple_log_archive.hpp" target="simple_archive_hpp">
<code>simple_log_archive.hpp</code></a> implements a simple but useful
archive class. This class can be used to send any serializable types
on an output text stream in a readable format. Usage of this facility
is trivially easy:
<pre><code>
#include "simple_log_archive.hpp"
...
// display the complete schedule
simple_log_archive log(std::cout);
log &lt;&lt; schedule;
</code></pre>
and it produces the following output
<pre><code>
schedule
count 6
item
first
driver bob
hour 6
minute 24
second -&gt;
stops
count 3
item -&gt;
latitude
degrees 34
minutes 135
seconds 52.56
longitude
degrees 134
minutes 22
seconds 78.3
...
</code></pre>
The complete example is <a href="../example/demo_simple_log.cpp" target="demo_simple_log_cpp">
<code>demo_simple_log.cpp</code></a>. Look at
<a href="archive_reference.html#trivial">Trivial Archive</a> to get a
better understanding of how this works.
Also, note the following:
<ul>
<li>Only 160 lines of code.
<li>Header only - linking with the serialization library not required.
<li>Displays ALL <a href="serialization.html"><strong>Serializable</strong></a> types.
<li>Lacks some features.
<ul>
<li>it will not display the data from the derived type given the pointer to a
polymorphic base class. That is, only displays the information of the base class.
To add that see the next example.
<li>doesn't display information serialized as binary data
</ul>
</ul>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2010.
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)
</i></p>
</body>
</html>
+254
View File
@@ -0,0 +1,254 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - singleton</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center"><code style="white-space: normal">singleton</code></h2>
</td>
</tr>
</table>
<hr>
<dl class="page-index">
<dt><a href="#motivation">Motivation</a>
<dt><a href="#features">Features</a>
<dt><a href="#classinterface">Class Interface</a>
<dt><a href="#requirements">Requirements</a>
<dt><a href="#example">Examples</a>
<dt><a href="#multithreading">Multi-Threading</a>
</dl>
<h3><a name="motivation">Motivation</a></h3>
The serialization library relies on the existence of a number
of static variables and tables to store information related
to runtime types. Examples are tables which relate exported
names to types and tables which relate base classes to derived
classes. Construction, destruction and usage of these variables
requires consideration of the following issues:
<ul>
<li>Some static data variable and constant entries refer to others.
The sequence of initialization cannot be arbitrary but must be in proper
sequence.</li>
<li>A number of static variables aren't referred to explicitly and, without
special precautions, will be stripped by most code optimizers</li>
<li>Many of these variables are created by templates and special care must
be taken to be sure that they are instantiated</li>
<li>In a multi-threading system, its possible that these static variables
will be accessed concurrently by separate threads. This would create a
race condition with unpredictable behavior</li>
</ul>
This singleton class addresses all of the above issues.
<h3><a name="features">Features</a></h3>
This singleton implementation has the following features:
<ul>
<li>
Any instance will be constructed before any attempt is made to access it.</li>
<li>
Any instance created with a template is guaranteed to be instantiated.
<li>
Regardless of whether or not an instance has been explicitly
referred to, it will not be stripped by the optimizer when the
executable is built in release mode.
<li>
All instances are constructed before
<code style="white-space: normal">main</code> is called
regardless of where they might be referenced within the program.
In a multi-tasking system, this guarantees that there will be no
race conditions during the construction of any instance. No
thread locking is required to guarantee this.
<li>
The above implies that any <code style="white-space: normal">const</code>
instances are thread-safe during the whole program. Again, no
thread locking is required.
<li>
If a mutable instance is created, and such an instance is modified
after main is called in a multi-threading system, there exists
the possibility that a race condition will occur. The serialization
library takes care that in the few places where a mutable
singleton is required, it is not altered after
<code style="white-space: normal">main</code> is called.
For a more general purpose usage, thread locking on this
singleton could easily be implemented. But as the serialization
library didn't require it, it wasn't implemented.
</ul>
<h3><a name="classinterface">Class Interface</a></h3>
<pre><code>
namespace boost {
namespace serialization {
template &lt;class T&gt;
class singleton : public boost::noncopyable
{
public:
static const T &amp; get_const_instance();
static T &amp; get_mutable_instance();
static bool is_destroyed();
};
} // namespace serialization
} // namespace boost
</code></pre>
<dl>
<dt><h4><pre><code>
static const T &amp; get_const_instance();
</code></pre></h4></dt>
<dd>
Retrieve a constant reference to the singleton for this type.
</dd>
<dt><h4><pre><code>
static T &amp; get_mutable_instance();
</code></pre></h4></dt>
<dd>
Retrieve a mutable reference to the singleton for this type.
</dd>
<dt><h4><pre><code>
static bool is_destroyed();
</code></pre></h4></dt>
<dd>
Return <code>true</code> if the destructor on this singleton has been
called. Otherwise, return <code>false</code>.
</dd>
</dl>
<h3><a name="requirements">Requirements</a></h3>
In order to be used as
<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
<code style="white-space: normal">
singleton&lt;T&gt;
</code>
</a>, the type T must be default constructible.
It doesn't require static variables - though it may have them.
Since the library guarantees that only one instance of
<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
<code style="white-space: normal">
singleton&lt;T&gt;
</code>
</a>
exists and all access is through the above static interface
functions, common member functions of T become
the functional equivalent of
<code style="white-space: normal">static</code> functions.
<h3><a name="example">Examples</a></h3>
There are at least two different ways to use this class template.
Both are used in the serialization library.
<p>
The first way is illustrated by an excerpt from the file
<code style="white-space: normal"><a target="extended_type_info" href="../src/extended_type_info.cpp">extended_type_info.cpp</a></code>.
which contains the following code:
<pre><code>
typedef std::set&lt;const extended_type_info *, key_compare&gt; ktmap;
...
void
extended_type_info::key_register(const char *key) {
...
result = singleton&lt;ktmap&gt;::get_mutable_instance().insert(this);
...
}
</code></pre>
Just by referring to the singleton instance anywhere in the program
will guarantee that one and only one instance for the specified
type (<code style="white-space: normal">ktmap</code> in this example)
will exist throughout the program. There is no need for any other
declaration or definition.
<p>
A second way is to use
<a target="singleton.hpp" href = "../../../boost/serialization/singleton.hpp">
<code style="white-space: normal">
singleton&lt;T&gt;
</code>
</a>
as one of the base classes of the type. This is illustrated by a simplified
excerpt from
<a target="extended_type_info_typeid.hpp" href = "../../../boost/serialization/extended_type_info_typeid.hpp">
<code style="white-space: normal">
extended_type_info_typeid.hpp
</code>
</a>
<pre><code>
template&lt;class T&gt;
class extended_type_info_typeid :
public detail::extended_type_info_typeid_0,
public singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;
{
friend class singleton&lt;extended_type_info_typeid&lt;const T&gt; &gt;;
private:
// private constructor to inhibit any existence other than the
// static one. Note: not all compilers support this !!!
extended_type_info_typeid() :
detail::extended_type_info_typeid_0()
{
type_register(typeid(T));
}
~extended_type_info_typeid(){}
...
};
</code></pre>
This usage will permit a more natural syntax to be used:
<pre><code>
extended_type_info_typeid&lt;T&gt;::get_const_instance()
</code></pre>
Again, including one or more of the above statements anywhere
in the program will guarantee that one and only one instance
is created and referred to.
<h3><a name="multithreading">Multi-Threading</a></h3>
This singleton CAN be safely used in multi-threading applications if one
is careful follow a simple rule:
<p>
<b>Do not call get_mutable_instance when more than one thread is running!</b>
All singletons used in the serialization library follow this rule.
In order to help detect accidental violations of this rule there
exist singleton lock/unlock functions.
<pre><code>
void boost::serialization::singleton_module::lock();
void boost::serialization::singleton_module::unlock();
bool boost::serialization::singleton_module::is_locked();
</code></pre>
In a program compiled for debug, any invocation of
<code style="white-space: normal">get_mutable_instance()</code>
while the library is in a "locked" state will trap in an assertion.
The singleton module lock state is initialized as "unlocked" to permit
alteration of static variables before
<code style="white-space: normal">main</code> is called.
The <code style="white-space: normal">lock()</code> and
<code style="white-space: normal">unlock()</code> are "global"
in that they affect ALL the singletons defined by this template.
All serialization tests invoke <code style="white-space: normal">lock()</code>
at the start of the program. For programs compiled in release
mode these functions have no effect.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2007.
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)
</i></p>
</body>
</html>
+17 -17
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - BOOST_STATIC_WARNING</title>
@@ -30,23 +30,23 @@ To cast from one type to another related type, C++ provides the following
operators:
<dl>
<dt><code>static_cast&lt;T *<&gt;(U *)<br>static_cast&lt;T &<&gt;(U &)</code></dt>
<dt><code>static_cast&lt;T *&gt;(U *)<br>static_cast&lt;T &amp;&gt;(U &amp;)</code></dt>
<dd>
<ul>
<li>required if neither T nor U are not polymorphic
<li>required if neither T nor U are polymorphic
<li>permitted in other cases.
<li>fails to detect erroneas casts of polymophic pointers/references at runtime.
<li>fails to detect erroneous casts of polymorphic pointers/references at runtime.
<li>does not permit "cross casting"
<li>inline function calls can be optimized away during compile time.
</ul>
</dd>
<p>
<dt><code>dynamic_cast&lt;T *<&gt;(U *)<br>dynamic_cast&lt;T &<&gt;(U &)</code></dt>
<dt><code>dynamic_cast&lt;T *&gt;(U *)<br>dynamic_cast&lt;T &amp;&gt;(U &amp;)</code></dt>
<dd>
<ul>
<li>permitted if either T or U are polymorphic
<li>prohibited in other cases.
<li>throws exception on detecting erroneas casts of polymorphic pointers/references
<li>throws exception on detecting erroneous casts of polymorphic pointers/references
at runtime.
<li>permits "cross casting"
<li>cannot optimise inline virtual functions at compile time.
@@ -58,7 +58,7 @@ These rules can make it difficult to use casting with a function template argume
Consider the following example:
<pre><code>
#include &lt;boost/smart_cast.hpp&gt;
#include &lt;boost/serialization/smart_cast.hpp&gt;
struct top {
};
@@ -91,14 +91,14 @@ template&lt;class T&gt;
bool is_storable(T &amp;t){
// what type of cast to use here?
// this fails at compiler time when T == base2
// this fails at compile time when T == base2
// return static_cast&lt;base1 &amp;&gt;(t).is_storable();
// this fails at compiler time when T == top
// this fails at compile time when T == top
// otherwise it works but cannot optimize inline function call
// return dynamic_cast&lt;base1 &amp;&gt;(t).is_storable();
// this always works - and is guarenteed to generate the fastest code !
// this always works - and is guaranteed to generate the fastest code !
return (boost::smart_cast_reference&lt;base1 &amp;&gt;(t)).is_storable();
}
@@ -121,27 +121,27 @@ The serialization library includes a mix of classes which use
both static polymorphism (<strong>CRTP</strong>) and dynamic
polymorphism via virtual functions. <code style="white-space: normal">smart_cast</code>
was written to address the more problematic manifestations of the
situation exmplified above.
situation exemplified above.
<h3>Usage</h3>
The following syntax is supported:
<pre><code>
smart_cast&lt;Target *, Source *&gt;(Source * s);
smart_cast&lt;Target *>(Source * s);
smart_cast&lt;Target &, Source &amp;&gt(Source &amp; s);
smart_cast&lt;Target *&gt;(Source * s);
smart_cast&lt;Target &amp;, Source &amp;&gt;(Source &amp; s);
</code></pre>
Note that the above syntax doesn't include
<pre><code>
smart_cast&lt;Target &amp; &gt(Source &amp; s)
smart_cast&lt;Target &amp; &gt;(Source &amp; s)
</code></pre>
but the same functionality is supported the the following special syntax
but the same functionality is supported with the following special syntax
<pre><code>
smart_cast_reference&lt;Target &amp;&gt(Source &amp; s)
smart_cast_reference&lt;Target &amp;&gt;(Source &amp; s)
</code></pre>
<h3>Requirements</h3>
<code style="white-space: normal">smart_cast</code> can be used only on compilers that support partial
template specialization or on types for which have be specified with the
template specialization or on types for which the
macro <code style="white-space: normal">
BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(&lt;type&gt;)</code>
has been applied.
+410 -35
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Special Considerations</title>
@@ -26,9 +26,9 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<dl class="page-index">
<dt><a href="#headersequence">Header Inclusion Sequence</a>
<dt><a href="#objecttracking">Object Tracking</a>
<dt><a href="#classinfo">Class Information</a>
<dt><a href="#helpersupport">Helper Support</a>
<dt><a href="#portability">Archive Portability</a>
<dl class="page-index">
<dt><a href="#numerics">Numerics</a>
@@ -36,21 +36,16 @@ http://www.boost.org/LICENSE_1_0.txt)
</dl>
<dt><a href="#binary_archives">Binary Archives</a>
<dt><a href="#xml_archives">XML Archives</a>
<dt><a href="#export">Exporting Class Serialization</a>
<dt><a href="#static_libraries">Static Libraries and Serialization</a>
<dt><a href="#dlls">DLLS - Serialization and Runtime Linking</a>
<dt><a href="#plugins">Plugins</a>
<dt><a href="#multi_threading">Multi-Threading</a>
<dt><a href="#optimizations">Optimizations</a>
<dt><a href="exceptions.html">Archive Exceptions</a>
<dt><a href="exception_safety.html">Exception Safety</a>
</dl>
<h3><a name="headersequence">Header Inclusion Sequence</a></h3>
This library is includes a large number of headers that can be included
in user code modules. The section
<a href="headers.html">Code Structure</a>
contains a summary of these headers.
<strong>
This library requires that all headers that implement archives be included
before any headers that implement class serialization.
</strong>
Violations of this rule will result in cryptic compile time errors.
<h3><a name="objecttracking">Object Tracking</a></h3>
Depending on how the class is used and other factors, serialized objects
may be tracked by memory address. This prevents the same object from being
@@ -59,10 +54,10 @@ can also be used to delete objects created during a loading process
that has been interrupted by throwing of an exception.
<p>
This could cause problems in
progams where the copies of different objects are saved from the same address.
programs where the copies of different objects are saved from the same address.
<pre><code>
template&lt;class Archive&gt;
void save(boost::basic_oarchive &amp; ar, const unsigned int version) const
void save(boost::basic_oarchive &amp; ar, const unsigned int version) const
{
for(int i = 0; i &lt; 10; ++i){
A x = a[i];
@@ -102,11 +97,11 @@ and a likely source of very subtle bugs.
Unfortunately, implementation issues currently prevent the detection of this kind of
error when the data item is wrapped as a name-value pair.
<p>
A similar problem can occur when different objects are loaded to and address
A similar problem can occur when different objects are loaded to an address
which is different from the final location:
<pre><code>
template&lt;class Archive&gt;
void load(boost::basic_oarchive &amp; ar, const unsigned int version) const
void load(boost::basic_oarchive &amp; ar, const unsigned int version) const
{
for(int i = 0; i &lt; 10; ++i){
A x;
@@ -117,20 +112,20 @@ void load(boost::basic_oarchive &amp; ar, const unsigned int version) const
</code></pre>
In this case, the address of <code>x</code> is the one that is tracked rather than
the address of the new item added to the set. Left unaddressed
this will break the features that depend on tracking such as loading object through a pointer.
this will break the features that depend on tracking such as loading an object through a pointer.
Subtle bugs will be introduced into the program. This can be
addressed by altering the above code thusly:
<pre><code>
template&lt;class Archive&gt;
void load(boost::basic_iarchive &amp; ar, const unsigned int version) const
void load(boost::basic_iarchive &amp; ar, const unsigned int version) const
{
for(int i = 0; i &lt; 10; ++i){
A x;
ar &gt;&gt; x;
std::pair&lt;std::set::const_iterator, bool&gt; result;
result = std::m_set.insert(x);
ar.reset_object_address(& (*result.first), &x);
ar.reset_object_address(&amp; (*result.first), &amp;x);
}
}
</code></pre>
@@ -142,7 +137,7 @@ values are duplicated, overhead associated with object tracking can
be eliminated by setting the object tracking class serialization trait
appropriately.
<p>
By default, data types designated primitive by
By default, data types designated primitive by the
<a target="detail" href="traits.html#level">Implementation Level</a>
class serialization trait are never tracked. If it is desired to
track a shared primitive object through a pointer (e.g. a
@@ -152,8 +147,6 @@ The alternative of changing the implementation level of a <code style="white-spa
would affect all <code style="white-space: normal">long</code>s serialized in the whole
program - probably not what one would intend.
<p>
It is possible that we may want to track addresses even though
the object is never serialized through a pointer. For example,
a virtual base class need be saved/loaded only once. By setting
@@ -162,6 +155,97 @@ redundant save/load operations.
<pre><code>
BOOST_CLASS_TRACKING(my_virtual_base_class, boost::serialization::track_always)
</code></pre>
<h3><a name="helpersupport">Helper Support</a></h3>
Some types, specially those with complicated lifetime behavior or limited
access to their internal state, might need or benefit from elaborate serialization
algorithms. The principle motivating case is that of shared_ptr. As instances
are loaded, they have to be "matched up" with any other instances which have
already been loaded. Thus, a table of previously loaded instances has to be
maintained while the archive containing the shared_ptr instances is being loaded.
Without maintaining such a table, the shared_ptr would be a serializable type.
<p>
To implement this facility, one declares a <i>helper object</i>
associated to the current archive that can be used to store contextual
information relevant to the particular type serialization algorithm.
<pre><code>
template&lt;class T&gt;
class shared_ptr
{
...
};
BOOST_SERIALIZATION_SPLIT_FREE(shared_ptr)
class shared_ptr_serialization_helper
{
// table of previously loaded shared_ptr
// lookup a shared_ptr from the object address
shared_ptr&lt;T&gt; lookup(const T *);
// insert a new shared_ptr
void insert&lt;shared_ptr&lt;T&gt; &gt;(const shared_ptr&lt;T&gt; *);
};
namespace boost {
namespace serialization {
template&lt;class Archive&gt;
void save(Archive &amp; ar, const shared_ptr &amp; x, const unsigned int /* version */)
{
// save shared ptr
...
}
template&lt;class Archive&gt;
void load(Archive &amp; ar, shared_ptr &amp; x, const unsigned int /* version */)
{
// get a unique identifier. Using a constant means that all shared pointers
// are held in the same set. Thus we detect handle multiple pointers to the
// same value instances in the archive.
const void * shared_ptr_helper_id = 0;
shared_ptr_serialization_helper &amp; hlp =
ar.template get_helper&lt;shared_ptr_serialization_helper&gt;(helper_instance_id);
// load shared pointer object
...
shared_ptr_serialization_helper &amp; hlp =
ar.template get_helper&lt;shared_ptr_serialization_helper&gt;(shared_ptr_helper_id);
// look up object in helper object
T * shared_object hlp.lookup(...);
// if found, return the one from the table
// load the shared_ptr data
shared_ptr&lt;T&gt; sp = ...
// and add it to the table
hlp.insert(sp);
// implement shared_ptr_serialization_helper load algorithm with the aid of hlp
}
} // namespace serialization
} // namespace boost
</code></pre>
<code style="white-space: normal">get_helper&lt;shared_ptr_serialization_helper&gt;();</code>
creates a helper object associated to the archive the first time it is invoked;
subsequent invocations return a reference to the object created in the first
place, so that <code style="white-space: normal">hlp</code> can effectively be
used to store contextual information persisting through the serialization
of different <code style="white-space: normal">complex_type</code> objects on
the same archive.
<p>
Helpers may be created for saving and loading archives.
The same program might have several different helpers or the same helper instantiated
separately from different parts of the program. This is what makes the helper_instance_id
necessary. In principle it could be any unique integer. In practice it seems
easiest to use the address of the serialization function which contains it. The
above example uses this technique.
<h3><a name="classinfo">Class Information</a></h3>
By default, for each class serialized, class information is written to the archive.
This information includes version number, implementation level and tracking
@@ -183,7 +267,7 @@ in this manner comes at a cost. Once archives are released to users, the
class serialization traits cannot be changed without invalidating the old
archives. Including the class information in the archive assures us
that they will be readable in the future even if the class definition
is revised. A light weight structure such as display pixel might be
is revised. A light weight structure such as a display pixel might be
declared in a header like this:
<pre><code>
@@ -211,16 +295,26 @@ BOOST_CLASS_TRACKING(pixel, boost::serialization::track_never)
</code></pre>
<h3><a name="portability">Archive Portability</a></h3>
Several archive classes create their data in the form of text or portable a binary format.
It should be possible to save such an of such a class on one platform and load it on another.
Several archive classes create their data in the form of text or a portable binary format.
It should be possible to save such a class on one platform and load it on another.
This is subject to a couple of conditions.
<h4><a name="numerics">Numerics</a></h4>
The architecture of the machine reading the archive must be able hold the data
saved. For example, the gcc compiler reserves 4 bytes to store a variable of type
<code style="white-space: normal">wchar_t</code> while other compilers reserve only 2 bytes.
So its possible that a value could be written that couldn't be represented by the loading program. This is a
So it's possible that a value could be written that couldn't be represented by the loading program. This is a
fairly obvious situation and easily handled by using the numeric types in
<a target="cstding" href="../../../boost/cstdint.hpp">&lt;boost/cstdint.hpp&gt;</a>
<P>
A special integral type is <code>std::size_t</code> which is a typedef
of an integral types guaranteed to be large enough
to hold the size of any collection, but its actual size can differ depending
on the platform. The
<a href="wrappers.html#collection_size_type"><code>collection_size_type</code></a>
wrapper exists to enable a portable serialization of collection sizes by an archive.
Recommended choices for a portable serialization of collection sizes are to
use either 64-bit or variable length integer representation.
<h4><a name="traits">Traits</a></h4>
Another potential problem is illustrated by the following example:
@@ -228,7 +322,7 @@ Another potential problem is illustrated by the following example:
template&lt;class T&gt;
struct my_wrapper {
template&lt;class Archive&gt;
Archive & serialize ...
Archive &amp; serialize ...
};
...
@@ -236,10 +330,10 @@ struct my_wrapper {
class my_class {
wchar_t a;
short unsigned b;
template<&lt;class Archive&gt;
Archive & serialize(Archive & ar, unsigned int version){
ar & my_wrapper(a);
ar & my_wrapper(b);
template&lt;class Archive&gt;
Archive &amp; serialize(Archive &amp; ar, unsigned int version){
ar &amp; my_wrapper(a);
ar &amp; my_wrapper(b);
}
};
</code></pre>
@@ -285,7 +379,7 @@ XML format has a nested structure that maps well to the "recursive class member
used by the serialization system. However, XML differs from other formats in that it
requires a name for each data member. Our goal is to add this information to the
class serialization specification while still permiting the the serialization code to be
used with any archive. This is achived by requiring that all data serialized to an XML archive
used with any archive. This is archived by requiring that all data serialized to an XML archive
be serialized as a <a target="detail" href="wrappers.html#nvp">name-value pair</a>.
The first member is the name to be used as the XML tag for the
data item while the second is a reference to the data item itself. Any attempt to serialize data
@@ -293,7 +387,288 @@ not wrapped in a in a <a target="detail" href="wrappers.html#nvp">name-value pai
be trapped at compile time. The system is implemented in such a way that for other archive classes,
just the value portion of the data is serialized. The name portion is discarded during compilation.
So by always using <a target="detail" href="wrappers.html#nvp">name-value pairs</a>, it will
be guarenteed that all data can be serialized to all archive classes with maximum efficiency.
be guaranteed that all data can be serialized to all archive classes with maximum efficiency.
<h3><a name="export">Exporting Class Serialization</a></h3>
<a target="detail" href="traits.html#export">Elsewhere</a> in this manual, we have described
<code style="white-space: normal">BOOST_CLASS_EXPORT</code>.
Export implies two things:
<ul>
<li>Instantiates code which is not otherwise referred to.
<li>Associates an external identifier with the class to be serialized.
The fact that the class isn't explicitly referred to implies this
requirement.
</ul>
In C++, usage of code not explicitly referred to is implemented via
virtual functions. Hence, the need for export is implied by the
usage of a derived class that is manipulated via a pointer or
reference to its base class.
<p>
<code style="white-space: normal">BOOST_CLASS_EXPORT</code> in the same
source module that includes any of the archive class headers will
instantiate code required to serialize polymorphic pointers of
the indicated type to the all those archive classes. If no
archive class headers are included, then no code will be instantiated.
<p>
Note that the implemenation of this functionality requires
that the <code style="white-space: normal">BOOST_CLASS_EXPORT</code>
macro appear <b>after</b> the inclusion of any archive
class headers for which code is to be instantiated.
So, code that uses <code style="white-space: normal">BOOST_CLASS_EXPORT</code>
will look like the following:
<pre><code>
#include &lt;boost/archive/text_oarchive.hpp&gt;
#include &lt;boost/archive/text_oarchive.hpp&gt;
... // other archives
#include "a.hpp" // header declaration for class a
BOOST_CLASS_EXPORT(a)
... // other class headers and exports
</code></pre>
This will be true regardless of whether the code is part
of a stand alone executable, a static library or
a dynamic or shared library.
<p>
Including
<code style="white-space: normal">BOOST_CLASS_EXPORT</code>
in the "a.hpp" header itself as one would do with
other serialization traits will make it difficult
or impossible to follow the rule above regarding
inclusion of archive headers before
<code style="white-space: normal">BOOST_CLASS_EXPORT</code>
is invoked. This can best be addressed by using
<code style="white-space: normal">BOOST_CLASS_EXPORT_KEY</code>
in the header declarations and
<code style="white-space: normal">BOOST_CLASS_EXPORT_IMPLEMENT</code>
in the class definition file.
<p>
This system has certain implications for placing code in static or shared
libraries. Placing <code style="white-space: normal">BOOST_CLASS_EXPORT</code>
in library code will have no effect unless archive class headers are
also included. So when building a library, one should include all headers
for all the archive classes which he anticipates using. Alternatively,
one can include headers for just the
<a href="archive_reference.html#polymorphic">Polymorphic Archives</a>.
<p>
Strictly speaking, export should not be necessary if all pointer serialization
occurs through the most derived class. However, in order to detect
what would be a catastrophic error, the library traps ALL serializations through
a pointer to a polymorphic class which are not exported or otherwise registered.
So, in practice, be prepared to register or export all classes with one
or more virtual functions which are serialized through a pointer.
<p>
Note that the implementation of this functionality depends upon vendor
specific extensions to the C++ language. So, there is no guaranteed portability
of programs which use this facility. However, all C++ compilers which
are tested with boost provide the required extensions. The library
includes the extra declarations required by each of these compilers.
It's reasonable to expect that future C++ compilers will support
these extensions or something equivalent.
<h3><a name="static_libraries">Static Libraries and Serialization</a></h3>
Code for serialization of data types can be saved in libraries
just as it can for the rest of the type implementation.
This works well, and can save a huge amount of compilation time.
<ul>
<li>Only compile serialization definitions in the library.
<li>Explicitly instantiate serialization code for ALL
archive classes you intend to use in the library.
<li>For exported types, only use <code style="white-space: normal">BOOST_CLASS_EXPORT_KEY</code>
in headers.
<li>For exported types, only use <code style="white-space: normal">BOOST_CLASS_EXPORT_IMPLEMENT</code>
in definitions compiled in the library. For any particular type,
there should be only one file which contains
<code style="white-space: normal">BOOST_CLASS_EXPORT_IMPLEMENT</code>
for that type. This ensures that only one copy
of serialization code will exist within the program. It avoids
wasted space and the possibility of having different
versions of the serialization code in the same program.
Including
<code style="white-space: normal">BOOST_CLASS_EXPORT_IMPLEMENT</code>
in multiple files could result in a failure
to link due to duplicated symbols or the throwing
of a runtime exception.
<li> Code for serialization should be only in the library,
<li>Familiarize yourself with the <b>PIMPL</b> idiom.
</ul>
This is illustrated by
<a href = "../example/demo_pimpl.cpp" target="demo_pimpl">
<code style="white-space: normal">demo_pimpl.cpp</code>
</a>,
<a href = "../example/demo_pimpl_A.cpp" target="demo_pimpl">
<code style="white-space: normal">demo_pimpl_A.cpp</code>
</a>
and
<a href = "../example/demo_pimpl_A.hpp" target="demo_pimpl">
<code style="white-space: normal">demo_pimpl_A.hpp</code>
</a>
where implementation of serialization is in a static library
completely separate from the main program.
<h3><a name="dlls">DLLS - Serialization and Runtime Linking</a></h3>
Serialization code can be placed in libraries to be linked at runtime. That is,
code can be placed in DLLS(Windows) Shared Libraries(*nix), or static libraries
as well as the main executable. The best technique is the
same as that described above for libraries. The serialization
library test suite includes the following programs
to illustrate how this works:
<p>
<a href = "../test/test_dll_simple.cpp" target="test_dll_simple">
<code style="white-space: normal">test_dll_simple</code>
</a>,
and
<a href = "../test/dll_a.cpp" target="dll_a">
<code style="white-space: normal">dll_a.cpp</code>
</a>
where implementation of serialization is also completely separate
from the main program but the code is loaded at runtime. In this
example, this code is loaded automatically when the program which
uses it starts up, but it could just as well be loaded and unloaded
with an OS dependent API call.
<p>
Also included are
<a href = "../test/test_dll_exported.cpp" target="test_dll_exported">
<code style="white-space: normal">test_dll_exported.cpp</code>
</a>,
and
<a href = "../test/polymorphic_derived2.cpp" target="polymorphic_derived2">
<code style="white-space: normal">polymorphic_derived2.cpp</code>
</a>
which are similar to the above but include tests of the export
and no_rtti facilities in the context of DLLS.
<p>
For best results, write your code to conform to the following
guidelines:
<ul>
<li>Don't include <code>inline</code> code in classes used in DLLS.
This will generate duplicate code in the DLLS and mainline. This
needlessly duplicates code. Worse, it makes is possible for
different versions of the same code to exist simultaneously. This
type of error turns out to be excruciatingly difficult to debug.
Finally, it opens the possibility that a module being referred to
might be explicitly unloaded which would (hopefully) result in
a runtime error. This is another bug that is not always
reproducible or easy to find. For class member templates use something like
<pre><code>
template&lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned int version);
</code></pre>
in the header, and
<pre><code>
template&lt;class Archive&gt;
void myclass::serialize(Archive &amp; ar, const unsigned int version){
...
}
BOOST_CLASS_EXPORT_IMPLEMENT(my_class)
#include &lt;boost/archive/text_oarchive&gt;
#include &lt;boost/archive/text_iarchive&gt;
template myclass::serialize(boost::archive::text_oarchive &amp; ar, const unsigned int version);
template myclass::serialize(boost::archive::text_iarchive &amp; ar, const unsigned int version);
... // repeat for each archive class to be used.
</code></pre>
in the implementation file. This will result in generation of all code
required in only one place. The library does not detect this type of error for you.
<li>If DLLS are to be loaded and unloaded explicitly (e.g. using <code>dlopen</code> in *nix or
<code>LoadLibrary</code> in Windows). Try to arrange that they are unloaded in the reverse
sequence. This should guarantee that problems are avoided even if the
above guideline hasn't been followed.
</ul>
<h3><a name="plugins">Plugins</a></h3>
In order to implement the library, various facilities for runtime
manipulation of types at runtime were required. These
are <a target="detail" href="extended_type_info.html"><code>extended_type_info</code></a>
for associating classes with external identifying strings (<b>GUID</b>)
and <a target="detail" href="void_cast.html"><code>void_cast</code></a>
for casting between pointers of related types.
To complete the functionality of
<a target="detail" href="extended_type_info.html"><code>extended_type_info</code></a>
the ability to construct and destroy corresponding types has been
added. In order to use this functionality, one must specify
how each type is created. This should be done at the time
a class is exported. So, a more complete example of the code above would be:
<pre><code>
#include &lt;boost/archive/text_oarchive.hpp&gt;
#include &lt;boost/archive/text_oarchive.hpp&gt;
... // other archives
#include "a.hpp" // header declaration for class a
// this class has a default constructor
BOOST_SERIALIZATION_FACTORY_0(a)
// as well as one that takes one integer argument
BOOST_SERIALIZATION_FACTORY_1(a, int)
// specify the GUID for this class
BOOST_CLASS_EXPORT(a)
... // other class headers and exports
</code></pre>
With this in place, one can construct, serialize and destroy a class
about which is known only the <b>GUID</b> and a base class.
<h3><a name="multi_threading">Multi-Threading</a></h3>
The fundamental purpose of serialization would conflict with multiple
threads concurrently writing/reading from/to a single open archive instance.
The library implementation presumes that the application avoids such a situation.
<p>
However, Writing/Reading different archives simultaneously
in different tasks is permitted as each archive instance is (almost)
completely independent from any other archive instance. The only shared
information is some type tables which have been implemented using a
lock-free thread-safe
<a target="detail" href="singleton.html">
<code style="white-space: normal">singleton</code>
</a>
described elsewhere in this documentation.
<p>
This singleton implementation guarantees that all of this shared
information is initialized when the code module which contains
it is loaded. The serialization library takes care to
ensure that these data structures are not subsequently
modified. The only time there could be a problem would
be if code is loaded/unloaded while another task is
serializing data. This could only occur for types whose
serialization is implemented in a dynamically loaded/unloaded DLL
or shared library. So if the following is avoided:
<ul>
<li>Accessing the same archive instance from different tasks.
<li>Loading/Unloading DLLS or shared libraries while any archive
instances are open.
</ul>
The library should be thread safe.
<h3><a name="optimizations">Optimizations</a></h3>
In performance critical applications that serialize large sets of contiguous data of homogeneous
types one wants to avoid the overhead of serializing each element individually, which is
the motivation for the <a href="wrappers.html#arrays"><code>array</code></a>
wrapper.
Serialization functions for data types containing contiguous arrays of homogeneous
types, such as for <code>std::vector</code>, <code>std::valarray</code> or
<code>boost::multiarray</code> should serialize them using an
<a href="wrappers.html#arrays"><code>array</code></a> wrapper to make use of
these optimizations.
Archive types that can provide optimized serialization for contiguous arrays of
homogeneous types should implement these by overloading the serialization of
the <a href="wrappers.html#arrays"><code>array</code></a> wrapper, as is done
for the binary archives.
<h3><a href="exceptions.html">Archive Exceptions</a></h3>
<h3><a href="exception_safety.html">Exception Safety</a></h3>
+5 -5
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - <code style="white-space: normal">state_saver</code></title>
@@ -32,7 +32,7 @@ and resets the object's state at destruction time, undoing any change the object
may have gone through. Here is the interface:
<pre><code>
template<class T>
template&lt;class T&gt;
// T requirements:
// - POD or object semantic (cannot be reference, function, ...)
// - copy constructor
@@ -43,20 +43,20 @@ private:
... // implementation
public:
state_saver(T & object);
state_saver(T &amp; object);
~state_saver();
};
</code></pre>
The complete implementation can be found
<a target="state_saver" href="../../../boost/state_saver.hpp">here</a>
<a target="state_saver" href="../../../boost/serialization/state_saver.hpp">here</a>
The following illustrates how this is expected to be used.
<pre><code>
#include &lt;boost/state_saver.hpp&gt;
void func(A & a)
void func(A &amp; a)
boost::state_saver&lt;A&gt; s(a);
... // alter state of a by calling non-const functions
... // call other functions
+20 -2
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - BOOST_STATIC_WARNING</title>
@@ -25,7 +25,25 @@ http://www.boost.org/LICENSE_1_0.txt)
</tr>
</table>
<hr>
To do.
The header <code>&lt;boost/serialization/static_warning.hpp&gt;</code> supplies a single macro
<code style="white-space: normal">BOOST_STATIC_WARNING(x)</code>, which generates a compile time warning message if
the integral-constant-expression x is not true.
<p>
Note that if the condition is true, then the macro will generate neither
code nor data - and the macro can also be used at either namespace,
class or function scope. When used in a template, the expression x
will be evaluated at the time the template is instantiated; this is
particularly useful for validating template parameters.
<p>
It is intended that the functioning of <code style="white-space: normal">BOOST_STATIC_WARNING(x)</code>
be identical to that of <code style="white-space: normal">BOOST_STATIC_ASSERT(x)</code>
except that rather than resulting in a compilation error, it will result in
a compiler warning. In all other respects it should be the same. So
for more information on using <code style="white-space: normal">BOOST_STATIC_WARNING(x)</code>
consult the documentation for <code style="white-space: normal">BOOST_STATIC_ASSERT(x)</code>
<a href="../../../doc/html/boost_staticassert.html">here</a>.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
Distributed under the Boost Software License, Version 1.0. (See
+4 -4
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - BOOST_STATIC_WARNING</title>
@@ -48,7 +48,7 @@ Usage of BOOST_STRONG_TYPEDEF
addresses this.
<pre></code>
<a target="strong_typedef" href="../../../boost/strong_typedef.hpp">
#include &lt;boost/strong_typedef.hpp&gt;
#include &lt;boost/serialization/strong_typedef.hpp&gt;
</a>
BOOST_STRONG_TYPEDEF(int, a)
@@ -78,7 +78,7 @@ type but still of distinct type.
<h3>Implemenation</h3>
<code style="white-space: normal">BOOST_STRONG_TYPEDEF</code> is a macro
which generates a class named "name" wraps and instance of its
which generates a class named "name" which wraps an instance of its
primitive type and provides appropriate conversion operators in order
to make the new type substitutable for the one that it wraps.
+7
View File
@@ -6,3 +6,10 @@ pre{
MARGIN-LEFT: 0pt;
background-color: #EEEEEE;
}
/*
(C) Copyright 2008 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)
*/
+112
View File
@@ -0,0 +1,112 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 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)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - To Do</title>
</head>
<body link="#0000ff" vlink="#800080">
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary="header">
<tr>
<td valign="top" width="300">
<h3><a href="../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../boost.png" border="0"></a></h3>
</td>
<td valign="top">
<h1 align="center">Serialization</h1>
<h2 align="center">To Do</h2>
</td>
</tr>
</table>
<hr>
<dl class="index">
<dt><a href="#portablebinaryarchives">Portable Binary Archives</a></dt>
<dt><a href="#performancetesting">Performance Testing and Profiling</a></dt>
<dt><a href="#backversioning">Back Versioning</a></dt>
<dt><a href="#nortti">Testing for Environments with No RTTI</a></dt>
<dt><a href="new_case_studies.html">Additional Case Studies</a></dt>
</dl>
These are enhancements that the serialization library needs but have not been done.
Some of these projects, though tricky, are not huge and would be suitable
for someone who has a limited time to spend on them. In particular, they
might be of interest as student projects such as the Google Summer of Code.
<h2><a name="portablebinaryarchives"></a>Portable Binary Archives</h2>
Currently there is a portable binary archive in the examples directory.
It is not regularly submitted to the exhaustive boost testing regimen
but it is tested occasionally and has been used in production code.
<p>
It's missing the following:
<ul>
<li>Addition of portable floating point types. This is not trivial. In addition to
handling floating point types of varying sizes, It requires
handling invalid floating point numbers (NaNs) in a portable manner.
<li>Integration into the Boost testing regimen similar to the other archive classes.
</ul>
<h2><a name="performancetesting"></a>Performance Testing and Profiling</h2>
I've managed to setup performance profiling using the following:
<ul>
<li>current (as I write this) Boost.Build tools.
<li>the gcc compiler.
<li>and a shell script - profile.sh
<li>library_status program from the tools/regression/src directory
</ul>
Invoking profile script produces a
<a href="performance_status.html">table</a>
which shows the results of each test and links to the actual
profile.
<p>
The first thing I did was include some of the serialization library tests.
It became immediately apparent that these tests were totally unsuitable
for performance testing and that new tests needed to be written for this
purpose. These tests would highlight the location of any performance
bottlenecks in the serialization library. Whenever I've subjected my
code in the past to this type of analysis, I've always been surprised
to find bottlenecks in totally unanticipated places and fixing those
has always led to large improvements in performance. I expect that
this project would have a huge impact on the utility of the serialization
library.
<h2><a name="backversioning"></a>Back Versioning</h2>
It has been suggested that a useful feature of the library would be
the ability to create "older versions" of archives. Currently,
the library permits one to make programs that are guaranteed
the ability to load archives with classes of a previous version.
But there is no way to save classes in accordance with a
previous version. At first I dismissed this as a huge project
with small demand. A cursory examination of the code revealed
that this would not be very difficult. It would require some
small changes in code and some additional tests. Also it
would require special treatment in the documentation - perhaps
a case study.
<h2><a name="nortti"></a>Environments without RTTI</h2>
I note that some have commented that this library requires RTTI.
This is not strictly true. The examples and almost all the
tests presume the existence of RTTI. But it should be possible
to use the library without it. The example used for testing is an
<code style="white-space: normal">extended_typeinfo</code>
implemenation which presumes that all classes names have been exported.
So, to make this library compatible for platforms without RTTI,
a set of tests, examples and new manual section would have to be created.
<hr>
<p>Revised 1 November, 2008
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2008.
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)
</i></p>
</body>
</html>
+433 -56
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Class Serialization Traits</title>
@@ -32,10 +32,13 @@ http://www.boost.org/LICENSE_1_0.txt)
<dt><a href="#export">Export Key</a>
<dt><a href="#abstract">Abstract</a>
<dt><a href="#typeinfo">Type Information Implementation</a>
<dt><a href="#wrappers">Wrappers</a>
<dt><a href="#bitwise">Bitwise Serialization</a>
<dt><a href="#templates">Template Serialization Traits</a>
<dt><a href="#compiletime_messages">Compile Time Warnings and Errors</a>
</dl>
Serialization of data depends on the type of the data. For example, for
primitive types such as an <code style="white-space: normal">int</code>, it wouldn't make sense to save
primitive types such as <code style="white-space: normal">int</code>, it wouldn't make sense to save
a version number in the archive. Likewise, for a data type that is never
serialized through a pointer, it would (almost) never make sense to track
the address of objects saved to/loaded from the archive as it will never
@@ -45,7 +48,7 @@ type, the way it is used and specifications of the programmer.
<p>
One can alter the manner in which a particular data type is serialized
by specifying one or more <strong>class serialization traits</strong>.
It is not generally necessary for the programmer to explictly assign
It is not generally necessary for the programmer to explicitly assign
traits to his classes as there are default values for all traits.
If the default values are not appropriate they can be assigned by the programmer.
A template is used to associate a typename with a constant. For example
@@ -178,7 +181,7 @@ Default tracking traits are:
That is, addresses of addresses are not tracked by default.
<li>All current serialization wrappers such as <code style="white-space: normal">boost::serialization::nvp</code>,
<code style="white-space: normal">track_never</code>.
<li>For all other types, <code style="white-space: normal">track_selectivly</code>.
<li>For all other types, <code style="white-space: normal">track_selectively</code>.
That is addresses of serialized objects are tracked if and only if
one or more of the following is true:
<ul>
@@ -193,7 +196,7 @@ Default tracking traits are:
The default behavior is almost always the most convenient one. However,
there a few cases where it would be desirable to override the
default. One case is that of a virtual base class. In a diamond
heritance structure with a virtual base class, object tracking
inheritance structure with a virtual base class, object tracking
will prevent redundant save/load invocations. So here is one
case where it might be convenient to override the default tracking
trait. <i>(Note: in a future version the default will be reimplemented
@@ -201,16 +204,26 @@ to automatically track classes used as virtual bases).</i> This
situation is demonstrated by
<a href="../test/test_diamond.cpp" target="test_diamond_cpp">test_diamond.cpp</a>
included with the library.
<h3><a name="export">Export Key</a></h3>
When serializing a derived class through a base class pointer, it
may be convenient to define an external name by which the
derived class can be identified.
<i>(<a target="detail" href="special.html#derivedpointers">Elsewhere</a>
in this manual, the
serialization of derived classes is addressed in detail.)</i>
When serializing a derived class through a virtual base class pointer,
two issues may arise.
<ul>
<li> The code in the derived class might never be explicitly
referred to. Such code will never be instantiated.
<p>
This is addressed by invoking
<code style="white-space: normal">BOOST_CLASS_EXPORT_IMPLEMENT(T)</code>
in the file which defines (implements) the class T.
This ensures that code for the derived class T will
be explicitly instantiated.
<li> There needs to be some sort of identifier which can
be used to select the code to be invoked when the object
is loaded.
Standard C++ does implement <code style="white-space: normal">typeid()</code> which can be
used to return a unique string for the class. This is not entirely
statisfactory for our purposes for the following reasons:
satisfactory for our purposes for the following reasons:
<ul>
<li>There is no guarantee that the string is the same across platforms.
This would then fail to support portable archives.
@@ -219,43 +232,52 @@ statisfactory for our purposes for the following reasons:
<li>There might be classes locally defined in different code modules
that have the same name.
<li>There might be classes with different names that we want to
consider equivalent for purposes of of serialization.
consider equivalent for purposes of serialization.
</ul>
So the header file
<a href="../../../boost/serialization/export.hpp" target="export_hpp">export.hpp</a>
includes macro definitions to specify the external string used
to identify the class.
<i>(<b>GUID</b> stands for <b>G</b>lobally <b>U</b>nique <b>ID</b>entfier.)</i>
<pre><code>
BOOST_CLASS_EXPORT_GUID(my_class, "my_class_external_identifier")
</code></pre>
<p>
So in the serialization library, this is addressed by invoking
<code style="white-space: normal">BOOST_CLASS_EXPORT_KEY2(my_class, "my_class_external_identifier")</code>
in the header file which declares the class.
In a large majority of applications, the class name works just fine
for the external identifier string so the following short cut is
defined
<pre><code>
BOOST_CLASS_EXPORT(my_class)
</code></pre>
which expands to:
<pre><code>
BOOST_CLASS_EXPORT_GUID(my_class, "my_class")
</code></pre>
If the an external name is required somewhere in the program and none
has been assigned, a static assertion will be invoked.
<h3><a name="abstract">Abstract</a></h3>
When serializing an object through a pointer to its base class
and that base class is abstract (i.e. has at least one virtual function
assigned a value of 0), A compile error will be emitted. This is
addressable in one over several ways:
<ul>
<li>remove the =0 in the base classes so that the base class is no
longer abstract.
<li>implement is_abstract for your compiler. (code written according to
the C++ standard is included with this library. But it is known to fail
on several compilers.
<li>use the macro <code style="white-space: normal">BOOST_IS_ABSTRACT(my_class)</code> to indicate
that the class is an abstract base class. This will cause the compiler
to avoid generating code that causes this error.
defined -
<code style="white-space: normal">BOOST_CLASS_EXPORT_KEY(my_class)</code>.
</ul>
For programs which consist of only one module - that is
programs which do not use DLLS, one can specify
<code style="white-space: normal">BOOST_CLASS_EXPORT(my_class)</code>
or
<code style="white-space: normal">BOOST_CLASS_EXPORT_GUID(my_class, "my_class_external_identifier")</code>
in either the declaration header or definition. These macros
expand to invocation of both of the macros described above.
<i>(<b>GUID</b> stands for <b>G</b>lobally <b>U</b>nique <b>ID</b>entifier.)</i>
<p>
<i>(<a target="detail" href="special.html#export">Elsewhere</a>
in this manual, the serialization of derived classes is addressed in detail.)</i>
<p>
The header file
<a href="../../../boost/serialization/export.hpp" target="export_hpp">export.hpp</a>
contains all macro definitions described here.
The library will throw a runtime exception if
<ul>
<li> A type not explicitly referred to is not exported.
<li> Serialization code for the same type is instantiated
in more than one module (or DLL).
</ul>
<h3><a name="abstract">Abstract</a></h3>
When serializing an object through a pointer to its base class,
the library needs to determine whether or not the base is abstract
(i.e. has at least one virtual function). The library uses the
type trait macro <code style="white-space: normal">BOOST_IS_ABSTRACT(T)</code>
to do this. Not all compilers support this type trait and corresponding
macro. To address this, the macro <code style="white-space: normal">
BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)</code> has been
implemented to permit one to explicitly indicate that a specified
type is in fact abstract. This will guarentee that
<code style="white-space: normal">BOOST_IS_ABSTRACT</code>
will return the correct value for all compilers.
<h3><a name="typeinfo">Type Information Implementation</a></h3>
This last trait is also related to the serialization of objects
through a base class pointer. The implementation of this facility
@@ -296,8 +318,8 @@ target="extended_type_info_rtti_hpp">extended_type_info_no_rtti.hpp</a>.
By invoking the macro:
<pre><code>
BOOST_CLASS_TYPE_INFO(
derived_class,
extended_type_info_no_rtti&lt;base_class&gt;
my_class,
extended_type_info_no_rtti&lt;my_class&gt;
)
</code></pre>
we can assign the type information implementation to each class on a case by
@@ -311,6 +333,72 @@ This is illustrated by the test program
Other implementations are possible and might be necessary for
certain special cases.
<h3><a name="wrappers">Wrappers</a></h3>
Archives need to treat wrappers differently from other types since, for example,
they usually are non-const objects while output archives require that any
serialized object (with the exception of a wrapper) be const.
This header file <a href="../../../boost/serialization/wrapper.hpp">wrapper.hpp</a>
includes the following code:
<pre><code>
namespace boost {
namespace serialization {
template&lt;class T&gt;
struct is_wrapper
: public mpl::false_
{};
} // namespace serialization
} // namespace boost
</code></pre>
For any class <code style="white-space: normal">T</code>, The default definition
of <code style="white-space: normal">boost::serialization::is_wrapper&lt;T&gt;::value</code> is thus false.
If we want to declare that a class <code style="white-space: normal">my_class</code>
is a wrapper we specialize the version template:
<pre><code>
namespace boost {
namespace serialization {
struct is_wrapper&lt;my_class&gt;
: mpl::true_
{};
} // namespace serialization
} // namespace boost
</code></pre>
<p>
To diminish typing and enhance readability, a macro is defined
so that instead of the above, we could write:
<pre><code>
BOOST_CLASS_IS_WRAPPER(my_class)
</code></pre>
which expands to the code above.
<h3><a name="bitwise">Bitwise Serialization</a></h3>
Some simple classes could be serialized just by directly copying all bits
of the class. This is, in particular, the case for POD data types containing
no pointer members, and which are neither versioned nor tracked. Some archives,
such as non-portable binary archives can make us of this information to
substantially speed up serialization.
To indicate the possibility of bitwise serialization the type trait defined
in the header
file <a href="../../../boost/serialization/is_bitwise_serializable.hpp" target="is_bitwise_serializable">is_bitwise_serializable.hpp</a>
is used:
<pre><code>
namespace boost { namespace serialization {
template&lt;class T&gt;
struct is_bitwise_serializable
: public is_arithmetic&lt;T&gt;
{};
} }
</code></pre>
is used, and can be specialized for other classes. The specialization
is made easy by the corresponding macro:
<pre><code>
BOOST_IS_BITWISE_SERIALIZABLE(my_class)
</code></pre>
<h3><a name="templates">Template Serialization Traits</a></h3>
In some instances it might be convenient to assign serialization traits
to a whole group of classes at once. Consider, the name-value pair
@@ -336,10 +424,11 @@ convenience macros, use the original definitions
template&lt;class T&gt;
struct implementation_level&lt;nvp&lt;T&gt; &gt;
{
typedef mpl::int_&lt;object_serializable&gt; type; \
typedef mpl::integral_c_tag tag;
typedef mpl::int_&lt;object_serializable&gt; type;
BOOST_STATIC_CONSTANT(
enum level_type,
value = static_cast&lt;enum level_type&gt;(type::value)
int,
value = implementation_level::type::value
);
};
@@ -347,10 +436,11 @@ struct implementation_level&lt;nvp&lt;T&gt; &gt;
template&lt;class T&gt;
struct tracking_level&lt;nvp&lt;T&gt; &gt;
{
typedef mpl::integral_c_tag tag;
typedef mpl::int_&lt;track_never&gt; type;
BOOST_STATIC_CONSTANT(
enum tracking_type,
value = static_cast&lt;enum tracking_type&gt;(type::value)
int,
value = tracking_level::type::value
);
};
</code></pre>
@@ -380,7 +470,7 @@ struct tracking_level&lt;nvp&lt;T&gt; &gt;
#endif
</code></pre>
This can be problematic when one wants to make his code <strong>and archives</strong>
portable to other platforms. It means the she objects will be serialized differently
portable to other platforms. It means the objects will be serialized differently
depending on the platform used. This implies that objects saved from one platform
won't be loaded properly on another. In other words, archives won't be portable.
<p>
@@ -405,7 +495,8 @@ template&lt;
int Level,
int Tracking,
unsigned int Version = 0,
class ETII = BOOST_SERIALIZATION_DEFAULT_TYPE_INFO(T)
class ETII = BOOST_SERIALIZATION_DEFAULT_TYPE_INFO(T),
class IsWrapper = mpl::false_
&gt;
struct traits
</code></pre>
@@ -418,10 +509,296 @@ and template parameters should be assigned according to the following table:
<tr><td><code>Tracking</code></td><td>tracking level</td><td><code>track_never<br>track_selectivly<br>track_always</code></td><td>none</td></tr>
<tr><td><code>Version</code></td><td><code>class version</td><td>unsigned integer</td><td><code>0</code></td></tr>
<tr><td><code>ETTI</code></td><td><code>type_info</code> implementation</td><td><code>extended_type_info_typeid<br>extended_type_info_no_rtti</code></td><td>default <code>type_info implementation</code></td></tr>
<tr><td><code>IsWrapper</code></td><td><code></code>is the type a wrapper?</td><td><code>mpl::false_<br>mpl::true_</code></td><td><code>mpl::false_</code></td></tr>
</table>
<h3><a name="compiletime_messages">Compile Time Warnings and Errors</a></h3>
Some serialization traits can conflict with other ones. Sometimes these conflicts
will result in erroneous behavior (E.G. creating of archives which could not be read)
and other times they represent a probable misconception on the part of the
library user which could result in surprising behavior. To the extent possible,
these conflicts are detected at compile time and errors (BOOST_STATIC_ASSERT)
or warnings (BOOST_STATIC_WARNING) are generated. They are generated in a
compiler dependent manner which should show a chain of instantiation
to the point where the error/warning is detected. Without this capability,
it would be very hard to track down errors or unexpected behavior in library
usage. Here is a list of the conflicts trapped:
<dl>
<dt><h2><a name="object_level">object_level</a> - error</h2></dt>
<dd>
This error traps attempts to serialize types whose
implementation level is set to non_serializable.
</dd>
<dt><h2><a name="object_versioning">object_versioning</a> - error</h2></dt>
<dd>
It's possible that for efficiency reasons, a type can be
assigned a serialization level which doesn't include type information
in the archive. This would preclude the assignment
of a new version number to the type. This error
traps attempts to assign a version number in this case.
This has to be a user error.
</dd>
<dt><h2><a name="object_tracking">object_tracking</a> - warning</h2></dt>
<dd>
The following code will display a message when compiled:
<code style="white-space: normal"><pre>
T t;
ar &lt;&lt; t;
</pre></code>
unless the tracking_level serialization trait is set to "track_never". The following
will compile without problem:
<code style="white-space: normal"><pre>
const T t
ar &lt;&lt; t;
</pre></code>
Likewise, the following code will trap at compile time:
<code style="white-space: normal"><pre>
T * t;
ar &gt;&gt; t;
</pre></code>
if the tracking_level serialization trait is set to "track_never".
<p>
The following case illustrates the function of this message.
It was originally used as an example in the
mailing list by Peter Dimov.
<code style="white-space: normal"><pre>
class construct_from
{
...
};
void main(){
...
Y y;
construct_from x(y);
ar &lt;&lt; x;
}
</pre></code>
Suppose that the above message is not displayed and the code is used as is.
<ol>
<li>this example compiles and executes fine. No tracking is done because
construct_from has never been serialized through a pointer. Now some time
later, the next programmer(2) comes along and makes an enhancement. He
wants the archive to be sort of a log.
<code style="white-space: normal"><pre>
void main(){
...
Y y;
construct_from x(y);
ar &lt;&lt; x;
...
x.f(); // change x in some way
...
ar &lt;&lt; x
}
</pre></code>
<p>
Again no problem. He gets two different of copies in the archive, each one is different.
That is he gets exactly what he expects and is naturally delighted.
<p>
<li>Now sometime later, a third programmer(3) sees construct_from and says -
oh cool, just what I need. He writes a function in a totally disjoint
module. (The project is so big, he doesn't even realize the existence of
the original usage) and writes something like:
<code style="white-space: normal"><pre>
class K {
shared_ptr &lt;construct_from&gt; z;
template &lt;class Archive&gt;
void serialize(Archive &amp; ar, const unsigned version){
ar &lt;&lt; z;
}
};
</pre></code>
<p>
He builds and runs the program and tests his new functionality. It works
great and he's delighted.
<p>
<li>Things continue smoothly as before. A month goes by and it's
discovered that when loading the archives made in the last month (reading the
log). Things don't work. The second log entry is always the same as the
first. After a series of very long and increasingly acrimonious email exchanges,
it's discovered
that programmer(3) accidentally broke programmer(2)'s code .This is because by
serializing via a pointer, the "log" object is now being tracked. This is because
the default tracking behavior is "track_selectively". This means that class
instances are tracked only if they are serialized through pointers anywhere in
the program. Now multiple saves from the same address result in only the first one
being written to the archive. Subsequent saves only add the address - even though the
data might have been changed. When it comes time to load the data, all instances of the log record show the same data.
In this way, the behavior of a functioning piece of code is changed due the side
effect of a change in an otherwise disjoint module.
Worse yet, the data has been lost and cannot be recovered from the archives.
People are really upset and disappointed with boost (at least the serialization system).
<p>
<li>
After a lot of investigation, it's discovered what the source of the problem is
and class construct_from is marked "track_never" by including:
<code style="white-space: normal"><pre>
BOOST_CLASS_TRACKING(construct_from, track_never)
</pre></code>
<li>Now everything works again. Or - so it seems.
<p>
<li><code style="white-space: normal">shared_ptr&lt;construct_from&gt;</code>
is not going to have a single raw pointer shared amongst the instances. Each loaded
<code style="white-space: normal">shared_ptr&lt;construct_from&gt;</code> is going to
have its own distinct raw pointer. This will break
<code style="white-space: normal">shared_ptr</code> and cause a memory leak. Again,
The cause of this problem is very far removed from the point of discovery. It could
well be that the problem is not even discovered until after the archives are loaded.
Now we not only have a difficult to find and fix program bug, but we have a bunch of
invalid archives and lost data.
</ol>
<p>Now consider what happens when the message is displayed:
<ol>
<p>
<li>Right away, the program traps at
<code style="white-space: normal"><pre>
ar &lt;&lt; x;
</pre></code>
<p>
<li>The programmer curses (another %^&*&* hoop to jump through). He's in a
hurry (and who isn't) and would prefer not to <code style="white-space: normal">const_cast</code>
- because it looks bad. So he'll just make the following change an move on.
<code style="white-space: normal"><pre>
Y y;
const construct_from x(y);
ar &lt;&lt; x;
</pre></code>
<p>
Things work fine and he moves on.
<p>
<li>Now programmer (2) wants to make his change - and again another
annoying const issue;
<code style="white-space: normal"><pre>
Y y;
const construct_from x(y);
...
x.f(); // change x in some way ; compile error f() is not const
...
ar &lt;&lt; x
</pre></code>
<p>
He's mildly annoyed now he tries the following:
<ul>
<li>He considers making f() a const - but presumably that shifts the const
error to somewhere else. And he doesn't want to fiddle with "his" code to
work around a quirk in the serializaition system
<p>
<li>He removes the <code style="white-space: normal">const</code>
from <code style="white-space: normal">const construct_from</code> above - damn now he
gets the trap. If he looks at the comment code where the
<code style="white-space: normal">BOOST_STATIC_ASSERT</code>
occurs, he'll do one of two things
<ol>
<p>
<li>This is just crazy. Its making my life needlessly difficult and flagging
code that is just fine. So I'll fix this with a <code style="white-space: normal">const_cast</code>
and fire off a complaint to the list and maybe they will fix it.
In this case, the story branches off to the previous scenario.
<p>
<li>Oh, this trap is suggesting that the default serialization isn't really
what I want. Of course in this particular program it doesn't matter. But
then the code in the trap can't really evaluate code in other modules (which
might not even be written yet). OK, I'll add the following to my
construct_from.hpp to solve the problem.
<code style="white-space: normal"><pre>
BOOST_CLASS_TRACKING(construct_from, track_never)
</pre></code>
</ol>
</ul>
<p>
<li>Now programmer (3) comes along and make his change. The behavior of the
original (and distant module) remains unchanged because the
<code style="white-space: normal">construct_from</code> trait has been set to
"track_never" so he should always get copies and the log should be what we expect.
<p>
<li>But now he gets another trap - trying to save an object of a
class marked "track_never" through a pointer. So he goes back to
construct_from.hpp and comments out the
<code style="white-space: normal">BOOST_CLASS_TRACKING</code> that
was inserted. Now the second trap is avoided, But damn - the first trap is
popping up again. Eventually, after some code restructuring, the differing
requirements of serializating <code style="white-space: normal">construct_from</code>
are reconciled.
</ol>
Note that in this second scenario
<ul>
<li>all errors are trapped at compile time.
<li>no invalid archives are created.
<li>no data is lost.
<li>no runtime errors occur.
</ul>
It's true that these messages may sometimes flag code that is currently correct and
that this may be annoying to some programmers. However, this example illustrates
my view that these messages are useful and that any such annoyance is a small price to
pay to avoid particularly vexing programming errors.
</dd>
<dt><h2><a name="pointer_level">pointer_level</a> - warning</h2></dt>
<dd>
This trap addresses the following situation when serializing
a pointer:
<ul>
<li>A type doesn't save class information in the
archive. That is, the serialization trait implementation
level &lt;= object_serializable.
<li>Tracking for this type is set to "track selectively"
in this case, indication that an object is tracked is
not stored in the archive itself - see level == object_serializable.
Since class information is not saved in the archive, the existence
or absence of the operation <code style="white-space: normal">ar &lt;&lt; T *</code> anywhere else in the
program is used to infer that an object of this type should be tracked.
<p>
A problem arises when a program which reads an archive
includes the operation <code style="white-space: normal">ar &gt;&gt; T *</code> so that tracking information
will be included in the archive. When a program which
creates the archive doesn't include <code style="white-space: normal">ar &lt;&lt; T</code> it is presumed
that the archive doesn't include tracking information and
the archive will fail to load. Also the reverse situation could
trigger a similar problem.
<p>
Though this situation is unlikely for several reasons,
it is possible - hence this warning.
</ul>
So if your program traps here, consider changing the
tracking or implementation level traits - or not
serializing via a pointer.
</dd>
<dt><h2><a name="pointer_tracking">pointer_tracking</a> - warning</h2></dt>
<dd>
Serializing an object of a type marked "track_never" through a pointer
could result in creating more objects than were saved! There are cases
in which a user might really want to do this so we leave it as a warning.
</dd>
<dt><h2><a name="const_loading">const_loading</a> - error</h2></dt>
<dd>
One cannot load data into a "const" object unless it's a
wrapper around some other non-const object.
</dd>
</dl>
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004 and Matthias Troyer 2006.
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)
</i></p>
+50 -22
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Tutorial</title>
@@ -60,7 +60,7 @@ all the data contained in the class is saved/loaded.
<h3><a name="simplecase">A Very Simple Case</a></h3>
These operators are used inside the <code style="white-space: normal">serialize</code>
function> to save and load class data members.
function to save and load class data members.
<p>
Included in this library is a program called
<a href="../example/demo.cpp" target="demo_cpp">demo.cpp</a> which illustrates how
@@ -107,24 +107,28 @@ public:
int main() {
// create and open a character archive for output
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
// create class instance
const gps_position g(35, 59, 24.567f);
// write class instance to archive
oa &lt;&lt; g;
// close archive
ofs.close();
// save data to archive
{
boost::archive::text_oarchive oa(ofs);
// write class instance to archive
oa &lt;&lt; g;
// archive and stream closed when destructors are called
}
// ... some time later restore the class instance to its orginal state
// create and open an archive for input
std::ifstream ifs("filename", std::ios::binary);
boost::archive::text_iarchive ia(ifs);
// read class state from archive
gps_position newg;
ia &gt;&gt; newg;
// close archive
ifs.close();
{
// create and open an archive for input
std::ifstream ifs("filename");
boost::archive::text_iarchive ia(ifs);
// read class state from archive
ia &gt;&gt; newg;
// archive and stream closed when destructors are called
}
return 0;
}
</code>
@@ -132,7 +136,7 @@ int main() {
<p>For each class to be saved via serialization, there must exist a function to
save all the class members which define the state of the class.
For each class to be loaded via serialization, there must exist a function to
load theese class members in the same sequence as they were saved.
load these class members in the same sequence as they were saved.
In the above example, these functions are generated by the
template member function <code style="white-space: normal">serialize</code>.
@@ -181,7 +185,7 @@ The main application of non-intrusive serialization is to permit serialization
to be implemented for classes without changing the class definition.
In order for this to be possible, the class must expose enough information
to reconstruct the class state. In this example, we presumed that the
class had <code style="white-space: normal">public</code> members - not a common occurence. Only
class had <code style="white-space: normal">public</code> members - not a common occurrence. Only
classes which expose enough information to save and restore the class
state will be serializable without changing the class definition.
<h3><a name="serializablemembers">Serializable Members</a></h3>
@@ -286,7 +290,7 @@ class bus_route
void serialize(Archive &amp; ar, const unsigned int version)
{
int i;
for(i = 0; i &lt 10; ++i)
for(i = 0; i &lt; 10; ++i)
ar &amp; stops[i];
}
public:
@@ -295,7 +299,7 @@ public:
</code>
</pre>
Each member of the array <code style="white-space: normal">stops</code> will be serialized.
But, remember each member is a pointer - so what can this really
But remember each member is a pointer - so what can this really
mean? The whole object of this serialization is to permit
reconstruction of the original data structures at another place
and time. In order to accomplish this with a pointer, it is
@@ -304,6 +308,27 @@ object it points to must be saved. When the member is later
loaded, a new object has to be created and a new pointer has
to be loaded into the class member.
<p>
If the same pointer is serialized more than once, only one instance
is be added to the archive. When read back, no data is read back in.
The only operation that occurs is for the second pointer is set equal to the first
<p>
Note that, in this example, the array consists of polymorphic pointers.
That is, each array element point to one of several possible
kinds of bus stops. So when the pointer is saved, some sort of class
identifier must be saved. When the pointer is loaded, the class
identifier must be read and and instance of the corresponding class
must be constructed. Finally the data can be loaded to newly created
instance of the correct type.
As can be seen in
<a href="../example/demo.cpp" target="demo_cpp">demo.cpp</a>,
serialization of pointers to derived classes through a base
clas pointer may require explicit enumeration of the derived
classes to be serialized. This is referred to as "registration" or "export"
of derived classes. This requirement and the methods of
satisfying it are explained in detail
<a href="serialization.html#derivedpointers">here</a>.
<p>
All this is accomplished automatically by the serialization
library. The above code is all that is necessary to accomplish
the saving and loading of objects accessed through pointers.
@@ -514,8 +539,11 @@ This is described later in the manual.
<dt><a href="../example/demo_xml.cpp" target="demo_xml_cpp">demo_xml.cpp</a>
<dd>This is a variation the original demo which supports xml archives in addition
to the others. The extra wrapping macros are needed to associate a data
item name with the correspoding xml tag. For more information see
to the others. The extra wrapping macro, BOOST_SERIALIZATION_NVP(name), is
needed to associate a data item name with the corresponding xml
tag. It is important that 'name' be a valid xml tag, else it
will be impossible to restore the archive.
For more information see
<a target="detail" href="wrappers.html#nvp">Name-Value Pairs</a>.
<a href="../example/demo_save.xml" target="demo_save_xml">Here</a>
is what an xml archive looks like.
@@ -541,11 +569,11 @@ anywhere in the program - a memory leak.
There are couple of ways of fixing this. One way is to explicitly manage the bus stops.
However, a more robust and transparent is to use
<code style="white-space: normal">shared_ptr</code> rather than raw pointers. Along
with serialization implemenations for the Standard Library, the serialization library
with serialization implementations for the Standard Library, the serialization library
includes implementation of serialization for
<code style="white-space: normal">boost::shared ptr</code>. Given this, it should be
easy to alter any of these examples to eliminate the memory leak. This is left
as an excercise for the reader.
as an exercise for the reader.
<hr>
<p><i>&copy; Copyright <a href="http://www.rrsd.com">Robert Ramey</a> 2002-2004.
+12 -12
View File
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - BOOST_STATIC_WARNING</title>
@@ -29,7 +29,7 @@ http://www.boost.org/LICENSE_1_0.txt)
C++ includes the operator <code style="white-space: normal">dynamic_cast&lt;T&gt;(U * u)</code>
for casting a pointer at runtime between two related types. However, this can only be
used for polymorphic classes. That is, it can only be used with related classes which have at least one virtual function.
Limiting the serializaton of pointers to only such class would diminish the applicability
Limiting the serialization of pointers to only such classes would diminish the applicability
of the library.
<h3>Usage</h3>
@@ -42,11 +42,11 @@ They are declared in the namespace
<dl>
<dt><h4><pre><code>
template&lt;class Derived, class Base&gt;
const void_cast_detail::void_caster &
const void_cast_detail::void_caster &amp;
void_cast_register(
const Derived * derived = NULL,
const Base * base = NULL
)
Derived const * derived = NULL,
Base * const base = NULL
);
</code></pre></h4></dt>
<dd>
This function "registers" a pair of related types. It stores the fact that
@@ -57,8 +57,8 @@ This function "registers" a pair of related types. It stores the fact that
pre-runtime and is available anywhere else in the program.
<li>only adjacent base/derived pairs need be registered. That is,
<pre><code>
void_cast_register<A, B>();
void_cast_register<B, C>();
void_cast_register&lt;A, B&gt;();
void_cast_register&lt;B, C&gt;();
</code></pre>
automatically derives the fact that A can be upcast to C and vice-versa.
</ul>
@@ -67,8 +67,8 @@ This function "registers" a pair of related types. It stores the fact that
<dt><h4><pre><code>
void *
void_upcast(
extended_type_info const & derived_type,
extended_type_info const & base_type,
extended_type_info const &amp; derived_type,
extended_type_info const &amp; base_type,
void * const t
);
</code></pre></h4></dt>
@@ -76,8 +76,8 @@ void_upcast(
<dt><h4><pre><code>
void *
void_downcast(
extended_type_info const & derived_type,
extended_type_info const & base_type,
extended_type_info const &amp; derived_type,
extended_type_info const &amp; base_type,
void * const t
);
</code></pre></h4></dt>
+93 -34
View File
@@ -1,4 +1,4 @@
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
@@ -7,7 +7,7 @@ License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../boost.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Serialization - Serialization Wrappers</title>
@@ -27,7 +27,9 @@ http://www.boost.org/LICENSE_1_0.txt)
<hr>
<dl class="page-index">
<dt><a href="#binaryobjects">Binary Objects</a>
<dt><a href="#arrays">Arrays</a>
<dt><a href="#strong_type"><code style="white-space: normal">BOOST_STRONG_TYPEDEF</code></a>
<dt><a href="#collection_size_type">Collection Sizes</a>
<dt><a href="#nvp">Name-Value Pairs</a>
<dt><a href="#composition">Composition</a>
</dl>
@@ -36,9 +38,12 @@ of some underlying data. This permits an archive class to define special
handling of this type. The library includes several such types for varying
purposes.
<p>
Wrappers need to be treated in a special way by some archives, and hence
the <A href="traits.html#wrappers"><code>is_wrapper</code></a> trait for
these wrapper classes is set to true.
<h3><a name="binaryobjects">Binary Objects</a></h3>
A binary object is just an sequence of bytes stored as raw
A binary object is just a sequence of bytes stored as raw
binary data. This would most likely be used for a large amount
of "light weight" data such as a pixel map or embedded binary file.
The header file
@@ -54,8 +59,47 @@ which will construct a temporary binary object that can be serialized just like
Its default serialization is to use archive class primitives
<code style="white-space: normal">save_binary</code> and <code>load_binary</code>.
Note that it doesn't allocated any storage or create any objects.
Its sole purpose is to pass the data size and address as pair to the archive class.
Its sole purpose is to pass the data size and address as a pair to the archive class.
<h3><a name="arrays">Arrays</a></h3>
An array is a contiguous sequence of homogeneous data types, such as a builtin
C-array, a <code>boost::array&lt;T&gt;</code> or a <code>std::vector&lt;T&gt;</code>.
The purpose of this wrapper is to support archive types (such as binary
archives) that provide optimized serialization for contiguous sequences of
objects of the same type.
The header file
<a href="../../../boost/serialization/array.hpp" target="array_hpp">
array.hpp
</a>
includes the function
<pre><code>
template &lt;T&gt;
boost::serialization::make_array(T* t, std::size_t size);
</code></pre>
which will construct a temporary <code>array</code> object
<pre><code>
template&lt;class T&gt;
class array
{
public:
typedef T value_type;
array(value_type* t, std::size_t s);
value_type* address() const;
std::size_t count() const;
};
</code></pre>
that can be serialized just like any other object.
Its default serialization is to serialize each array element.
Note that it doesn't allocated any storage or create any objects.
Its sole purpose is to pass the data type, size and address to the archive class.
Archive types that can provide optimized implementations for contiguous
arrays of homogeneous data types should overload the serialization of
<code>array</code>.
<h3><a name="strong_type"><code style="white-space: normal">BOOST_STRONG_TYPEDEF</code></h3>
Another example of a serialization wrapper is the
<a href="strong_typedef.html"><code style="white-space: normal">BOOST_STRONG_TYPEDEF</code></a> template.
@@ -67,6 +111,26 @@ as an XML attribute in the form "version=12". In the absence of any specific ov
these types are automatically converted to the underlying integer type so the
special overrides used for XML archives aren't needed for other archives.
<h3><a name="collection_size_type">Collection Sizes</h3>
An example of a strong typedef is the <code>collection_size_type</code> in the
header file
<a href="../../../boost/serialization/collection_size_type.hpp" target="collection_size_type_hpp">
collection_size_type.hpp
</a>. This type should be used for serializing the size of a C++ collection, so
that the archive can pick the best integral representation for the serialization
of collection sizes. This is necessary since, although <code>std::size_t</code>
is guaranteed to be an integral type large enough to represent the size of
a collection on a specific platform, the archive might want to serialize
the size differently than this type. For example, the <code>collection_size_type</code>
might be serialized as a variable length integer in a portable binary archive.
<h3><a name="nvp">Name-Value Pairs</h3>
XML archives present a somewhat special case. XML format has a nested
structure that maps well to the "recursive class member visitor" pattern used
@@ -79,61 +143,56 @@ Our solution is to wrap class members to be serialized in a
<strong>name-value-pair</strong>. This structure is defined in
<a href="../../../boost/serialization/nvp.hpp" target="nvp_hpp">nvp.hpp</a>.
It is just a reference to the data member coupled with a pointer to
to a <code style="white-space: normal">const char *</code> which corresponds to the XML name.
to a <code style="white-space: normal">const char *</code> which
corresponds to the XML name. It implements the default
serialization functions for a name-value pair. This default
action is to just ignore the item name and serialize the
data value in the normal manner. For archive classes that
don't make any special provision for name-value pairs, this
is the action which will be invoked when the name-value pair
is serialized. Hence, wrapping a data value into a name-value
pair will have no effect when used with archives which
make no special provision for this wrapper.
<p>
The xml archive classes contain code similar to:
<pre><code>
// special treatment for name-value pairs.
template&lt;class T&gt;
xml_oarchive & operator&(const boost::serialization::nvp<T> & t)
xml_oarchive &amp; operator&amp;(const boost::serialization::nvp&lt;T&gt; &amp; t)
{
// write an xml start tag
start_tag(t.name());
// serialize the data as usual
*this & t.value();
*this &amp; t.value();
// write an xml end tag
end_tag(t.name());
}
</code></pre>
Archive classes which don't use the name of the data item include
code similar to the following:
<pre><code>
// special treatment for name-value pairs. In a simple
// text archive, just output the value in the normal way.
// the name is not used
template&lt;class IStream, class T&gt;
text_oarchive & operator&(const boost::serialization::nvp<T> & t)
{
*this & t.value();
}
</code></pre>
That is, the name part is ignored and and the value part is serialized
as usual.
<p>
Hence, adding the name of the data item does not in any way affect the usage
of archives which don't use it.
<p>
The most obvious and convient name to assign to as the XML data item name
is - surpise! - the name of the C++ class data member. So our serialization
The most obvious and convenient name to assign to as the XML data item name
is - surprise! - the name of the C++ class data member. So our serialization
code will look like:
<pre><code>
ar & make_nvp("my_variable", my_variable);
ar &amp; make_nvp("my_variable", my_variable);
</code></pre>
To simplify typing and enhance readability a macro is defined so we can write:
<pre><code>
ar & BOOST_SERIALIZATION_NVP(my_variable);
ar &amp; BOOST_SERIALIZATION_NVP(my_variable);
</code></pre>
Similarly there exists a macro definition that permits us to write:
<pre><code>
BOOST_SERIALIZATION_BASE_OBJECT_NVP(my_base_class)
</code></pre>
Note that these macros must be used in the namespace of the class,
and without qualifying the namespace in the argument.
<p>
Included is
<a href="../example/demo_xml.hpp" target="demo_xml_hpp">demo_xml.hpp<a>
which renders it's data members as <strong>name-value-pair</strong>s and
<a href="../example/demo_gps.hpp" target="demo_gps_hpp">demo_gps.hpp<a>
includes NVP wrappers or all data members.
<a href="../example/demo_xml.cpp" target="demo_xml_cpp">demo_xml.cpp<a>
which saves and loads data to an XML archive.
saves and loads data to an XML archive.
<a href="../example/demo_save.xml" target="demo_save_xml">Here</a>
is example of the XML Archive corresponding to our tutorial example.
@@ -141,7 +200,7 @@ is example of the XML Archive corresponding to our tutorial example.
Wrappers should be designed so that they can be composed as necessary.
For example, to pass binary data as a name value pair use:
<pre><code>
ar & make_nvp("named_binary_object", make_binary_object(address, size));
ar &amp; make_nvp("named_binary_object", make_binary_object(address, size));
</code></pre>
</html>
<hr>
-41
View File
@@ -1,41 +0,0 @@
# Boost serialization Library Build Jamfile
# (C) Copyright Robert Ramey 2002-2004.
# Use, modification, and distribution are 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 the library home page.
subproject libs/serialization/example ;
rule demo-bsl-build ( demo-name )
{
exe $(demo-name)
: # sources
$(demo-name).cpp
<lib>../build/boost_serialization
: # requirements
# copy to a path rooted at BOOST_ROOT:
<locate>$(BOOST_ROOT)
<include>$(BOOST_ROOT)
<sysinclude>$(BOOST_ROOT)
<borland><*><cxxflags>-w-8080
<msvc><release><cxxflags>-Gy
<vc7><release><cxxflags>-Gy
<vc-7_0><release><cxxflags>-Gy
<vc-7_1><release><cxxflags>-Gy
: # default build
debug
;
}
demo-bsl-build demo ;
demo-bsl-build demo_auto_ptr ;
demo-bsl-build demo_exception ;
demo-bsl-build demo_fast_archive ;
demo-bsl-build demo_pimpl ;
demo-bsl-build demo_portable_archive ;
demo-bsl-build demo_shared_ptr ;
demo-bsl-build demo_xml ;
demo-bsl-build demo_xml_save ;
demo-bsl-build demo_xml_load ;
+41
View File
@@ -0,0 +1,41 @@
# Boost serialization Library Build Jamfile
# (C) Copyright Robert Ramey 2002-2004.
# Use, modification, and distribution are 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 the library home page.
project libs/serialization/example
: id serialization_example
: requirements <library>../build//boost_serialization
;
import ../util/test :
run-template
run-invoke
run-winvoke
test-bsl-run-no-lib
test-bsl-run
test-bsl-run_archive
test-bsl-run_files
;
test-suite "demo-suite" :
# demos
[ test-bsl-run demo ]
[ test-bsl-run demo_auto_ptr ]
[ test-bsl-run demo_exception ]
[ test-bsl-run demo_fast_archive ]
[ test-bsl-run demo_log : log_archive ]
[ test-bsl-run demo_pimpl : demo_pimpl_A ]
[ test-bsl-run demo_polymorphic : demo_polymorphic_A ]
[ test-bsl-run demo_portable_archive : portable_binary_iarchive portable_binary_oarchive ]
[ test-bsl-run demo_shared_ptr ]
[ test-bsl-run demo_simple_log ]
[ test-bsl-run demo_trivial_archive ]
[ test-bsl-run demo_xml ]
[ test-bsl-run demo_xml_save ]
[ test-bsl-run demo_xml_load : : : <dependency>demo_xml_save ]
;
+20 -18
View File
@@ -7,6 +7,7 @@
// http://www.boost.org/LICENSE_1_0.txt)
#include <cstddef> // NULL
#include <iomanip>
#include <iostream>
#include <fstream>
@@ -20,26 +21,27 @@
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/assume_abstract.hpp>
/////////////////////////////////////////////////////////////
// The intent of this program is to serve as a tutorial for
// users of the serialization package. An attempt has been made
// to illustrate most of the facilities of the package.
// to illustrate most of the facilities of the package.
//
// The intent is to create an example suffciently complete to
// The intent is to create an example sufficiently complete to
// illustrate the usage and utility of the package while
// including a minimum of other code.
// including a minimum of other code.
//
// This illustration models the bus system of a small city.
// This includes, multiple bus stops, bus routes and schedules.
// There are different kinds of stops. Bus stops in general will
// There are different kinds of stops. Bus stops in general
// will appear on multiple routes. A schedule will include
// muliple trips on the same route.
// multiple trips on the same route.
/////////////////////////////////////////////////////////////
// gps coordinate
//
// llustrates serialization for a simple type
// illustrates serialization for a simple type
//
class gps_position
{
@@ -55,7 +57,7 @@ class gps_position
public:
// every serializable class needs a constructor
gps_position(){};
gps_position(int _d, int _m, float _s) :
gps_position(int _d, int _m, float _s) :
degrees(_d), minutes(_m), seconds(_s)
{}
};
@@ -92,7 +94,7 @@ public:
virtual ~bus_stop(){}
};
BOOST_IS_ABSTRACT(bus_stop)
BOOST_SERIALIZATION_ASSUME_ABSTRACT(bus_stop)
std::ostream & operator<<(std::ostream &os, const bus_stop &bs)
{
@@ -145,7 +147,7 @@ class bus_stop_destination : public bus_stop
ar & boost::serialization::base_object<bus_stop>(*this) & name;
}
public:
bus_stop_destination(){}
bus_stop_destination(
const gps_position & _lat, const gps_position & _long, const std::string & _name
@@ -160,7 +162,7 @@ public:
//
// illustrates serialization of STL collection templates.
//
// illustrates serialzation of polymorphic pointer (bus stop *);
// illustrates serialization of polymorphic pointer (bus stop *);
//
// illustrates storage and recovery of shared pointers is correct
// and efficient. That is objects pointed to by more than one
@@ -211,7 +213,7 @@ std::ostream & operator<<(std::ostream &os, const bus_route &br)
// Illustrates serialization of STL objects(pair) in a non-intrusive way.
// See definition of operator<< <pair<F, S> >(ar, pair) and others in
// serialization.hpp
//
//
// illustrates nesting of serializable classes
//
// illustrates use of version number to automatically grandfather older
@@ -231,7 +233,7 @@ public:
if(file_version >= 2)
// read the drivers name
ar & driver;
// all versions have the follwing info
// all versions have the following info
ar & hour & minute;
}
@@ -263,7 +265,7 @@ public:
}
bus_schedule(){}
};
BOOST_CLASS_VERSION(bus_schedule, 2)
BOOST_CLASS_VERSION(bus_schedule::trip_info, 2)
std::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)
{
@@ -297,7 +299,7 @@ restore_schedule(bus_schedule &s, const char * filename)
}
int main(int argc, char *argv[])
{
{
// make the schedule
bus_schedule original_schedule;
@@ -324,7 +326,7 @@ int main(int argc, char *argv[])
"Lincoln Memorial"
);
// make a routes
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
@@ -335,7 +337,7 @@ int main(int argc, char *argv[])
original_schedule.append("bob", 9, 57, &route0);
original_schedule.append("alice", 11, 02, &route0);
// make aother routes
// make another route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
@@ -349,7 +351,7 @@ int main(int argc, char *argv[])
// display the complete schedule
std::cout << "original schedule";
std::cout << original_schedule;
std::string filename(boost::archive::tmpdir());
filename += "/demofile.txt";
@@ -357,7 +359,7 @@ int main(int argc, char *argv[])
save_schedule(original_schedule, filename.c_str());
// ... some time later
// make a new schedule
// make a new schedule
bus_schedule new_schedule;
restore_schedule(new_schedule, filename.c_str());
+8 -8
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_auto_ptr.cpp
// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002-4 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)
@@ -14,7 +14,7 @@
#include <cstdio> // remove, std::autoptr inteface wrong in dinkumware
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
namespace std{
using ::remove;
}
#endif
@@ -25,17 +25,17 @@ namespace std{
#include <boost/serialization/split_free.hpp>
namespace boost {
namespace boost {
namespace serialization {
/////////////////////////////////////////////////////////////
// implement serialization for auto_ptr<T>
// implement serialization for auto_ptr< T >
// note: this must be added to the boost namespace in order to
// be called by the library
template<class Archive, class T>
inline void save(
Archive & ar,
const std::auto_ptr<T> &t,
const std::auto_ptr< T > &t,
const unsigned int file_version
){
// only the raw pointer has to be saved
@@ -47,7 +47,7 @@ inline void save(
template<class Archive, class T>
inline void load(
Archive & ar,
std::auto_ptr<T> &t,
std::auto_ptr< T > &t,
const unsigned int file_version
){
T *pTarget;
@@ -55,7 +55,7 @@ inline void load(
// note that the reset automagically maintains the reference count
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
t.release();
t = std::auto_ptr<T>(pTarget);
t = std::auto_ptr< T >(pTarget);
#else
t.reset(pTarget);
#endif
@@ -66,7 +66,7 @@ inline void load(
template<class Archive, class T>
inline void serialize(
Archive & ar,
std::auto_ptr<T> &t,
std::auto_ptr< T > &t,
const unsigned int file_version
){
boost::serialization::split_free(ar, t, file_version);
+318
View File
@@ -0,0 +1,318 @@
#ifndef BOOST_SERIALIZATION_TEST_A_HPP
#define BOOST_SERIALIZATION_TEST_A_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// A.hpp simple class test
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <cassert>
#include <cstdlib> // for rand()
#include <cmath> // for fabs()
#include <cstddef> // size_t
#include <boost/math/special_functions/next.hpp>
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::rand;
using ::fabs;
using ::size_t;
}
#endif
//#include <boost/test/test_exec_monitor.hpp>
#include <boost/limits.hpp>
#include <boost/cstdint.hpp>
#include <boost/detail/workaround.hpp>
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
#include <boost/archive/dinkumware.hpp>
#endif
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
class A
{
private:
friend class boost::serialization::access;
// note: from an aesthetic perspective, I would much prefer to have this
// defined out of line. Unfortunately, this trips a bug in the VC 6.0
// compiler. So hold our nose and put it her to permit running of tests.
template<class Archive>
void serialize(
Archive &ar,
const unsigned int /* file_version */
){
ar & BOOST_SERIALIZATION_NVP(b);
#ifndef BOOST_NO_INT64_T
ar & BOOST_SERIALIZATION_NVP(f);
ar & BOOST_SERIALIZATION_NVP(g);
#endif
#if BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x551 )
int i;
if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){
i = l;
ar & BOOST_SERIALIZATION_NVP(i);
}
else{
ar & BOOST_SERIALIZATION_NVP(i);
l = i;
}
#else
ar & BOOST_SERIALIZATION_NVP(l);
#endif
ar & BOOST_SERIALIZATION_NVP(m);
ar & BOOST_SERIALIZATION_NVP(n);
ar & BOOST_SERIALIZATION_NVP(o);
ar & BOOST_SERIALIZATION_NVP(p);
ar & BOOST_SERIALIZATION_NVP(q);
#ifndef BOOST_NO_CWCHAR
ar & BOOST_SERIALIZATION_NVP(r);
#endif
ar & BOOST_SERIALIZATION_NVP(c);
ar & BOOST_SERIALIZATION_NVP(s);
ar & BOOST_SERIALIZATION_NVP(t);
ar & BOOST_SERIALIZATION_NVP(u);
ar & BOOST_SERIALIZATION_NVP(v);
ar & BOOST_SERIALIZATION_NVP(w);
ar & BOOST_SERIALIZATION_NVP(x);
ar & BOOST_SERIALIZATION_NVP(y);
#ifndef BOOST_NO_STD_WSTRING
ar & BOOST_SERIALIZATION_NVP(z);
#endif
}
bool b;
#ifndef BOOST_NO_INT64_T
boost::int64_t f;
boost::uint64_t g;
#endif
enum h {
i = 0,
j,
k
} l;
std::size_t m;
signed long n;
unsigned long o;
signed short p;
unsigned short q;
#ifndef BOOST_NO_CWCHAR
wchar_t r;
#endif
char c;
signed char s;
unsigned char t;
signed int u;
unsigned int v;
float w;
double x;
std::string y;
#ifndef BOOST_NO_STD_WSTRING
std::wstring z;
#endif
public:
A();
bool operator==(const A &rhs) const;
bool operator!=(const A &rhs) const;
bool operator<(const A &rhs) const; // used by less
// hash function for class A
operator std::size_t () const;
friend std::ostream & operator<<(std::ostream & os, A const & a);
friend std::istream & operator>>(std::istream & is, A & a);
};
//BOOST_TEST_DONT_PRINT_LOG_VALUE(A);
template<class S>
void randomize(S &x)
{
assert(0 == x.size());
for(;;){
unsigned int i = std::rand() % 27;
if(0 == i)
break;
x += static_cast<BOOST_DEDUCED_TYPENAME S::value_type>('a' - 1 + i);
}
}
template<class T>
void accumulate(std::size_t & s, const T & t){
const char * tptr = (const char *)(& t);
unsigned int count = sizeof(t);
while(count-- > 0){
s += *tptr++;
}
}
A::operator std::size_t () const {
std::size_t retval = 0;
accumulate(retval, b);
#ifndef BOOST_NO_INT64_T
accumulate(retval, f);
accumulate(retval, g);
#endif
accumulate(retval, l);
accumulate(retval, m);
accumulate(retval, n);
accumulate(retval, o);
accumulate(retval, p);
accumulate(retval, q);
#ifndef BOOST_NO_CWCHAR
accumulate(retval, r);
#endif
accumulate(retval, c);
accumulate(retval, s);
accumulate(retval, t);
accumulate(retval, u);
accumulate(retval, v);
return retval;
}
inline A::A() :
b(true),
#ifndef BOOST_NO_INT64_T
f(std::rand() * std::rand()),
g(std::rand() * std::rand()),
#endif
l(static_cast<enum h>(std::rand() % 3)),
m(std::rand()),
n(std::rand()),
o(std::rand()),
p(std::rand()),
q(std::rand()),
#ifndef BOOST_NO_CWCHAR
r(std::rand()),
#endif
c(std::rand()),
s(std::rand()),
t(std::rand()),
u(std::rand()),
v(std::rand()),
w((float)std::rand()),
x((double)std::rand())
{
randomize(y);
#ifndef BOOST_NO_STD_WSTRING
randomize(z);
#endif
}
inline bool A::operator==(const A &rhs) const
{
if(b != rhs.b)
return false;
if(l != rhs.l)
return false;
#ifndef BOOST_NO_INT64_T
if(f != rhs.f)
return false;
if(g != rhs.g)
return false;
#endif
if(m != rhs.m)
return false;
if(n != rhs.n)
return false;
if(o != rhs.o)
return false;
if(p != rhs.p)
return false;
if(q != rhs.q)
return false;
#ifndef BOOST_NO_CWCHAR
if(r != rhs.r)
return false;
#endif
if(c != rhs.c)
return false;
if(s != rhs.s)
return false;
if(t != rhs.t)
return false;
if(u != rhs.u)
return false;
if(v != rhs.v)
return false;
if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)
return false;
if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)
return false;
if(0 != y.compare(rhs.y))
return false;
#ifndef BOOST_NO_STD_WSTRING
if(0 != z.compare(rhs.z))
return false;
#endif
return true;
}
inline bool A::operator!=(const A &rhs) const
{
return ! (*this == rhs);
}
inline bool A::operator<(const A &rhs) const
{
if(b != rhs.b)
return b < rhs.b;
#ifndef BOOST_NO_INT64_T
if(f != rhs.f)
return f < rhs.f;
if(g != rhs.g)
return g < rhs.g;
#endif
if(l != rhs.l )
return l < rhs.l;
if(m != rhs.m )
return m < rhs.m;
if(n != rhs.n )
return n < rhs.n;
if(o != rhs.o )
return o < rhs.o;
if(p != rhs.p )
return p < rhs.p;
if(q != rhs.q )
return q < rhs.q;
#ifndef BOOST_NO_CWCHAR
if(r != rhs.r )
return r < rhs.r;
#endif
if(c != rhs.c )
return c < rhs.c;
if(s != rhs.s )
return s < rhs.s;
if(t != rhs.t )
return t < rhs.t;
if(u != rhs.u )
return u < rhs.u;
if(v != rhs.v )
return v < rhs.v;
if(w != rhs.w )
return w < rhs.w;
if(x != rhs.x )
return x < rhs.x;
int i = y.compare(rhs.y);
if(i != 0 )
return i < 0;
#ifndef BOOST_NO_STD_WSTRING
int j = z.compare(rhs.z);
if(j != 0 )
return j < 0;
#endif
return false;
}
#endif // BOOST_SERIALIZATION_TEST_A_HPP
+317
View File
@@ -0,0 +1,317 @@
#ifndef BOOST_SERIALIZATION_TEST_A_HPP
#define BOOST_SERIALIZATION_TEST_A_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// A.hpp simple class test
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <cassert>
#include <cstdlib> // for rand()
#include <cmath> // for fabs()
#include <cstddef> // size_t
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::rand;
using ::fabs;
using ::size_t;
}
#endif
//#include <boost/test/test_exec_monitor.hpp>
#include <boost/limits.hpp>
#include <boost/cstdint.hpp>
#include <boost/detail/workaround.hpp>
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
#include <boost/archive/dinkumware.hpp>
#endif
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
class A
{
private:
friend class boost::serialization::access;
// note: from an aesthetic perspective, I would much prefer to have this
// defined out of line. Unfortunately, this trips a bug in the VC 6.0
// compiler. So hold our nose and put it her to permit running of tests.
template<class Archive>
void serialize(
Archive &ar,
const unsigned int /* file_version */
){
ar & BOOST_SERIALIZATION_NVP(b);
#ifndef BOOST_NO_INT64_T
ar & BOOST_SERIALIZATION_NVP(f);
ar & BOOST_SERIALIZATION_NVP(g);
#endif
#if BOOST_WORKAROUND(BOOST_BORLANDC, <= 0x551 )
int i;
if(BOOST_DEDUCED_TYPENAME Archive::is_saving::value){
i = l;
ar & BOOST_SERIALIZATION_NVP(i);
}
else{
ar & BOOST_SERIALIZATION_NVP(i);
l = i;
}
#else
ar & BOOST_SERIALIZATION_NVP(l);
#endif
ar & BOOST_SERIALIZATION_NVP(m);
ar & BOOST_SERIALIZATION_NVP(n);
ar & BOOST_SERIALIZATION_NVP(o);
ar & BOOST_SERIALIZATION_NVP(p);
ar & BOOST_SERIALIZATION_NVP(q);
#ifndef BOOST_NO_CWCHAR
ar & BOOST_SERIALIZATION_NVP(r);
#endif
ar & BOOST_SERIALIZATION_NVP(c);
ar & BOOST_SERIALIZATION_NVP(s);
ar & BOOST_SERIALIZATION_NVP(t);
ar & BOOST_SERIALIZATION_NVP(u);
ar & BOOST_SERIALIZATION_NVP(v);
ar & BOOST_SERIALIZATION_NVP(w);
ar & BOOST_SERIALIZATION_NVP(x);
ar & BOOST_SERIALIZATION_NVP(y);
#ifndef BOOST_NO_STD_WSTRING
ar & BOOST_SERIALIZATION_NVP(z);
#endif
}
bool b;
#ifndef BOOST_NO_INT64_T
boost::int64_t f;
boost::uint64_t g;
#endif
enum h {
i = 0,
j,
k
} l;
std::size_t m;
signed long n;
unsigned long o;
signed short p;
unsigned short q;
#ifndef BOOST_NO_CWCHAR
wchar_t r;
#endif
char c;
signed char s;
unsigned char t;
signed int u;
unsigned int v;
float w;
double x;
std::string y;
#ifndef BOOST_NO_STD_WSTRING
std::wstring z;
#endif
public:
A();
bool operator==(const A &rhs) const;
bool operator!=(const A &rhs) const;
bool operator<(const A &rhs) const; // used by less
// hash function for class A
operator std::size_t () const;
friend std::ostream & operator<<(std::ostream & os, A const & a);
friend std::istream & operator>>(std::istream & is, A & a);
};
//BOOST_TEST_DONT_PRINT_LOG_VALUE(A);
template<class S>
void randomize(S &x)
{
assert(0 == x.size());
for(;;){
unsigned int i = std::rand() % 27;
if(0 == i)
break;
x += static_cast<BOOST_DEDUCED_TYPENAME S::value_type>('a' - 1 + i);
}
}
template<class T>
void accumulate(std::size_t & s, const T & t){
const char * tptr = (const char *)(& t);
unsigned int count = sizeof(t);
while(count-- > 0){
s += *tptr++;
}
}
A::operator std::size_t () const {
std::size_t retval = 0;
accumulate(retval, b);
#ifndef BOOST_NO_INT64_T
accumulate(retval, f);
accumulate(retval, g);
#endif
accumulate(retval, l);
accumulate(retval, m);
accumulate(retval, n);
accumulate(retval, o);
accumulate(retval, p);
accumulate(retval, q);
#ifndef BOOST_NO_CWCHAR
accumulate(retval, r);
#endif
accumulate(retval, c);
accumulate(retval, s);
accumulate(retval, t);
accumulate(retval, u);
accumulate(retval, v);
return retval;
}
inline A::A() :
b(true),
#ifndef BOOST_NO_INT64_T
f(std::rand() * std::rand()),
g(std::rand() * std::rand()),
#endif
l(static_cast<enum h>(std::rand() % 3)),
m(std::rand()),
n(std::rand()),
o(std::rand()),
p(std::rand()),
q(std::rand()),
#ifndef BOOST_NO_CWCHAR
r(std::rand()),
#endif
c(std::rand()),
s(std::rand()),
t(std::rand()),
u(std::rand()),
v(std::rand()),
w((float)std::rand()),
x((double)std::rand())
{
randomize(y);
#ifndef BOOST_NO_STD_WSTRING
randomize(z);
#endif
}
inline bool A::operator==(const A &rhs) const
{
if(b != rhs.b)
return false;
if(l != rhs.l)
return false;
#ifndef BOOST_NO_INT64_T
if(f != rhs.f)
return false;
if(g != rhs.g)
return false;
#endif
if(m != rhs.m)
return false;
if(n != rhs.n)
return false;
if(o != rhs.o)
return false;
if(p != rhs.p)
return false;
if(q != rhs.q)
return false;
#ifndef BOOST_NO_CWCHAR
if(r != rhs.r)
return false;
#endif
if(c != rhs.c)
return false;
if(s != rhs.s)
return false;
if(t != rhs.t)
return false;
if(u != rhs.u)
return false;
if(v != rhs.v)
return false;
if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)
return false;
if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)
return false;
if(0 != y.compare(rhs.y))
return false;
#ifndef BOOST_NO_STD_WSTRING
if(0 != z.compare(rhs.z))
return false;
#endif
return true;
}
inline bool A::operator!=(const A &rhs) const
{
return ! (*this == rhs);
}
inline bool A::operator<(const A &rhs) const
{
if(b != rhs.b)
return b < rhs.b;
#ifndef BOOST_NO_INT64_T
if(f != rhs.f)
return f < rhs.f;
if(g != rhs.g)
return g < rhs.g;
#endif
if(l != rhs.l )
return l < rhs.l;
if(m != rhs.m )
return m < rhs.m;
if(n != rhs.n )
return n < rhs.n;
if(o != rhs.o )
return o < rhs.o;
if(p != rhs.p )
return p < rhs.p;
if(q != rhs.q )
return q < rhs.q;
#ifndef BOOST_NO_CWCHAR
if(r != rhs.r )
return r < rhs.r;
#endif
if(c != rhs.c )
return c < rhs.c;
if(s != rhs.s )
return s < rhs.s;
if(t != rhs.t )
return t < rhs.t;
if(u != rhs.u )
return u < rhs.u;
if(v != rhs.v )
return v < rhs.v;
if(w != rhs.w )
return w < rhs.w;
if(x != rhs.x )
return x < rhs.x;
int i = y.compare(rhs.y);
if(i != 0 )
return i < 0;
#ifndef BOOST_NO_STD_WSTRING
int j = z.compare(rhs.z);
if(j != 0 )
return j < 0;
#endif
return false;
}
#endif // BOOST_SERIALIZATION_TEST_A_HPP
+113
View File
@@ -0,0 +1,113 @@
#ifndef BOOST_SERIALIZATION_TEST_B_HPP
#define BOOST_SERIALIZATION_TEST_B_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// B.hpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <cstdlib> // for rand()
#include <boost/math/special_functions/next.hpp>
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::rand;
}
#endif
#include <boost/serialization/version.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/base_object.hpp>
#include "A.hpp"
///////////////////////////////////////////////////////
// Derived class test
class B : public A
{
private:
friend class boost::serialization::access;
template<class Archive>
void save(Archive &ar, const unsigned int /* file_version */) const
{
// write any base class info to the archive
ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
// write out members
ar << BOOST_SERIALIZATION_NVP(s);
ar << BOOST_SERIALIZATION_NVP(t);
ar << BOOST_SERIALIZATION_NVP(u);
ar << BOOST_SERIALIZATION_NVP(v);
ar << BOOST_SERIALIZATION_NVP(w);
ar << BOOST_SERIALIZATION_NVP(x);
}
template<class Archive>
void load(Archive & ar, const unsigned int file_version)
{
// read any base class info to the archive
ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
switch(file_version){
case 1:
case 2:
ar >> BOOST_SERIALIZATION_NVP(s);
ar >> BOOST_SERIALIZATION_NVP(t);
ar >> BOOST_SERIALIZATION_NVP(u);
ar >> BOOST_SERIALIZATION_NVP(v);
ar >> BOOST_SERIALIZATION_NVP(w);
ar >> BOOST_SERIALIZATION_NVP(x);
default:
break;
}
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
signed char s;
unsigned char t;
signed int u;
unsigned int v;
float w;
double x;
public:
B();
virtual ~B(){};
bool operator==(const B &rhs) const;
};
B::B() :
s(std::rand()),
t(std::rand()),
u(std::rand()),
v(std::rand()),
w((float)std::rand() / std::rand()),
x((double)std::rand() / std::rand())
{
}
BOOST_CLASS_VERSION(B, 2)
inline bool B::operator==(const B &rhs) const
{
return
A::operator==(rhs)
&& s == rhs.s
&& t == rhs.t
&& u == rhs.u
&& v == rhs.v
&& std::abs( boost::math::float_distance(w, rhs.w)) < 2
&& std::abs( boost::math::float_distance(x, rhs.x)) < 2
;
}
#endif // BOOST_SERIALIZATION_TEST_B_HPP
+112
View File
@@ -0,0 +1,112 @@
#ifndef BOOST_SERIALIZATION_TEST_B_HPP
#define BOOST_SERIALIZATION_TEST_B_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// B.hpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <cstdlib> // for rand()
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::rand;
}
#endif
#include <boost/serialization/version.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/base_object.hpp>
#include "A.hpp"
///////////////////////////////////////////////////////
// Derived class test
class B : public A
{
private:
friend class boost::serialization::access;
template<class Archive>
void save(Archive &ar, const unsigned int /* file_version */) const
{
// write any base class info to the archive
ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
// write out members
ar << BOOST_SERIALIZATION_NVP(s);
ar << BOOST_SERIALIZATION_NVP(t);
ar << BOOST_SERIALIZATION_NVP(u);
ar << BOOST_SERIALIZATION_NVP(v);
ar << BOOST_SERIALIZATION_NVP(w);
ar << BOOST_SERIALIZATION_NVP(x);
}
template<class Archive>
void load(Archive & ar, const unsigned int file_version)
{
// read any base class info to the archive
ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(A);
switch(file_version){
case 1:
case 2:
ar >> BOOST_SERIALIZATION_NVP(s);
ar >> BOOST_SERIALIZATION_NVP(t);
ar >> BOOST_SERIALIZATION_NVP(u);
ar >> BOOST_SERIALIZATION_NVP(v);
ar >> BOOST_SERIALIZATION_NVP(w);
ar >> BOOST_SERIALIZATION_NVP(x);
default:
break;
}
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
signed char s;
unsigned char t;
signed int u;
unsigned int v;
float w;
double x;
public:
B();
virtual ~B(){};
bool operator==(const B &rhs) const;
};
B::B() :
s(std::rand()),
t(std::rand()),
u(std::rand()),
v(std::rand()),
w((float)std::rand() / std::rand()),
x((double)std::rand() / std::rand())
{
}
BOOST_CLASS_VERSION(B, 2)
inline bool B::operator==(const B &rhs) const
{
return
A::operator==(rhs)
&& s == rhs.s
&& t == rhs.t
&& u == rhs.u
&& v == rhs.v
&& std::abs( boost::math::float_distance(w, rhs.w)) < 2
&& std::abs( boost::math::float_distance(x, rhs.x)) < 2
;
}
#endif // BOOST_SERIALIZATION_TEST_B_HPP
+10 -9
View File
@@ -1,31 +1,32 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_exception.cpp
// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002-4 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)
// Example of safe exception handling for pointer de-serialization
//
// This example was prepared by Robert Ramey to demonstrate and test
//
// This example was prepared by Robert Ramey to demonstrate and test
// safe exception handling during the de-serialization of pointers in
// a non-trivial example.
//
// Hopefully, this addresses exception issues raised by
// Vahan Margaryan who spent considerable time and effort
// in the analysis and testing of issues of exception safety
// in the analysis and testing of issues of exception safety
// of the serialization library.
#include <algorithm>
#include <iostream>
#include <cstddef> // NULL
#include <fstream>
#include <string>
#include <cstdio> // remove
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
namespace std{
using ::remove;
}
#endif
@@ -126,7 +127,7 @@ private:
// case 1:
template<class Archive>
void School::serialize(Archive & ar, const unsigned int /* file_version */){
// if an exeception occurs while loading courses
// if an exception occurs while loading courses
// the structure courses may have some courses each
// with students
ar & all_courses;
@@ -154,7 +155,7 @@ void School::save(Archive & ar, const unsigned int /* file_version */) const {
template<class Archive>
void School::load(Archive & ar, const unsigned int /* file_version */){
// if an exeception occurs while loading courses
// if an exception occurs while loading courses
// the structure courses may have some courses each
// with students
try{
@@ -166,7 +167,7 @@ void School::load(Archive & ar, const unsigned int /* file_version */){
ar >> all_students; // create students that have no courses
}
catch(std::exception){
// elminate any dangling references
// eliminate any dangling references
all_courses.clear();
all_students.clear();
throw;
@@ -213,7 +214,7 @@ void init(School *school){
// carol has no courses
}
void save(School *school, const char *filename){
void save(const School * const school, const char *filename){
std::ofstream ofile(filename);
boost::archive::text_oarchive ar(ofile);
ar << school;
+68 -33
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_fast_binary_archive.cpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
@@ -11,11 +11,11 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_array.hpp>
#include <boost/pfto.hpp>
#define BOOST_ARCHIVE_SOURCE
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive_impl.hpp>
#include <boost/archive/binary_iarchive_impl.hpp>
#include <boost/archive/detail/register_archive.hpp>
// include template definitions for base classes used. Otherwise
// you'll get link failure with undefined symbols
@@ -24,114 +24,149 @@
#include <boost/archive/impl/basic_binary_oarchive.ipp>
#include <boost/archive/impl/basic_binary_iarchive.ipp>
#include <boost/archive/impl/archive_pointer_iserializer.ipp>
#include <boost/archive/impl/archive_pointer_oserializer.ipp>
using namespace boost::archive;
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// "Fast" output binary archive. This is a variation of the native binary
// "Fast" output binary archive. This is a variation of the native binary
class fast_binary_oarchive :
// don't derive from binary_oarchive !!!
public binary_oarchive_impl<fast_binary_oarchive>
public binary_oarchive_impl<
fast_binary_oarchive,
std::ostream::char_type,
std::ostream::traits_type
>
{
typedef fast_binary_oarchive derived_t;
typedef binary_oarchive_impl<
fast_binary_oarchive,
std::ostream::char_type,
std::ostream::traits_type
> base_t;
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#else
friend class boost::archive::detail::interface_oarchive<derived_t>;
friend class basic_binary_oarchive<derived_t>;
friend class basic_binary_oprimitive<derived_t, std::ostream>;
friend class basic_binary_oprimitive<
derived_t,
std::ostream::char_type,
std::ostream::traits_type
>;
friend class boost::archive::save_access;
#endif
// add base class to the places considered when matching
// save function to a specific set of arguments. Note, this didn't
// work on my MSVC 7.0 system
// using binary_oarchive_impl<derived_t>::load_override;
// work on my MSVC 7.0 system using
// binary_oarchive_impl<derived_t>::load_override;
// so we use the sure-fire method below. This failed to work as well
template<class T>
void save_override(T & t, BOOST_PFTO int){
binary_oarchive_impl<fast_binary_oarchive>::save_override(t, 0);
void save_override(T & t){
base_t::save_override(t);
// verify that this program is in fact working by making sure
// that arrays are getting passed here
BOOST_STATIC_ASSERT(! (boost::is_array<T>::value) );
}
template<int N>
void save_override(const int (& t)[N] , int){
void save_override(const int (& t)[N]){
save_binary(t, sizeof(t));
}
template<int N>
void save_override(const unsigned int (& t)[N], int){
void save_override(const unsigned int (& t)[N]){
save_binary(t, sizeof(t));
}
template<int N>
void save_override(const long (& t)[N], int){
void save_override(const long (& t)[N]){
save_binary(t, sizeof(t));
}
template<int N>
void save_override(const unsigned long (& t)[N], int){
void save_override(const unsigned long (& t)[N]){
save_binary(t, sizeof(t));
}
public:
fast_binary_oarchive(std::ostream & os, unsigned flags = 0) :
binary_oarchive_impl<derived_t>(os, flags)
base_t(os, flags)
{}
fast_binary_oarchive(std::streambuf & bsb, unsigned int flags = 0) :
base_t(bsb, flags)
{}
};
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(fast_binary_oarchive)
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// "Fast" input binary archive. This is a variation of the native binary
// "Fast" input binary archive. This is a variation of the native binary
class fast_binary_iarchive :
// don't derive from binary_oarchive !!!
public binary_iarchive_impl<fast_binary_iarchive>
public binary_iarchive_impl<
fast_binary_iarchive,
std::istream::char_type,
std::istream::traits_type
>
{
typedef fast_binary_iarchive derived_t;
typedef binary_iarchive_impl<
fast_binary_iarchive,
std::istream::char_type,
std::istream::traits_type
> base_t;
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#else
friend class boost::archive::detail::interface_iarchive<derived_t>;
friend class basic_binary_iarchive<derived_t>;
friend class basic_binary_iprimitive<derived_t, std::istream>;
friend class basic_binary_iprimitive<
derived_t,
std::ostream::char_type,
std::ostream::traits_type
>;
friend class boost::archive::load_access;
#endif
// add base class to the places considered when matching
// save function to a specific set of arguments. Note, this didn't
// work on my MSVC 7.0 system
// using binary_oarchive_impl<derived_t>::load_override;
// work on my MSVC 7.0 system using
// binary_oarchive_impl<derived_t>::load_override;
// so we use the sure-fire method below. This failed to work as well
template<class T>
void load_override(T & t, BOOST_PFTO int){
binary_iarchive_impl<derived_t>::load_override(t, 0);
void load_override(T & t){
base_t::load_override(t);
BOOST_STATIC_ASSERT(! (boost::is_array<T>::value) );
}
template<int N>
void load_override(int (& t)[N], int){
void load_override(int (& t)[N]){
load_binary(t, sizeof(t));
}
template<int N>
void load_override(unsigned int (& t)[N], int){
void load_override(unsigned int (& t)[N]){
load_binary(t, sizeof(t));
}
template<int N>
void load_override(long (& t)[N], int){
void load_override(long (& t)[N]){
load_binary(t, sizeof(t));
}
template<int N>
void load_override(unsigned long (& t)[N], int){
void load_override(unsigned long (& t)[N]){
load_binary(t, sizeof(t));
}
public:
fast_binary_iarchive(std::istream & is, unsigned flags = 0) :
binary_iarchive_impl<derived_t>(is,flags)
fast_binary_iarchive(std::istream & is, unsigned int flags = 0) :
base_t(is, flags)
{}
fast_binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :
base_t(bsb, flags)
{}
};
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(fast_binary_iarchive)
int main( int argc, char* argv[] )
{
const int a[3] = {1, 2, 3};
int a1[3] = {4, 5, 6};
std::stringstream ss;
{
{
fast_binary_oarchive pboa(ss);
pboa << a;
}
+284
View File
@@ -0,0 +1,284 @@
#ifndef BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP
#define BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
//
// demo_gps.hpp
//
// (C) Copyright 2002-4 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)
#include <iomanip>
#include <iostream>
#include <fstream>
#include <boost/serialization/string.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/utility.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/assume_abstract.hpp>
// This illustration models the bus system of a small city.
// This includes, multiple bus stops, bus routes and schedules.
// There are different kinds of stops. Bus stops in general
// will appear on multiple routes. A schedule will include
// multiple trips on the same route.
/////////////////////////////////////////////////////////////
// gps coordinate
//
// illustrates serialization for a simple type
//
class gps_position
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const gps_position &gp);
int degrees;
int minutes;
float seconds;
template<class Archive>
void serialize(Archive & ar, const unsigned int /* file_version */){
ar & BOOST_SERIALIZATION_NVP(degrees)
& BOOST_SERIALIZATION_NVP(minutes)
& BOOST_SERIALIZATION_NVP(seconds);
}
public:
// every serializable class needs a constructor
gps_position(){};
gps_position(int _d, int _m, float _s) :
degrees(_d), minutes(_m), seconds(_s)
{}
};
std::ostream & operator<<(std::ostream &os, const gps_position &gp)
{
return os << ' ' << gp.degrees << (unsigned char)186 << gp.minutes << '\'' << gp.seconds << '"';
}
/////////////////////////////////////////////////////////////
// One bus stop
//
// illustrates serialization of serializable members
//
class bus_stop
{
friend class boost::serialization::access;
virtual std::string description() const = 0;
gps_position latitude;
gps_position longitude;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(latitude);
ar & BOOST_SERIALIZATION_NVP(longitude);
}
protected:
bus_stop(const gps_position & _lat, const gps_position & _long) :
latitude(_lat), longitude(_long)
{}
public:
bus_stop(){}
friend std::ostream & operator<<(std::ostream &os, const bus_stop &gp);
virtual ~bus_stop(){}
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT(bus_stop)
std::ostream & operator<<(std::ostream &os, const bus_stop &bs)
{
return os << bs.latitude << bs.longitude << ' ' << bs.description();
}
/////////////////////////////////////////////////////////////
// Several kinds of bus stops
//
// illustrates serialization of derived types
//
class bus_stop_corner : public bus_stop
{
friend class boost::serialization::access;
std::string street1;
std::string street2;
virtual std::string description() const
{
return street1 + " and " + street2;
}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
// save/load base class information
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop);
ar & BOOST_SERIALIZATION_NVP(street1);
ar & BOOST_SERIALIZATION_NVP(street2);
}
public:
bus_stop_corner(){}
bus_stop_corner(const gps_position & _lat, const gps_position & _long,
const std::string & _s1, const std::string & _s2
) :
bus_stop(_lat, _long), street1(_s1), street2(_s2)
{
}
};
class bus_stop_destination : public bus_stop
{
friend class boost::serialization::access;
std::string name;
virtual std::string description() const
{
return name;
}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(bus_stop)
& BOOST_SERIALIZATION_NVP(name);
}
public:
bus_stop_destination(){}
bus_stop_destination(
const gps_position & _lat, const gps_position & _long, const std::string & _name
) :
bus_stop(_lat, _long), name(_name)
{
}
};
/////////////////////////////////////////////////////////////
// a bus route is a collection of bus stops
//
// illustrates serialization of STL collection templates.
//
// illustrates serialization of polymorphic pointer (bus stop *);
//
// illustrates storage and recovery of shared pointers is correct
// and efficient. That is objects pointed to by more than one
// pointer are stored only once. In such cases only one such
// object is restored and pointers are restored to point to it
//
class bus_route
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const bus_route &br);
typedef bus_stop * bus_stop_pointer;
std::list<bus_stop_pointer> stops;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
// in this program, these classes are never serialized directly but rather
// through a pointer to the base class bus_stop. So we need a way to be
// sure that the archive contains information about these derived classes.
//ar.template register_type<bus_stop_corner>();
ar.register_type(static_cast<bus_stop_corner *>(NULL));
//ar.template register_type<bus_stop_destination>();
ar.register_type(static_cast<bus_stop_destination *>(NULL));
// serialization of stl collections is already defined
// in the header
ar & BOOST_SERIALIZATION_NVP(stops);
}
public:
bus_route(){}
void append(bus_stop *_bs)
{
stops.insert(stops.end(), _bs);
}
};
std::ostream & operator<<(std::ostream &os, const bus_route &br)
{
std::list<bus_stop *>::const_iterator it;
// note: we're displaying the pointer to permit verification
// that duplicated pointers are properly restored.
for(it = br.stops.begin(); it != br.stops.end(); it++){
os << '\n' << std::hex << "0x" << *it << std::dec << ' ' << **it;
}
return os;
}
/////////////////////////////////////////////////////////////
// a bus schedule is a collection of routes each with a starting time
//
// Illustrates serialization of STL objects(pair) in a non-intrusive way.
// See definition of operator<< <pair<F, S> >(ar, pair)
//
// illustrates nesting of serializable classes
//
// illustrates use of version number to automatically grandfather older
// versions of the same class.
class bus_schedule
{
friend class boost::serialization::access;
friend std::ostream & operator<<(std::ostream &os, const bus_schedule &bs);
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(schedule);
}
// note: this structure was made public. because the friend declarations
// didn't seem to work as expected.
public:
struct trip_info
{
template<class Archive>
void serialize(Archive &ar, const unsigned int file_version)
{
// in versions 2 or later
if(file_version >= 2)
// read the drivers name
ar & BOOST_SERIALIZATION_NVP(driver);
// all versions have the following info
ar & BOOST_SERIALIZATION_NVP(hour)
& BOOST_SERIALIZATION_NVP(minute);
}
// starting time
int hour;
int minute;
// only after system shipped was the driver's name added to the class
std::string driver;
trip_info(){}
trip_info(int _h, int _m, const std::string &_d) :
hour(_h), minute(_m), driver(_d)
{}
~trip_info(){
}
};
// friend std::ostream & operator<<(std::ostream &os, const trip_info &ti);
private:
std::list<std::pair<trip_info, bus_route *> > schedule;
public:
void append(const std::string &_d, int _h, int _m, bus_route *_br)
{
schedule.insert(schedule.end(), std::make_pair(trip_info(_h, _m, _d), _br));
}
bus_schedule(){}
};
BOOST_CLASS_VERSION(bus_schedule::trip_info, 3)
BOOST_CLASS_VERSION(bus_schedule, 2)
std::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)
{
return os << '\n' << ti.hour << ':' << ti.minute << ' ' << ti.driver << ' ';
}
std::ostream & operator<<(std::ostream &os, const bus_schedule &bs)
{
std::list<std::pair<bus_schedule::trip_info, bus_route *> >::const_iterator it;
for(it = bs.schedule.begin(); it != bs.schedule.end(); it++){
os << it->first << *(it->second);
}
return os;
}
#endif // BOOST_SERIALIZATION_EXAMPLE_DEMO_GPS_HPP
+76
View File
@@ -0,0 +1,76 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
//
// demo_log.cpp
//
// (C) Copyright 2009 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)
#include <iostream>
#include <cstdio>
#include "demo_gps.hpp"
#include "log_archive.hpp"
int main(int argc, char *argv[]){
// make the schedule
bus_schedule schedule;
// fill in the data
// make a few stops
bus_stop *bs0 = new bus_stop_corner(
gps_position(34, 135, 52.560f),
gps_position(134, 22, 78.30f),
"24th Street", "10th Avenue"
);
bus_stop *bs1 = new bus_stop_corner(
gps_position(35, 137, 23.456f),
gps_position(133, 35, 54.12f),
"State street", "Cathedral Vista Lane"
);
bus_stop *bs2 = new bus_stop_destination(
gps_position(35, 136, 15.456f),
gps_position(133, 32, 15.300f),
"White House"
);
bus_stop *bs3 = new bus_stop_destination(
gps_position(35, 134, 48.789f),
gps_position(133, 32, 16.230f),
"Lincoln Memorial"
);
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
route0.append(bs2);
// add trips to schedule
schedule.append("bob", 6, 24, &route0);
schedule.append("bob", 9, 57, &route0);
schedule.append("alice", 11, 02, &route0);
// make another route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
route1.append(bs1);
// add trips to schedule
schedule.append("ted", 7, 17, &route1);
schedule.append("ted", 9, 38, &route1);
schedule.append("alice", 11, 47, &route1);
// display the complete schedule
log_archive oa(std::cout);
oa << BOOST_SERIALIZATION_NVP(schedule);
oa << schedule;
delete bs0;
delete bs1;
delete bs2;
delete bs3;
return 0;
}
+1 -1
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_pimpl.cpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
+6 -6
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_pimpl_A.cpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
@@ -31,15 +31,15 @@ template<class Archive>
void A::serialize(Archive & ar, const unsigned int /* file_version */){
ar & pimpl;
}
// without the explicit instantiations below, the program will
// fail to link for lack of instantiantiation of the above function
// without the explicit instantiation below, the program will
// fail to link for lack of instantiation of the above function
// note: the following failed to fix link errors for vc 7.0 !
template void A::serialize<boost::archive::text_iarchive>(
boost::archive::text_iarchive & ar,
boost::archive::text_iarchive & ar,
const unsigned int file_version
);
template void A::serialize<boost::archive::text_oarchive>(
boost::archive::text_oarchive & ar,
boost::archive::text_oarchive & ar,
const unsigned int file_version
);
+1 -1
View File
@@ -4,7 +4,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_pimpl_A.hpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
+5 -5
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_polymorphic.cpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
@@ -26,10 +26,10 @@ int main(int argc, char* argv[])
// test with a text archive
std::stringstream ss;
{
// instantiate archive which inhertis polymorphic interface
// instantiate archive which inherits polymorphic interface
// and the normal text archive implementation
boost::archive::polymorphic_text_oarchive oa(ss);
boost::archive::polymorphic_oarchive & oa_interface = oa;
boost::archive::polymorphic_oarchive & oa_interface = oa;
// we can just just the interface for saving
oa_interface << a;
}
@@ -45,7 +45,7 @@ int main(int argc, char* argv[])
//test with a binary archive
std::stringstream ss;
{
// instantiate archive which inhertis polymorphic interface
// instantiate archive which inherits polymorphic interface
// and the normal binary archive implementation
boost::archive::polymorphic_binary_oarchive oa(ss);
oa << a;
@@ -53,7 +53,7 @@ int main(int argc, char* argv[])
{
// see above
boost::archive::polymorphic_binary_iarchive ia(ss);
boost::archive::polymorphic_iarchive & ia_interface = ia;
boost::archive::polymorphic_iarchive & ia_interface = ia;
// use just the polymorphic interface for loading.
ia_interface >> a1;
}
+13 -14
View File
@@ -1,7 +1,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_polymorphic_A.cpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
@@ -12,16 +12,15 @@
#include "demo_polymorphic_A.hpp"
// now we can define the serialization for class A
void A::serialize(
boost::archive::polymorphic_iarchive & ar,
const unsigned int file_version
){
ar & data;
}
void A::serialize(
boost::archive::polymorphic_oarchive & ar,
const unsigned int file_version
){
ar & data;
}
// explicitly instantiate templates for polymorphic archives
// used by this demo.
template
void A::serialize<boost::archive::polymorphic_iarchive>(
boost::archive::polymorphic_iarchive &,
const unsigned int
);
template
void A::serialize<boost::archive::polymorphic_oarchive>(
boost::archive::polymorphic_oarchive &,
const unsigned int
);
+8 -3
View File
@@ -4,7 +4,7 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// demo_polymorphic_A.hpp
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
// (C) Copyright 2002 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)
@@ -20,8 +20,13 @@ class polymorphic_oarchive;
struct A {
// class a contains a pointer to a "hidden" declaration
void serialize(boost::archive::polymorphic_iarchive & ar, const unsigned int file_version);
void serialize(boost::archive::polymorphic_oarchive & ar, const unsigned int file_version);
template<class Archive>
void serialize(
Archive & ar,
const unsigned int file_version
){
ar & data;
}
int data;
bool operator==(const A & rhs) const {
return data == rhs.data;
+44 -7
View File
@@ -8,6 +8,10 @@
// http://www.boost.org/LICENSE_1_0.txt)
// should pass compilation and execution
// note:: this example can only be built with the static library
// (at least with MSVC - due to conflicts related to import of library
// code and instantiation of templates.
#include <sstream>
#include "portable_binary_oarchive.hpp"
@@ -19,30 +23,38 @@
namespace std{ using ::rand; }
#endif
// the following is required to be sure the "EXPORT" works if it is used
#define CUSTOM_ARCHIVE_TYPES portable_binary_oarchive,portable_binary_iarchive
class A
{
friend class boost::serialization::access;
char c;
A *pa;
int i;
int i2; // special tricky case to check sign extension
unsigned int ui;
long l;
unsigned long ul;
template<class Archive>
void serialize(Archive & ar, const unsigned int /* version */){
ar & i & ui & l & ul ;
ar & c & i & i2 & ui & l & ul ;
}
public:
bool operator==(const A & rhs) const {
return
i == rhs.i && ui == rhs.ui && l == rhs.l && ul == rhs.ul
c == rhs.c
&& i == rhs.i
&& i2 == rhs.i2
&& ui == rhs.ui
&& l == rhs.l
&& ul == rhs.ul
;
}
A() :
c(0xFF & std::rand()),
pa(0),
i(std::rand()),
i2(0x80),
ui(std::rand()),
l(std::rand()),
l(std::rand() * std::rand()),
ul(std::rand())
{}
};
@@ -53,7 +65,7 @@ int main( int /* argc */, char* /* argv */[] )
A a1;
std::stringstream ss;
{
{
portable_binary_oarchive pboa(ss);
pboa << a;
}
@@ -61,6 +73,31 @@ int main( int /* argc */, char* /* argv */[] )
portable_binary_iarchive pbia(ss);
pbia >> a1;
}
if(! (a == a1))
return 1;
ss.clear();
{
portable_binary_oarchive pboa(ss, endian_big);
pboa << a;
}
{
portable_binary_iarchive pbia(ss, endian_big);
pbia >> a1;
}
if(! (a == a1))
return 1;
ss.clear();
{
portable_binary_oarchive pboa(ss, endian_big);
pboa << a;
}
{
portable_binary_iarchive pbia(ss, endian_big);
pbia >> a1;
}
return !(a == a1);
}
+7 -20
View File
@@ -11,13 +11,14 @@
#include <iomanip>
#include <iostream>
#include <cstddef> // NULL
#include <fstream>
#include <string>
#include <cstdio> // remove
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
namespace std{
using ::remove;
}
#endif
@@ -41,8 +42,8 @@ private:
}
public:
static int count;
A::A(){++count;} // default constructor
virtual A::~A(){--count;} // default destructor
A(){++count;} // default constructor
virtual ~A(){--count;} // default destructor
};
BOOST_SERIALIZATION_SHARED_PTR(A)
@@ -60,8 +61,8 @@ private:
}
public:
static int count;
B::B() : A() {};
virtual B::~B() {};
B() : A() {};
virtual ~B() {};
};
BOOST_SERIALIZATION_SHARED_PTR(B)
@@ -81,7 +82,7 @@ void display(boost::shared_ptr<A> &spa, boost::shared_ptr<A> &spa1)
std::cout << "unique element count = " << A::count << std::endl;
}
int main(int argc, char *argv[])
int main(int /* argc */, char * /*argv*/[])
{
std::string filename(boost::archive::tmpdir());
filename += "/testfile";
@@ -133,13 +134,6 @@ int main(int argc, char *argv[])
std::ofstream ofs(filename.c_str());
boost::archive::text_oarchive oa(ofs);
oa.register_type(static_cast<B *>(NULL));
oa.register_type(
static_cast<
boost::detail::sp_counted_base_impl<
B *, boost::checked_deleter<B>
> *
>(NULL)
);
oa << spa;
oa << spa1;
}
@@ -157,13 +151,6 @@ int main(int argc, char *argv[])
// restore the schedule from the archive
ia.register_type(static_cast<B *>(NULL));
ia.register_type(
static_cast<
boost::detail::sp_counted_base_impl<
B *, boost::checked_deleter<B>
> *
>(NULL)
);
ia >> spa;
ia >> spa1;
}
+75
View File
@@ -0,0 +1,75 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
//
// demo_log.cpp
//
// (C) Copyright 2009 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)
#include <iostream>
#include <cstdio>
#include "demo_gps.hpp"
#include "simple_log_archive.hpp"
int main(int argc, char *argv[])
{
// make the schedule
bus_schedule schedule;
// fill in the data
// make a few stops
bus_stop *bs0 = new bus_stop_corner(
gps_position(34, 135, 52.560f),
gps_position(134, 22, 78.30f),
"24th Street", "10th Avenue"
);
bus_stop *bs1 = new bus_stop_corner(
gps_position(35, 137, 23.456f),
gps_position(133, 35, 54.12f),
"State street", "Cathedral Vista Lane"
);
bus_stop *bs2 = new bus_stop_destination(
gps_position(35, 136, 15.456f),
gps_position(133, 32, 15.300f),
"White House"
);
bus_stop *bs3 = new bus_stop_destination(
gps_position(35, 134, 48.789f),
gps_position(133, 32, 16.230f),
"Lincoln Memorial"
);
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
route0.append(bs2);
// add trips to schedule
schedule.append("bob", 6, 24, &route0);
schedule.append("bob", 9, 57, &route0);
schedule.append("alice", 11, 02, &route0);
// make another route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
route1.append(bs1);
// add trips to schedule
schedule.append("ted", 7, 17, &route1);
schedule.append("ted", 9, 38, &route1);
schedule.append("alice", 11, 47, &route1);
// display the complete schedule
simple_log_archive log(std::cout);
log << schedule;
delete bs0;
delete bs1;
delete bs2;
delete bs3;
return 0;
}
+94
View File
@@ -0,0 +1,94 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
//
// demo_trivial_archive.cpp
//
// (C) Copyright 2009 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)
#include <cstddef> // std::size_t
#include <boost/mpl/bool.hpp>
/////////////////////////////////////////////////////////////////////////
// class trivial_oarchive
class trivial_oarchive {
public:
//////////////////////////////////////////////////////////
// public interface used by programs that use the
// serialization library
typedef boost::mpl::bool_<true> is_saving;
typedef boost::mpl::bool_<false> is_loading;
template<class T> void register_type(){}
template<class T> trivial_oarchive & operator<<(const T & t){
return *this;
}
template<class T> trivial_oarchive & operator&(const T & t){
return *this << t;
}
void save_binary(void *address, std::size_t count){};
};
#include "demo_gps.hpp"
int main(int argc, char *argv[])
{
// make the schedule
bus_schedule schedule;
// fill in the data
// make a few stops
bus_stop *bs0 = new bus_stop_corner(
gps_position(34, 135, 52.560f),
gps_position(134, 22, 78.30f),
"24th Street", "10th Avenue"
);
bus_stop *bs1 = new bus_stop_corner(
gps_position(35, 137, 23.456f),
gps_position(133, 35, 54.12f),
"State street", "Cathedral Vista Lane"
);
bus_stop *bs2 = new bus_stop_destination(
gps_position(35, 136, 15.456f),
gps_position(133, 32, 15.300f),
"White House"
);
bus_stop *bs3 = new bus_stop_destination(
gps_position(35, 134, 48.789f),
gps_position(133, 32, 16.230f),
"Lincoln Memorial"
);
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
route0.append(bs2);
// add trips to schedule
schedule.append("bob", 6, 24, &route0);
schedule.append("bob", 9, 57, &route0);
schedule.append("alice", 11, 02, &route0);
// make another route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
route1.append(bs1);
// add trips to schedule
schedule.append("ted", 7, 17, &route1);
schedule.append("ted", 9, 38, &route1);
schedule.append("alice", 11, 47, &route1);
// display the complete schedule
trivial_oarchive ta;
ta << schedule;
delete bs0;
delete bs1;
delete bs2;
delete bs3;
return 0;
}
+7 -7
View File
@@ -15,7 +15,7 @@
#include <cstdio> // remove
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
namespace std{
using ::remove;
}
#endif
@@ -24,7 +24,7 @@ namespace std{
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include "demo_xml.hpp"
#include "demo_gps.hpp"
void save_schedule(const bus_schedule &s, const char * filename){
// make an archive
@@ -47,7 +47,7 @@ restore_schedule(bus_schedule &s, const char * filename)
}
int main(int argc, char *argv[])
{
{
// make the schedule
bus_schedule original_schedule;
@@ -74,7 +74,7 @@ int main(int argc, char *argv[])
"Lincoln Memorial"
);
// make a routes
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
@@ -85,7 +85,7 @@ int main(int argc, char *argv[])
original_schedule.append("bob", 9, 57, &route0);
original_schedule.append("alice", 11, 02, &route0);
// make aother routes
// make another route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
@@ -99,7 +99,7 @@ int main(int argc, char *argv[])
// display the complete schedule
std::cout << "original schedule";
std::cout << original_schedule;
std::string filename(boost::archive::tmpdir());
filename += "/demo.xml";
@@ -107,7 +107,7 @@ int main(int argc, char *argv[])
save_schedule(original_schedule, filename.c_str());
// ... some time later
// make a new schedule
// make a new schedule
bus_schedule new_schedule;
restore_schedule(new_schedule, filename.c_str());
+10 -10
View File
@@ -23,14 +23,14 @@
// This illustration models the bus system of a small city.
// This includes, multiple bus stops, bus routes and schedules.
// There are different kinds of stops. Bus stops in general will
// There are different kinds of stops. Bus stops in general
// will appear on multiple routes. A schedule will include
// muliple trips on the same route.
// multiple trips on the same route.
/////////////////////////////////////////////////////////////
// gps coordinate
//
// llustrates serialization for a simple type
// illustrates serialization for a simple type
//
class gps_position
{
@@ -51,7 +51,7 @@ class gps_position
public:
// every serializable class needs a constructor
gps_position(){};
gps_position(int _d, int _m, float _s) :
gps_position(int _d, int _m, float _s) :
degrees(_d), minutes(_m), seconds(_s)
{}
};
@@ -91,7 +91,7 @@ public:
virtual ~bus_stop(){}
};
BOOST_IS_ABSTRACT(bus_stop);
BOOST_IS_ABSTRACT(bus_stop)
std::ostream & operator<<(std::ostream &os, const bus_stop &bs)
{
@@ -159,7 +159,7 @@ public:
//
// illustrates serialization of STL collection templates.
//
// illustrates serialzation of polymorphic pointer (bus stop *);
// illustrates serialization of polymorphic pointer (bus stop *);
//
// illustrates storage and recovery of shared pointers is correct
// and efficient. That is objects pointed to by more than one
@@ -209,7 +209,7 @@ std::ostream & operator<<(std::ostream &os, const bus_route &br)
//
// Illustrates serialization of STL objects(pair) in a non-intrusive way.
// See definition of operator<< <pair<F, S> >(ar, pair)
//
//
// illustrates nesting of serializable classes
//
// illustrates use of version number to automatically grandfather older
@@ -236,7 +236,7 @@ public:
if(file_version >= 2)
// read the drivers name
ar & BOOST_SERIALIZATION_NVP(driver);
// all versions have the follwing info
// all versions have the following info
ar & BOOST_SERIALIZATION_NVP(hour)
& BOOST_SERIALIZATION_NVP(minute);
}
@@ -265,8 +265,8 @@ public:
bus_schedule(){}
};
BOOST_CLASS_VERSION(bus_schedule::trip_info, 3);
BOOST_CLASS_VERSION(bus_schedule, 2);
BOOST_CLASS_VERSION(bus_schedule::trip_info, 3)
BOOST_CLASS_VERSION(bus_schedule, 2)
std::ostream & operator<<(std::ostream &os, const bus_schedule::trip_info &ti)
{
+2 -2
View File
@@ -13,7 +13,7 @@
#include <boost/archive/xml_iarchive.hpp>
#include "demo_xml.hpp"
#include "demo_gps.hpp"
void
restore_schedule(bus_schedule &s, const char * filename)
@@ -28,7 +28,7 @@ restore_schedule(bus_schedule &s, const char * filename)
}
int main(int argc, char *argv[])
{
{
// make a new schedule
bus_schedule new_schedule;
+5 -5
View File
@@ -13,7 +13,7 @@
#include <boost/archive/xml_oarchive.hpp>
#include "demo_xml.hpp"
#include "demo_gps.hpp"
void save_schedule(const bus_schedule &s, const char * filename){
// make an archive
@@ -24,7 +24,7 @@ void save_schedule(const bus_schedule &s, const char * filename){
}
int main(int argc, char *argv[])
{
{
// make the schedule
bus_schedule original_schedule;
@@ -51,7 +51,7 @@ int main(int argc, char *argv[])
"Lincoln Memorial"
);
// make a routes
// make a route
bus_route route0;
route0.append(bs0);
route0.append(bs1);
@@ -62,7 +62,7 @@ int main(int argc, char *argv[])
original_schedule.append("bob", 9, 57, &route0);
original_schedule.append("alice", 11, 02, &route0);
// make aother routes
// make an other route
bus_route route1;
route1.append(bs3);
route1.append(bs2);
@@ -76,7 +76,7 @@ int main(int argc, char *argv[])
// display the complete schedule
std::cout << "original schedule";
std::cout << original_schedule;
std::string filename(boost::archive::tmpdir());
filename += "/demo_save.xml";
+37
View File
@@ -0,0 +1,37 @@
#include <fstream>
#include <ios>
#include <iostream>
#include <boost/integer_traits.hpp>
#include <boost/archive/binary_iarchive.hpp>
void usage(const char * program_name){
std::cout << "usage:";
std::cout << program_name << " filename" << std::endl;
}
int main(int argc, char *argv[]){
if(argc != 2){
std::cout << "invalid number of arguments" << std::endl;
usage(argv[0]);
return 1;
}
std::filebuf fb;
fb.open(
argv[1],
std::ios_base::binary | std::ios_base::in | std::ios_base::out
);
if(!fb.is_open()){
std::cout << argv[1] << " failed to open" << std::endl;
return 1;
}
boost::archive::binary_iarchive ia(fb);
boost::archive::library_version_type lvt = ia.get_library_version();
if(boost::archive::library_version_type(6) != lvt){
std::cout << "library version not equal to six" << std::endl;
return 1;
}
lvt = boost::archive::library_version_type(7);
fb.pubseekpos(26, std::ios_base::out);
fb.sputn(reinterpret_cast<const char *>(& lvt), sizeof(lvt));
fb.close();
}
+32
View File
@@ -0,0 +1,32 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// log_archive.cpp:
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#if (defined _MSC_VER) && (_MSC_VER == 1200)
# pragma warning (disable : 4786) // too long name, harmless warning
#endif
//#define BOOST_ARCHIVE_SOURCE
#include "log_archive.hpp"
#include <boost/archive/detail/archive_serializer_map.hpp>
// explicitly instantiate for this type of xml stream
#include <boost/archive/impl/archive_serializer_map.ipp>
#include <boost/archive/impl/basic_xml_oarchive.ipp>
#include <boost/archive/impl/xml_oarchive_impl.ipp>
namespace boost {
namespace archive {
template class detail::archive_serializer_map<log_archive>;
template class basic_xml_oarchive<log_archive> ;
template class xml_oarchive_impl<log_archive> ;
} // namespace archive
} // namespace boost
+81
View File
@@ -0,0 +1,81 @@
#ifndef LOG_ARCHIVE_HPP
#define LOG_ARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// log_archive.hpp
// (C) Copyright 2010 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 for updates, documentation, and revision history.
#include <boost/archive/xml_oarchive.hpp>
namespace boost {
namespace archive {
namespace detail {
template<class Archive> class interface_oarchive;
} // namespace detail
} // namespace archive
} // boost
/////////////////////////////////////////////////////////////////////////
// log data to an output stream. This illustrates a simpler implementation
// of text output which is useful for getting a formatted display of
// any serializable class. Intended to be useful as a debugging aid.
class log_archive :
/* protected ? */
public boost::archive::xml_oarchive_impl<log_archive>
{
typedef boost::archive::xml_oarchive_impl<log_archive> base;
// give serialization implementation access to this class
friend class boost::archive::detail::interface_oarchive<log_archive>;
friend class boost::archive::basic_xml_oarchive<log_archive>;
friend class boost::archive::save_access;
/////////////////////////////////////////////////////////////////////
// Override functions defined in basic_xml_oarchive
// Anything not an attribute and not a name-value pair is an
// error and should be trapped here.
template<class T>
void save_override(T & t){
// make it a name-value pair and pass it on.
// this permits this to be used even with data types which
// are not wrapped with the name
base::save_override(boost::serialization::make_nvp(NULL, t));
}
template<class T>
void save_override(const boost::serialization::nvp< T > & t){
// this is here to remove the "const" requirement. Since
// this class is to be used only for output, it's not required.
base::save_override(t);
}
// specific overrides for attributes - not name value pairs so we
// want to trap them before the above "fall through"
// since we don't want to see these in the output - make them no-ops.
void save_override(const boost::archive::object_id_type & t){}
void save_override(const boost::archive::object_reference_type & t){}
void save_override(const boost::archive::version_type & t){}
void save_override(const boost::archive::class_id_type & t){}
void save_override(const boost::archive::class_id_optional_type & t){}
void save_override(const boost::archive::class_id_reference_type & t){}
void save_override(const boost::archive::class_name_type & t){}
void save_override(const boost::archive::tracking_type & t){}
public:
log_archive(std::ostream & os, unsigned int flags = 0) :
boost::archive::xml_oarchive_impl<log_archive>(
os,
flags | boost::archive::no_header
)
{}
};
#endif // LOG_ARCHIVE_HPP
@@ -0,0 +1,34 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// polymorphic_portable_binary_iarchive.cpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <istream>
#define BOOST_ARCHIVE_SOURCE
#include "polymorphic_portable_binary_iarchive.hpp"
// explicitly instantiate for this type of text stream
#include <boost/archive/impl/basic_binary_iarchive.ipp>
#include <boost/archive/impl/archive_pointer_iserializer.ipp>
#include <boost/archive/impl/basic_binary_iprimitive.ipp>
namespace boost {
namespace archive {
template class binary_iarchive_impl<
polymorphic_portable_binary_iarchive,
std::istream::char_type,
std::istream::traits_type
>;
template class detail::archive_pointer_iserializer<
polymorphic_portable_binary_iarchive
> ;
} // namespace archive
} // namespace boost
@@ -0,0 +1,35 @@
#ifndef BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_IARCHIVE_HPP
#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_IARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// polymorphic_portable_binary_iarchive.hpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
#include "portable_binary_iarchive.hpp"
typedef boost::archive::detail::polymorphic_iarchive_dispatch<
portable_binary_iarchive
> polymorphic_portable_binary_iarchive;
#include <boost/version.hpp>
#if BOOST_VERSION > 103401
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(
polymorphic_portable_binary_iarchive
)
#endif
#endif // BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP
@@ -0,0 +1,35 @@
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// polymorphic_portable_binary_oarchive.cpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <ostream>
#define BOOST_ARCHIVE_SOURCE
#include "polymorphic_portable_binary_oarchive.hpp"
// explicitly instantiate for this type of text stream
#include <boost/archive/impl/basic_binary_oarchive.ipp>
#include <boost/archive/impl/archive_pointer_oserializer.ipp>
#include <boost/archive/impl/basic_binary_oprimitive.ipp>
namespace boost {
namespace archive {
// explicitly instantiate for this type of binary stream
template class binary_oarchive_impl<
polymorphic_portable_binary_oarchive,
std::ostream::char_type,
std::ostream::traits_type
>;
template class detail::archive_pointer_oserializer<
polymorphic_portable_binary_oarchive
> ;
} // namespace archive
} // namespace boost
@@ -0,0 +1,34 @@
#ifndef BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP
#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// polymorphic_portable_binary_oarchive.hpp
// (C) Copyright 2002 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 for updates, documentation, and revision history.
#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
#include "portable_binary_oarchive.hpp"
typedef boost::archive::detail::polymorphic_oarchive_dispatch<
portable_binary_oarchive
> polymorphic_portable_binary_oarchive;
#include <boost/version.hpp>
#if BOOST_VERSION > 103401
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(
polymorphic_portable_binary_oarchive
)
#endif
#endif // BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP

Some files were not shown because too many files have changed in this diff Show More