Compare commits

...

798 Commits

Author SHA1 Message Date
Robert Ramey 5b87c83419 Merge branch 'develop' into portable_binary_archive 2017-10-06 21:39:52 -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 14f3f5ea77 added files particular to portable_archive 2016-02-15 10:51:46 -08:00
Robert Ramey e15f94a77e minimal changes to see If I can build and add to test_suite portable_archive.
stick for last of to_utf8
2016-02-15 10:42:42 -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 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
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
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 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 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 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
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 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 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
Troy D. Straszheim 54ee54aac5 Merge cmake files release -> trunk.
[SVN r52866]
2009-05-09 22:57:30 +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
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
Robert Ramey a4984c40a6 remove unused headers from boost directory
[SVN r50645]
2009-01-16 21:15:25 +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 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 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 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
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 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
547 changed files with 31495 additions and 30310 deletions
+72
View File
@@ -0,0 +1,72 @@
# Copyright 2016 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
os:
- linux
- osx
branches:
only:
- master
- develop
install:
- cd ..
- git clone -b $TRAVIS_BRANCH --depth 1 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/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/static_assert
- 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 tools/build
- git submodule update --depth 1
- cp -r $TRAVIS_BUILD_DIR/* libs/serialization
- ./bootstrap.sh
- ./b2 headers
script:
- TOOLSET=gcc,clang
- if [ $TRAVIS_OS_NAME == osx ]; then TOOLSET=clang; fi
- ./b2 libs/serialization/test toolset=$TOOLSET
notifications:
email:
on_success: always
+434
View File
@@ -0,0 +1,434 @@
# CMake build control file for Serialization Library tests
cmake_minimum_required(VERSION 3.0)
if (POLICY CMP0054)
cmake_policy (SET CMP0054 NEW)
endif (POLICY CMP0054)
if (POLICY CMP0063)
cmake_policy (SET CMP0063 NEW)
endif (POLICY CMP0063)
if(Boost_USE_STATIC_LIBS)
project("Serialization-Static")
else()
project("Serialization-Shared")
endif()
#
# Compiler settings
#
message(STATUS "compiler is ${CMAKE_CXX_COMPILER_ID}" )
add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})
if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
add_definitions( -ftemplate-depth=300 )
# we use gcc to test for C++03 compatibility
add_definitions( -std=c++03 )
message(STATUS "compiler is g++ c++03")
set(COMPILER_SUPPORTS_CXX11 FALSE)
elseif( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
add_definitions( /wd4996 )
message(STATUS "compiler is MSVC")
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 "${CMAKE_CXX_FLAGS} -std=c++98")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
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()
#
# IDE settings
#
if( CMAKE_HOST_APPLE )
# note: it seems that bjam builds both address models in any case
# so we can defer this decision to the IDE just as we do for debug/release
# so we'll not use this now
# set(Boost_ADDRESS_MODEL 64 CACHE INTEGER "32/64 bits")
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "Link to Boost static libraries")
set(Boost_USE_MULTITHREADED ON)
else()
set(Boost_ADDRESS_MODEL 64 CACHE INTEGER "32/64 bits")
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "Link to Boost static libraries")
set(Boost_USE_MULTITHREADED ON)
endif()
#
# Locate Project Prerequisites
#
# Boost
# note: we're assuming that boost has been built with:
# ./b2 —-layout=versioned toolset=clang-darwin link=static,shared variant=debug,release stage
###########################
# special notes for Xcode.
# these three should result in CMake setting the variables
# Boost_SERIALIZATION_LIBRARY_DEBUG … to the correct values.
# But my current version of CMake doesn't automatically set the library names
# to point to the the libraries to be used. The variables are created
# but they are not initialized. So be prepared to set these variables by hand.
# If you want to use the static libraries - point to the boost libraries ending
# in ".a". If you want to use the shared boost libraries - point to the libraries
# ending in ".dylib".
# But wait - there's more.
# if both lib.a and lib.dylib both exist in the library directory, Xcode will
# automatically chose the *.dylib one - and there's nothing you can do to fix this.
# So my recommendation is
# a) to place the compiled libraries in two different directories
# - e.g. stage/lib-static/*.a and stage/lib-shared/*.dylib
# and set the CMake variable Boost_LIBRARY_DIR to point to one or the other
# b) create two different CMake build directories - build-static and build-shared
# and switch between projects as desired. I like to test both since
# there are things like dead code elimination and visibility which vary
# between the two environments.
#
# caveat - as I write this, I've been unable to get the tests on the shared
# library to function. Problem is that one needs to either put the shared
# libraries in a special known place or set an environmental
# variable which points to the shared library directory. I prefer the latter
# but I've been unable to figure out how to get Xcode to do on a global basis
# and it's not practical to do this for 247 test targets one at a time.
# c) The targets in the project will by default be built as universal 32/64 binaries
# I have yet to experiment with these yet so I just set the target to 64 bit.
# end special note for Xcode
############################
set(Boost_DEBUG true)
set(Boost_DETAILED_FAILURE_MSG true)
set(Boost_FOUND true)
find_package(Boost REQUIRED COMPONENTS system filesystem program_options)
include(CheckIncludeFileCXX)
message(STATUS "Boost_FOUND is ${Boost_FOUND}")
if(Boost_FOUND)
message(STATUS "Boost Found!")
message(STATUS "Boost is ${BOOST_ROOT}")
message(STATUS "Boost directories found at ${Boost_INCLUDE_DIRS}")
message(STATUS "Boost libraries found at ${Boost_LIBRARY_DIRS}")
message(STATUS "Boost libraries prefix is ${Boost_LIB_PREFIX}")
message(STATUS "Boost component libraries to be linked are ${Boost_LIBRARIES}")
message(STATUS "Boost version found is ${Boost_VERSION}")
#include_directories("../include" "${Boost_INCLUDE_DIRS}")
#link_directories("${Boost_LIBRARY_DIRS}")
else()
message(STATUS "Boost NOT Found!")
endif()
if(Boost_USE_STATIC_LIBS)
message(STATUS "Use static libraries")
set(LINK_TYPE "STATIC")
else()
message(STATUS "Building shared libraries")
set(LINK_TYPE "SHARED")
add_definitions( "-DBOOST_ALL_DYN_LINK=1")
add_definitions( "-DBOOST_ALL_NO_LIB=1")
add_definitions( "-DBOOST_LIB_DIAGNOSTICS=1")
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(VISIBILITY_INLINES_HIDDEN)
endif()
###########################
# library builds
add_library(serialization ${LINK_TYPE}
../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_no_rtti.cpp
../src/extended_type_info_typeid.cpp
../src/extended_type_info.cpp
../src/polymorphic_iarchive.cpp
../src/polymorphic_oarchive.cpp
../src/singleton.cpp
../src/stl_port.cpp
../src/text_iarchive.cpp
../src/text_oarchive.cpp
../src/void_cast.cpp
../src/xml_archive_exception.cpp
../src/xml_iarchive.cpp
../src/xml_oarchive.cpp
../src/xml_grammar.cpp
../src/utf8_codecvt_facet.cpp
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
)
add_library(wserialization ${LINK_TYPE}
../src/codecvt_null.cpp
../src/basic_text_wiprimitive.cpp
../src/basic_text_woprimitive.cpp
../src/text_wiarchive.cpp
../src/text_woarchive.cpp
../src/xml_wiarchive.cpp
../src/xml_woarchive.cpp
../src/xml_wgrammar.cpp
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
)
# 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_link_libraries(${test_name} serialization wserialization ${Boost_LIBRARIES})
add_test( ${test_name} ${test_name} )
endfunction(serialization_test)
function(archive_test test_name)
set(arglist)
foreach(a IN ITEMS ${ARGN} )
set(arglist ${arglist} ../test/${a}.cpp)
endforeach()
foreach(
archive-name
IN ITEMS portable_archive
# text_archive text_warchive binary_archive xml_archive xml_warchive
)
set(amended_test_name ${test_name}_${archive-name})
message(STATUS ${amended_test_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_link_libraries(${amended_test_name} serialization wserialization ${Boost_LIBRARIES})
add_test(${amended_test_name} ${amended_test_name})
endforeach()
endfunction(archive_test)
function(polymorphic_archive_test test_name)
set(arglist)
foreach(a IN ITEMS ${ARGN} )
set(arglist ${arglist} ../test/${a}.cpp)
endforeach()
foreach(
archive-name
IN ITEMS portable_archive
# text_archive text_warchive binary_archive xml_archive xml_warchive
)
set(amended_test_name ${test_name}_polymorphic_${archive-name})
message(STATUS ${amended_test_name})
add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})
set_property(
TARGET ${amended_test_name}
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=polymorphic_${archive-name}.hpp
)
target_link_libraries(${amended_test_name} serialization wserialization ${Boost_LIBRARIES})
add_test(${amended_test_name} ${amended_test_name})
endforeach()
endfunction(polymorphic_archive_test)
enable_testing()
# serialization(test_dll_exported dll_polymorphic_derived2_lib)
# serialization(test_dll_simple dll_a_lib)
# 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)
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_smart_cast)
serialization_test(test_codecvt_null ../src/codecvt_null)
serialization_test(test_strong_typedef)
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)
archive_test(test_exported polymorphic_base)
archive_test(test_forward_list A)
archive_test(test_forward_list_ptrs A)
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)
archive_test(test_map_boost_unordered A)
archive_test(test_mi)
archive_test(test_multiple_ptrs A)
archive_test(test_multiple_inheritance)
archive_test(test_no_rtti polymorphic_base polymorphic_derived1)
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_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)
else()
message(STATUS "slist header NOT found")
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)
archive_test(test_set A)
archive_test(test_set_boost_unordered A)
if(COMPILER_SUPPORTS_CXX11)
archive_test(test_set_unordered A)
else()
CHECK_INCLUDE_FILE_CXX(hash_set HASH_SET_FOUND)
if(HASH_SET_FOUND)
archive_test(test_set_hashed A)
endif()
endif()
if(COMPILER_SUPPORTS_CXX11)
archive_test(test_map_unordered A)
else()
CHECK_INCLUDE_FILE_CXX(hash_map HASH_MAP_FOUND)
if(HASH_MAP_FOUND)
archive_test(test_map_hashed A)
endif()
endif()
polymorphic_archive_test(test_polymorphic test_polymorphic_A A)
polymorphic_archive_test(test_polymorphic2 test_polymorphic2imp)
polymorphic_archive_test(test_polymorphic_helper)
# end test targets
####################
####################
# add headers in IDE
# for serialisation
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
#####################
+67
View File
@@ -0,0 +1,67 @@
# 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
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/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/static_assert
- 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 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 toolset=gcc link=static,shared
+19 -4
View File
@@ -80,7 +80,9 @@ SOURCES =
xml_iarchive
xml_oarchive
xml_archive_exception
shared_ptr_helper
codecvt_null
utf8_codecvt_facet
singleton
;
WSOURCES =
@@ -88,18 +90,22 @@ WSOURCES =
basic_text_woprimitive
text_wiarchive
text_woarchive
utf8_codecvt_facet
xml_wgrammar
xml_wiarchive
xml_woarchive
codecvt_null
;
lib boost_serialization
: $(SOURCES).cpp
:
<toolset>msvc:<cxxflags>/Gy
<toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
<toolset>clang:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>gcc:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>darwin:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>gcc:<cxxflags>"-ftemplate-depth-255"
<toolset>clang:<cxxflags>"-ftemplate-depth-255"
<toolset>darwin:<cxxflags>"-ftemplate-depth-255"
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
;
@@ -107,6 +113,15 @@ lib boost_wserialization
: $(WSOURCES).cpp boost_serialization
:
<toolset>msvc:<cxxflags>/Gy
<toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
<toolset>clang:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>gcc:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>darwin:<cxxflags>"-fvisibility=hidden -fvisibility-inlines-hidden"
<toolset>gcc:<cxxflags>"-ftemplate-depth-255"
<toolset>clang:<cxxflags>"-ftemplate-depth-255"
<toolset>darwin:<cxxflags>"-ftemplate-depth-255"
# 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
;
+6 -3
View File
@@ -27,6 +27,8 @@ http://www.boost.org/LICENSE_1_0.txt)
</table>
<hr>
<ul>
<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
@@ -42,10 +44,10 @@ http://www.boost.org/LICENSE_1_0.txt)
<li>Tonko Juricic helped refine and complete project files for VC 7.1 ide
<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="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
@@ -74,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.
+111 -90
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>
<!--
(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)
@@ -26,85 +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
class must implement 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 one way one
can implement his own archive class.
Our discussion will focus on archives used for saving as the hierarchy is exactly analogous
for archives used for loading data.
Our discussion will focus on archives used for loading as the hierarchy is exactly analogous
for archives used for saving data.
<h4>Minimum Requirments</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 & operator&lt;&lt;(const T & t){
return *this;
}
template&lt;class T&gt; trivial_oarchive & operator&(const T & 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>
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 in to a tree of classes in order to minimize
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>.
Any class which fullfills the following requirements will function as
a loading archive.
<h4>Minimum Requirments</h4>
The archive class is derived from:
<pre><code>
template&lt;class Archive&gt;
detail::common_iarchive;
</code></pre>
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 declared:
<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 explicit declarations
for all primitive 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 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:
//////////////////////////////////////////////////////////
@@ -112,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
@@ -153,30 +160,30 @@ by XML archive to inject "&lt;/name&gt;" after data.
<dd>
<strong>Default</strong>:Does nothing.<br>
<strong>Purpose</strong>:Called <strong>each time</strong> user data is saved.
It's 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
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 & 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 & 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.
The second argument must be part of the function signature even though 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>.
@@ -188,14 +195,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 & 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 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>
@@ -207,7 +214,7 @@ used internally by the serialization library:
</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
@@ -235,7 +242,7 @@ One or more of the following issues may need to be addressed:
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
<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.
@@ -274,7 +281,7 @@ exception.
Exhaustive testing of the library requires testing the different aspects of object
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 don't support wide charactor i/o).
(3 in systems that don't support wide charactor i/o).
<p>
In addition, there are 28 other tests which aren't related to any particular archive class.
<p>
@@ -347,7 +354,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.
@@ -364,7 +371,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.
@@ -376,12 +383,13 @@ interface and the standard template driven implementation. This composition is
accomplished by the templates
<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_route_hpp href="../../../boost/archive/detail/polymorphic_oarchive_route.hpp"><code style="white-space: normal">polymorphic_oarchive_route.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
@@ -392,16 +400,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 polymophic 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 polymorhic
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.
+35 -9
View File
@@ -29,13 +29,13 @@
<h4>Notation</h4>
In the following descriptions
<ul>
<li><code>SA</code> is an type modeling the <a href="#saving_interface">Saving Archive Concept</a>
<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 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>.
<li><code>u,v</code> is a pointer to a an instance of type T
<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>
<h4><a name="saving_interface">Saving Archive Concept</a></h4>
@@ -102,7 +102,7 @@ way the data are rendered <a href="serialization.html">serializable</a>.
For more information, see <a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
</dd>
<dt><h4><code>
sa.library_version()
sa.get_library_version()
</code></h4></dt>
<dd>
Returns an unsigned integer containing the current version number of the serialization
@@ -112,6 +112,14 @@ way the data are rendered <a href="serialization.html">serializable</a>.
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 Archive Concept</a></h4>
@@ -172,7 +180,7 @@ equivalent to the original.
For more information, see <a target="detail" href="implementation.html#tempatesyntax">Template Invocation syntax</a>
</dd>
<dt><h4><code>
la.library_version()
la.get_library_version()
</code></h4></dt>
<dd>
Returns an unsigned integer containing the version number of the serialization
@@ -182,6 +190,24 @@ equivalent to the original.
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>
@@ -266,7 +292,7 @@ included in the code module containing the serialization code.
</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.
@@ -379,7 +405,7 @@ above.
</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>
+4 -3
View File
@@ -36,6 +36,7 @@ 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>
@@ -45,13 +46,13 @@ http://www.boost.org/LICENSE_1_0.txt)
<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.
+36 -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">
<!--
(C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
Use, modification and distribution is subject to the Boost Software
@@ -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">-></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">-></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">-></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">-></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">-></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">-></a>
| / |
| / |
| / |
<font color="blue">text_iarchive_impl&lt;text_iarchive&gt;</font> <a href="../../../boost/archive/text_iarchive.hpp">-></a> polymorphic_iarchive_impl <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">-></a> polymorphic_oarchive_impl <a href="../../../boost/archive/polymorphic_oarchive.hpp">-></a>
| \ |
| \ |
| \_____________________________________ <font color="red">polymorphic_iarchive</font> <a href="../../../boost/archive/polymorphic_iarchive.hpp">-></a>
| \_____________________________________ <font color="red">polymorphic_oarchive</font> <a href="../../../boost/archive/polymorphic_oarchive.hpp">-></a>
| \ /
| \ /
| \ /
<font color="red">text_iarchive</font> <a href="../../../boost/archive/text_iarchive.hpp">-></a> polymorphic_iarchive_route&lt;text_iarchive_impl&lt;text_iarchive&gt; &gt; <a href="../../../boost/archive/detail/polymorphic_iarchive_route.hpp">-></a>
<font color="red">text_oarchive</font> <a href="../../../boost/archive/text_oarchive.hpp">-></a> polymorphic_oarchive_route&lt;text_oarchive_impl&lt;text_oarchive&gt; &gt; <a href="../../../boost/archive/detail/polymorphic_oarchive_route.hpp">-></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">-></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 similar for saving and for
This diagram shows the relationship between the various classes that implement saving (output
serialization) for text archives. The hierachy 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
implement saving for a given archive type. (in this case its text archives).
Users include classes in <font color="red">red</font> to save their data from a partcular
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 &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_route.hpp">polymorphic_iarchive_route&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
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_iarchive_impl.
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_route&lt;text_iarchive_impl&lt;text_iarchive&gt; &gt;</code>
<code style="white-space: normal">polymorphic_oarchive_route&lt;text_oarchive_impl&'t;text_oarchive&gt; &gt;</code>
</dl>
<hr>
+2 -2
View File
@@ -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>
+8 -17
View File
@@ -84,17 +84,7 @@ function initialize() {
-->
<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#difference_1_36">Differences from version 1.36</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#difference_1_35">Differences from version 1.35</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#difference_1_34">Differences from version 1.34</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#difference_1_33">Differences from version 1.33</a></dt>
<dt><img style="display:none" src="dot.gif"><a target="detail" href="release.html#difference_1_32">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="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>
@@ -179,9 +169,6 @@ function initialize() {
<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">
@@ -198,6 +185,7 @@ function initialize() {
<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>
@@ -230,7 +218,8 @@ function initialize() {
</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#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>
@@ -264,7 +253,7 @@ function initialize() {
<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" 'rc="dot.gif"><a target="detail" href="headers.html#serializationimplementations">Serialization Implementations</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">
@@ -280,6 +269,8 @@ function initialize() {
<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
@@ -302,7 +293,7 @@ function initialize() {
<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 Interfac'</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>
+10 -10
View File
@@ -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,12 +110,12 @@ 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"
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(
@@ -195,7 +195,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>
+58 -63
View File
@@ -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,24 +76,27 @@ 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::char_type,
std::ostream::traits_type
&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>Note the usage of PFTO.</i> Some compilers fail to provide support for
partial function template ordering. The serialization library works around this by
using <a target="detail" href="implementation.html#functiontemplateordering">
<b>P</b>artial <b>F</b>unction <b>T</b>emplate <b>O</b>rdering</a> in several places.
This is done
in several places, including the archive classes themselves.
<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>
@@ -97,13 +106,13 @@ that the following equivalent works on more compilers.
// 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);
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
@@ -111,48 +120,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 & 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

+2 -2
View File
@@ -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
+21 -15
View File
@@ -33,7 +33,8 @@ http://www.boost.org/LICENSE_1_0.txt)
<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>
@@ -56,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
@@ -65,12 +66,12 @@ 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.
@@ -79,8 +80,9 @@ public:
unsupported_class_version, // type saved with a version # greater than the
// one used by the program. This indicates that the proggram
// needs to be rebuilt.
multiple_code_instantiation // code for implementing serialization for some
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) {}
@@ -107,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>
@@ -116,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 3 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
@@ -177,7 +179,11 @@ 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>
<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 occured 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.
@@ -219,7 +225,7 @@ 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
@@ -233,7 +239,7 @@ 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 that once. This might occur when
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>
@@ -244,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
@@ -253,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>
+74 -16
View File
@@ -57,14 +57,14 @@ 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>
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>
@@ -135,7 +135,7 @@ instance created for each type. However, this is enforced only at the executabl
module level. That is, if a program includes some shared libraries or DLLS,
there may be more than one instance of this class correponding 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 the actual information
this instance but rather must be programmed to compare the actual information
the instances contain.
<dl>
@@ -193,7 +193,7 @@ bool operator==(const extended_type_info & rhs) const;
bool operator!=(const extended_type_info & rhs) const;
</code></pre></h4></dt>
<dd>
These functions are used to compare 'wo
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
@@ -213,7 +213,7 @@ Construct a new instance of the type to which this
extended_type_info
</code>
</a>
record corresponds. This function takes variable list of up to 4 arguments
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.
@@ -222,9 +222,9 @@ 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. When these modules
are loaded at runtime, these constructor can be called until the module
is unloaded. These modules are referred to as <b>plugin</b>.
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>
@@ -245,7 +245,7 @@ object.
</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 be derived from
@@ -269,7 +269,7 @@ 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</code> implementation.
</dd>
@@ -309,7 +309,7 @@ with the include argument list.
</dd>
<dt><h4><code style="white-space: normal"><pre>
virtual void * destroy(void const * const ptr ) ) const;
virtual void * destroy(void const * const ptr ) const;
</pre></code></h4></dt>
<dd>
Destroy an instance of this type. This calls the
@@ -321,7 +321,7 @@ proper destructor and recovers allocated memory.
<h3><a name="models">Models</a></h3>
The serialization library includes two distinct
<code style="white-space: normal"><a target="extended_type_info.hpp" href="../../../boost/serialization/extended_type_info.hpp">extended_type_info</a></code>
implementatio's.
implementations.
<p>
<code style="white-space: normal"><h4><a target="extended_type_info_typeid.hpp" href = "../../../boost/serialization/extended_type_info_typeid.hpp">
extended_type_info_typeid</a></h4></code>is implemented in terms of the standard typeid(). It presumes that RTTI support is enabled
@@ -348,11 +348,69 @@ The test program <code style="white-space: normal"><a target="test_no_rtti" href
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. It also demonstrates the
inter-operability with between two different implementations of
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 type_info system
one would include the following code:
<code style="white-space: normal"><pre>
namespace boost {
namespace serialization {
template
struct extended_type_info_typeid&gt;T&gt;;
template
struct extended_type_info_typeid&gt;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&gt;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->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>
+12 -14
View File
@@ -29,25 +29,23 @@ http://www.boost.org/LICENSE_1_0.txt)
</tr>
</table>
<hr>
This section will be used to list answers to questions raise in the mailing
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 documenation. Often,
these issues are very easy to address - but can be excruciating difficult to
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>
<a name="differences_1_37"></a>Differences from Boost 1.37</h2>
</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>
<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>
+67 -24
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 .
@@ -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
@@ -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
@@ -207,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
@@ -257,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>
@@ -269,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.
@@ -283,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>
@@ -294,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>
@@ -315,10 +315,10 @@ 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.
<p>
@@ -337,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 implemenations 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<class T>
void save_override(T & t, BOOST_PFTO int){
// All for otherwise unhandled types are forwarded to the base class.
// This emulates behavior for function overloading.
this->base::save_override(t, 0);
}
void save_override(const some_type & t, int){
// any special handling for some type
// this will usually entail forwarding some other operation
// in the most derived class.
this->This()->...
// or in one of its parents basic_text_oprimitive
this->This()->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>
@@ -359,7 +402,7 @@ 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
@@ -374,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
+10 -10
View File
@@ -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>
+14 -202
View File
@@ -26,20 +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>
@@ -49,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>
@@ -149,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.
@@ -175,32 +93,8 @@ 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>
<h4><a name="gcc4x">GCC 4.X</a></h4>
<ul>
<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
@@ -220,18 +114,7 @@ the syntax described above.
-Wno-ctor-dtor-privacy
</code></pre>
</ul>
<h4><a name="gcc295">GCC 2.95</a></h4>
All of the above plus:<br>
<ul>
<li>The serialization library depends on the templated stream
implementation to function properly.
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 <a href="release.html">Release Notes</a>.
</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>
@@ -250,12 +133,12 @@ This is due to the way that VC++ handles templated code with __decl(dllexport) a
__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
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
@@ -271,14 +154,14 @@ includes this switch by default. So if want to use the libraries that
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..
@@ -312,77 +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">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.
<li>Lack of support for partial template specialization also creates problems for
serialization of <code style="white-space: normal">std::map</code>. In order to serialize
instances of this type include the invocation of BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION
for the key type of the map.
</ul>
<h4><a name="vc6">Visual C++ 6.5</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 successful.
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 devise 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.
</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 accessible 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 <a href="release.html">Release Notes</a>.
</ul>
<h4><a name="comeau">Comeau 4.3.3</a></h4>
<ul>
<li>This compiler fails to make a DLL with export under windows.
@@ -393,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>
@@ -413,7 +225,7 @@ 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 locale that archives implement. The
stream locale must be set explicitly on the stream before an archive is opened on it. The
@@ -425,7 +237,7 @@ 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 iterator doesn't
@@ -435,7 +247,7 @@ These platforms have several issues:
<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>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 839 B

After

Width:  |  Height:  |  Size: 849 B

+9 -9
View File
@@ -36,13 +36,13 @@ techiques 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 pointer to the object in question. Since
the Serialization library resurrects pointer of the correct type
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,
the the function object effectively becomes a "variable" which
then the function object effectively becomes a "variable" which
encapsulates code.
<p>
This case study would show how to do this.
@@ -51,19 +51,19 @@ This case study would show how to do this.
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,
for specific types, adjustment of output syntax for xml archives,
and logging/debug output as archives are written and/or read.
If this functionalty is implemented as an "adaptor" template
which takes the base class as a template argument, such functionality
appended to any archive for which that funtionality makes sense.
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 narrow character versions of xml archives.
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 fullfill the requirements of the "Serializable Concept".
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
-3
View File
@@ -28,9 +28,6 @@ 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
+7 -4
View File
@@ -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
@@ -45,8 +45,11 @@ struct A {
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>
@@ -90,7 +93,7 @@ void A::serialize(boost::archive::text_iarchive & ar, const unsigned int file_ve
</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
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 <fstream>
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::remove;
}
#endif
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>
#include <boost/serialization/export.hpp>
class Base {
friend class boost::serialization::access;
int m_i;
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
ar & BOOST_SERIALIZATION_NVP(m_i);
}
protected:
bool equals(const Base &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 & base_cast(){
return static_cast<Base &>(*this);
}
template<class Archive>
void serialize(Archive & ar, const unsigned int version){
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
}
public:
bool operator==(const Derived &rhs) const {
return Base::equals(static_cast<const Base &>(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 << boost::serialization::make_nvp("a", a);
}
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> boost::serialization::make_nvp("a", a1);
}
std::remove(testfile);
if(a != a1)
return 1;
// serialize Derived and Base
Derived *ta = &a;
Derived *ta1 = NULL;
{
test_ostream os(testfile);
test_oarchive oa(os);
oa << boost::serialization::make_nvp("ta", ta);
}
{
test_istream is(testfile, TEST_STREAM_FLAGS);
test_iarchive ia(is, TEST_ARCHIVE_FLAGS);
ia >> 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 polymorphinc base class. This code requires
the ability to invoke
<code>
static_cast&lt;Base &&gt;(Derived &)
</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<class Archive>
void serialize(Archive & ar, const unsigned int version){
//ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar & boost::serialization::make_nvp(
"Base",
static_cast&lt;Base &&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>
+1 -2
View File
@@ -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
+261 -179
View File
@@ -7,68 +7,141 @@ 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">
<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>
<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>
</table>
<hr>
<dl class="index">
<dt><a href="#requirements">Requirements</a></dt>
<dt><a href="#differences_1_39">Differences from version 1.37</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>
As of this is written, 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="requirements"></a>Requirements</h2>
This library has been tested against Boost version 1.39 and 1.40.
<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>
</table>
<hr>
<dl class="index">
<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>
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>
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>
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>
...
#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:
<p>
<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; ;
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.
@@ -86,128 +159,137 @@ 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="differences_1_39"></a>Differences from Boost 1.39</h2>
<ul>
<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>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>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' 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.
</ul>
<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>
<h2><a name="differences_1_39"></a>Differences from Boost 1.39</h2>
<ul>
<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>
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 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>
+16 -18
View File
@@ -71,13 +71,11 @@ 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.
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>
@@ -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>
@@ -198,7 +196,7 @@ templates can be in any of the following namespaces:
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 furter will find more information in
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>
@@ -264,7 +262,7 @@ the question about what <code style="white-space: normal">const</code> means in
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
@@ -275,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>.
@@ -436,7 +434,7 @@ 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>
@@ -484,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.
@@ -498,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
@@ -791,10 +789,10 @@ 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 & boost::serialization::base_object&lt;base&gt;(*this);
// method 2 : explicitly register base/derived relationship
boost::serialization::void_cast_register&lt;derived, base&gt;(
static_cast&lt;derived *&gt;=NULL),
static_cast&lt;derived *&gt;(NULL),
static_cast&lt;base *&gt;(NULL)
)
}
@@ -909,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
+5 -5
View File
@@ -121,7 +121,7 @@ the same pointer deserialzed 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
@@ -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>,
@@ -197,7 +197,7 @@ void_cast_register&lt;
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 trival 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>
+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 << schedule;
</code></pre>
and it produces the following output
<pre><code>
schedule
count 6
item
first
driver bob
hour 6
minute 24
second ->
stops
count 3
item ->
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>
+42 -29
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 .
@@ -42,10 +42,10 @@ 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 variables and constants entries refer to others.
<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 explicitly and, without
<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>
@@ -61,7 +61,7 @@ This singleton implementation has the following features:
<li>
Any instance will be constructed before any attempt is made to access it.</li>
<li>
Any instance created with a template is guarenteed to be instantiated.
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
@@ -70,16 +70,16 @@ This singleton implementation has the following features:
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 guarentees that there will be no
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 guarentee this.
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 mult-threading system, there exists
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
@@ -100,6 +100,7 @@ class singleton : public boost::noncopyable
public:
static const T & get_const_instance();
static T & get_mutable_instance();
static bool is_destroyed();
};
} // namespace serialization
@@ -109,17 +110,27 @@ public:
<dl>
<dt><h4><pre><code>
static const T & get_const_instance();</code></pre></h4></dt>
static const T & 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 & get_mutable_instance();</code></pre></h4></dt>
static T & 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>
@@ -127,17 +138,16 @@ 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 constructable.
</code>
</a>, the type T must be default constructable.
It doesn't require static variables - though it may have them.
Since the library guarentees that only one instance of
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>
and all accesss is through the above static interface
</code>
</a>
exists and all accesss 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.
@@ -146,24 +156,24 @@ the functional equivalent of
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 and excerpt from the file
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<const extended_type_info *, key_compare> ktmap;
typedef std::set&lt;const extended_type_info *, key_compare&gt; ktmap;
...
void
extended_type_info::key_register(const char *key) {
...
result = singleton<ktmap>::get_mutable_instance().insert(this);
result = singleton&lt;ktmap&gt;::get_mutable_instance().insert(this);
...
}
</code></pre>
Just by referring to the singleton instance anywhere in the program
will guarentee that one and only one instance for the specified
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 anyother
will exist throughout the program. There is no need for any other
declaration or definition.
<p>
A second way is to use
@@ -206,7 +216,7 @@ 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 guarentee that one and only one instance
in the program will guarantee that one and only one instance
is created and referred to.
<h3><a name="multithreading">Multi-Threading</a></h3>
@@ -214,21 +224,24 @@ 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>
<p>
All singletons used in the serialization library follow this rule.
In order to help detect accidental violations of this rule there
exists an singleton lock/unlock functions.
exist singleton lock/unlock functions.
<pre><code>
boost::serialization::global_lock::get_mutable_instance().lock();
boost::serialization::global_lock::get_mutable_instance().unlock();
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 global_lock state is initialized as "unlocked" to permit
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. All
serialization tests invoke <code style="white-space: normal">lock()</code>
<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 progam. For programs compiled in release
mode these functions have no effect.
+9 -9
View File
@@ -33,9 +33,9 @@ operators:
<dt><code>static_cast&lt;T *<&gt;(U *)<br>static_cast&lt;T &<&gt;(U &)</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 polymophic pointers/references at runtime.
<li>does not permit "cross casting"
<li>inline function calls can be optimized away during compile time.
</ul>
@@ -46,7 +46,7 @@ operators:
<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.
@@ -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,7 +121,7 @@ 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:
@@ -134,14 +134,14 @@ Note that the above syntax doesn't include
<pre><code>
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)
</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.
+157 -24
View File
@@ -28,6 +28,7 @@ http://www.boost.org/LICENSE_1_0.txt)
<dl class="page-index">
<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>
@@ -96,7 +97,7 @@ 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;
@@ -111,7 +112,7 @@ 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:
@@ -136,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
@@ -155,6 +156,96 @@ redundant save/load operations.
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 prinicple 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<class T>
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<T> lookup(const T *);
// insert a new shared_ptr
void insert<shared_ptr<T> >(const shared_ptr<T> *);
};
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<T> 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
@@ -176,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>
@@ -204,14 +295,14 @@ 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>
@@ -296,7 +387,7 @@ 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
@@ -311,7 +402,7 @@ requirement.
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 it's base class.
reference to its base class.
<p>
<code style="white-space: normal">BOOST_CLASS_EXPORT</code> in the same
@@ -323,7 +414,7 @@ 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> and the inclusion of any archive
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:
@@ -336,7 +427,7 @@ will look like the following:
BOOST_CLASS_EXPORT(a)
... // other class headers and exports
</code></pre>
This will be true regardless of whether the is part
This will be true regardless of whether the code is part
of a stand alone executable, a static library or
a dyanmic or shared library.
<p>
@@ -365,14 +456,14 @@ one can include headers for just the
<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 catastophic error, the library traps ALL serializations through
a pointer to a polymorphic which are not exported or otherwise registered.
what would be a catastophic 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 guarenteed portability
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.
@@ -382,7 +473,7 @@ 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 huge amount of compilation time.
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
@@ -451,10 +542,52 @@ and
</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 explictly 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 & ar, const unsigned int version);
</code></pre>
in the header, and
<pre><code>
template&lt;class Archive&gt;
void myclass::serialize(Archive & 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 & ar, const unsigned int version);
template myclass::serialize(boost::archive::text_iarchive & 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 are runtime were required. These
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>
@@ -484,33 +617,33 @@ BOOST_CLASS_EXPORT(a)
... // other class headers and exports
</code></pre>
With this in place, one can construct, serialize and destroy
about which only is know the <b>GUID</b> and a base class.
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
thread concurrently writing/reading from/to a single open archive instance.
The library implementation presumes that the application avoids such an situtation.
threads concurrently writing/reading from/to a single open archive instance.
The library implementation presumes that the application avoids such a situtation.
<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 are some type tables which have been implemented using a
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 guarentees that all of this shared
This singleton implementation guarantees that all of this shared
information is initialized when the code module which contains
them is loaded. The serialization library takes care to
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/unload DLL
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.
+1 -1
View File
@@ -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.
+9 -10
View File
@@ -43,13 +43,12 @@ 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>
Its missing the following:
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>Some way to test archive portability within the Boost testing regimen.
<li>Integration into the Boost testing similar to the other archive classes.
<li>Integration into the Boost testing regimen similar to the other archive classes.
</ul>
<h2><a name="performancetesting"></a>Performance Testing and Profiling</h2>
@@ -67,13 +66,13 @@ 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 immediatly apparent that these tests were totally unsuitable
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 suprised
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 lead to large improvements in performance. I expect that
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.
@@ -81,10 +80,10 @@ library.
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 make programs that are guarenteed
the library permits one to make programs that are guaranteed
the ability to load archives with classes of a previous version.
But there is not way to save classes in accordance with a
previous version. At first I dismissed this a a huge project
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
@@ -101,7 +100,7 @@ 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
a set of tests, examples and new manual section would have to be created.
<hr>
<p>Revised 1 November, 2008
+24 -25
View File
@@ -38,7 +38,7 @@ http://www.boost.org/LICENSE_1_0.txt)
<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
@@ -232,12 +232,12 @@ 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>
<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 he class.
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 -
@@ -248,8 +248,8 @@ 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 he declaration header or definition. These macros
expand to invocation of the of both of the macros described above.
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>entfier.)</i>
<p>
<i>(<a target="detail" href="special.html#export">Elsewhere</a>
@@ -267,7 +267,7 @@ in more than one module (or DLL).
<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 bas is abstract
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
@@ -333,10 +333,9 @@ This is illustrated by the test program
Other implementations are possible and might be necessary for
certain special cases.
version.hpp</a>.
<h3><a name="wrappers">Wrappers</a></h3>
Archives need to treat wrappers diffently from other types since, for example,
they usually are non-const object while output archives require that any
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>
@@ -471,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>
@@ -517,13 +516,13 @@ and template parameters should be assigned according to the following table:
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 suprising behavior. The extent possible,
library user which could result in suprising behavior. To the extent possible,
these conflicts are detected at compile time and errors (BOOST_STATIC_ASSERT)
or warnings (BOOST_STATIC_WARNING) are generated. The are generated in a
compiler dependent way manner which should show an chain of instantiation
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 list of the conflicts trapped:
usage. Here is a list of the conflicts trapped:
<dl>
<dt><h2><a name="object_level">object_level</a> - error</h2></dt>
@@ -632,9 +631,9 @@ class K {
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
it's discovered
that programmer(3) accidently 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
@@ -642,11 +641,11 @@ its discovered
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.
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
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)
@@ -660,7 +659,7 @@ 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 difficult to find and fix program bug, but we have a bunch of
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>
@@ -673,7 +672,7 @@ invalid archives and lost data.
ar &lt;&lt; x;
</pre></code>
<p>
<li>The programmer curses (another %^&*&* hoop to jump through). If he's in a
<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>
@@ -697,8 +696,8 @@ ar &lt;&lt; x
<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
<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>
@@ -748,7 +747,7 @@ Note that in this second scenario
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 small price to
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>
@@ -765,7 +764,7 @@ level <= object_serializable.
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 absense of the operation ar << T * anywhere else in the
or absence of the operation ar << T * 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
+2 -2
View File
@@ -327,7 +327,7 @@ 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>
<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
@@ -569,7 +569,7 @@ 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
+38
View File
@@ -0,0 +1,38 @@
IMPORTANT:
This is the last release from me as EOS employee. I plan to contribute all of this
work to the official boost libraries distribution and will continue to support users.
Francois Mauger joined me recently and already added a valuable tutorial for you!
Changelog:
07.11.2015 5.1 Small fix to get it running up to 1.59.
26.06.2012 5.0 Ported to boost versions up to 1.49.
Added support for wstring, added tutorial by Francois Mauger.
01.04.2011 4.2 Ported to boost versions up to 1.46.1.
Allow serialization of inf and nan values.
17.12.2009 4.1 Ported to boost versions up to 1.41.
4.0 Changes in inheritance make arrays work.
13.02.2009 3.1 Shared pointer serialization capabilities added
Ported to recent boost versions (up to 1.38)
25.09.2008 3.0 Refactored, fixed and ported to recent boost versions
Archives are now named eos::portable_[io]archive
17.09.2008 2.1 Improved floating point handling and error detection.
Extracted the exception class into an extra file.
28.04.2008 2.0 Major Bugfix resolving negative number collision!
28.11.2007 1.1 Small Bugfix in portable_binary_archive_exception class:
throwing specifiers did not match base class declaration
12.11.2007 1.0 Initial Release to boost-users!
Christian Pfligersdorffer
christian.pfligersdorffer@gmx.at
+56
View File
@@ -0,0 +1,56 @@
/** tutorial_pba_0.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This quick start example shows how to store some variables
* of basic types (bool, integer, floating point numbers, STL string)
* using the portable binary archive format associated to a
* standard output file stream.
*
*/
#include <string>
#include <fstream>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
int main (void)
{
// The name for the example data file :
std::string filename = "pba_0.data";
// Some variables of various primitive types :
bool b = true;
char c = 'B';
uint32_t answer = 42;
float computing_time = 7.5e6;
double e = 2.71828182845905;
std::string slogan = "DON'T PANIC";
// Open an output file stream in binary mode :
std::ofstream fout (filename.c_str (), std::ios_base::binary);
{
// Create an output portable binary archive attached to the output file :
boost::archive::portable_binary_oarchive opba (fout);
// Store (serializing) variables :
opba & b & c & answer & computing_time & e & slogan;
}
return 0;
}
// end of tutorial_pba_0.cpp
+68
View File
@@ -0,0 +1,68 @@
/** tutorial_pba_1.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization package.
*
* This quick start example shows how to load some variables
* of basic types (bool, integer, floating point numbers, STL string)
* using the portable binary archive format associated to a
* standard input file stream.
*
*/
#include <iostream>
#include <string>
#include <fstream>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
int main (void)
{
using namespace std;
// The name for the example data file :
string filename = "pba_0.data";
// Some variables of various types :
bool b;
char c;
uint32_t answer;
float computing_time;
double e;
string slogan;
// Open an input file stream in binary mode :
ifstream fin (filename.c_str (), ios_base::binary);
{
// Create an input portable binary archive attached to the input file :
boost::archive::portable_binary_iarchive ipba (fin);
// Loading (de-serializing) variables using the same
// order than for serialization (see tutorial_pba_0.cpp) :
ipba & b & c & answer & computing_time & e & slogan;
}
cout.precision (15);
cout << "Variable 'b' is : " << b << " " << "(bool)" << endl;
cout << "Variable 'c' is : '" << c << "' " << " " << "(char)" << endl;
cout << "Variable 'answer' is : " << answer << " " << "(unsigned 32-bit integer)" << endl;
cout << "Variable 'computing_time' is : " << computing_time << " " << "(single precision 32-bit float)" << endl;
cout << "Variable 'e' is : " << e << " " << "(double precision 64-bit float)" << endl;
cout << "Variable 'slogan' is : \"" << slogan << "\" " << "(std::string)" << endl;
return 0;
}
// end of tutorial_pba_1.cpp
+162
View File
@@ -0,0 +1,162 @@
/** tutorial_pba_10.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example shows how use PBAs combined with on-the-fly
* compressed I/O streams.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <vector>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>
using namespace std;
class data_type
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize (Archive & ar, const unsigned int version);
public:
void print (ostream & out, const string & title) const;
public:
vector<double> values;
data_type ();
};
data_type::data_type () : values ()
{
return;
}
void data_type::print (ostream & out, const string & title) const
{
out << endl;
out << title << " :" << endl;
for (int i = 0; i < this->values.size (); ++i)
{
out.precision (16);
out.width (18);
out << this->values [i] << ' ' ;
if ((i%4) == 3) clog << endl;
}
out << endl;
return;
}
template<class Archive>
void data_type::serialize (Archive & ar, const unsigned int version)
{
ar & values;
return;
}
void do_gzipped_out (void)
{
// The name for the output data file :
string filename = "pba_10.data.gz";
// A data structure to be stored :
data_type my_data;
// Fill the vector with arbitrary (possibly non-finite) values :
size_t dim = 1000;
my_data.values.reserve (dim);
for (int i = 0; i < dim; ++i)
{
double val = (i + 1) * (1.0 + 3 * numeric_limits<double>::epsilon ());
if (i == 4) val = numeric_limits<double>::quiet_NaN ();
if (i == 23) val = numeric_limits<double>::infinity ();
if (i == 73) val = -numeric_limits<double>::infinity ();
if (i == 90) val = 0.0;
my_data.values.push_back (val);
}
// Print:
my_data.print (clog, "Stored data");
// Create an output filtering stream :
boost::iostreams::filtering_ostream zout;
zout.push (boost::iostreams::gzip_compressor ());
// Open an output file stream in binary mode :
ofstream fout (filename.c_str (), ios_base::binary);
zout.push (fout);
// Save to PBA :
{
// Create an output portable binary archive attached to the output file :
boost::archive::portable_binary_oarchive opba (zout);
// Store (serializing) the data :
opba & my_data;
}
// Clean termination of the streams :
zout.flush ();
zout.reset ();
return;
}
void do_gzipped_in (void)
{
// The name for the input data file :
string filename = "pba_10.data.gz";
// A data structure to be loaded :
data_type my_data;
// Create an input filtering stream :
boost::iostreams::filtering_istream zin;
zin.push (boost::iostreams::gzip_decompressor ());
// Open an input file stream in binary mode :
ifstream fin (filename.c_str (), ios_base::binary);
zin.push (fin);
// Load from PBA :
{
// Create an input portable binary archive attached to the input file :
boost::archive::portable_binary_iarchive ipba (zin);
// Load (deserializing) the data :
ipba & my_data;
}
// Print:
my_data.print (clog, "Loaded data");
return;
}
int main (void)
{
do_gzipped_out ();
do_gzipped_in ();
return 0;
}
// end of tutorial_pba_10.cpp
+198
View File
@@ -0,0 +1,198 @@
/** tutorial_pba_10b.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example shows how use PBAs combined with on-the-fly
* compressed I/O streams.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <vector>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/version.hpp>
using namespace std;
class data_type
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize (Archive & ar, const unsigned int version);
public:
void print (ostream & out, const string & title) const;
public:
vector<double> values;
data_type ();
};
//BOOST_CLASS_VERSION(data_type, 7)
data_type::data_type () : values ()
{
return;
}
void data_type::print (ostream & out, const string & title) const
{
out << endl;
out << title << " :" << endl;
for (int i = 0; i < this->values.size (); ++i)
{
out.precision (16);
out.width (18);
out << this->values [i] << ' ' ;
if ((i%4) == 3) clog << endl;
}
out << endl;
return;
}
template<class Archive>
void data_type::serialize (Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP (values);
return;
}
class data_type2
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize (Archive & ar, const unsigned int version);
public:
double value;
data_type2 ();
};
BOOST_CLASS_VERSION(data_type2, 99)
data_type2::data_type2 () : value (666.666)
{
return;
}
template<class Archive>
void data_type2::serialize (Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP (value);
return;
}
class data_type3
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize (Archive & ar, const unsigned int version);
public:
vector<data_type2> values;
data_type3 ();
};
BOOST_CLASS_VERSION(data_type3, 33)
data_type3::data_type3 ()
{
{
data_type2 d;
d.value = 6.66;
values.push_back (d);
}
{
data_type2 d;
d.value = 66.66;
values.push_back (d);
}
{
data_type2 d;
d.value = 666.66;
values.push_back (d);
}
return;
}
template<class Archive>
void data_type3::serialize (Archive & ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP (values);
return;
}
/********************/
void do_xml_out (void)
{
// The name for the output data file :
string filename = "pba_10.xml";
// A data structure to be stored :
data_type my_data;
// Fill the vector with arbitrary (possibly non-finite) values :
size_t dim = 6;
my_data.values.reserve (dim);
for (int i = 0; i < dim; ++i)
{
double val = (i + 1) * (1.0 + 3 * numeric_limits<double>::epsilon ());
if (i == 4) val = numeric_limits<double>::quiet_NaN ();
if (i == 7) val = numeric_limits<double>::infinity ();
if (i == 9) val = -numeric_limits<double>::infinity ();
if (i == 13) val = 0.0;
my_data.values.push_back (val);
}
// Print:
my_data.print (clog, "Stored data");
data_type2 my_data2;
data_type3 my_data3;
// Open an output file stream in binary mode :
ofstream fout (filename.c_str ());
// Save to PBA :
{
// Create an output XML archive attached to the output file :
boost::archive::xml_oarchive oxa (fout);
// Store (serializing) the data :
oxa & BOOST_SERIALIZATION_NVP(my_data);
oxa & BOOST_SERIALIZATION_NVP(my_data2);
oxa & BOOST_SERIALIZATION_NVP(my_data3);
}
return;
}
int main (void)
{
do_xml_out ();
return 0;
}
// end of tutorial_pba_10b.cpp
+187
View File
@@ -0,0 +1,187 @@
/** tutorial_pba_11.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example program compares the times needed to serialize
* and deserialize some large amount of data using PBA and
* text archives.
*
*/
#include <string>
#include <fstream>
#include <vector>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_real_distribution.hpp>
#include <boost/timer.hpp>
using namespace std;
class data_type
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize (Archive & ar, const unsigned int version);
public:
void print (ostream & out, const string & title) const;
public:
vector<double> values;
data_type ();
};
data_type::data_type () : values ()
{
return;
}
void data_type::print (ostream & out, const string & title) const
{
out << endl;
out << title << " :" << endl;
bool skip = false;
for (int i = 0; i < this->values.size (); ++i)
{
if ((i >= 12) && (i < (int) this->values.size () - 8))
{
if (! skip) out << " ..." << endl;
skip = true;
continue;
}
out.precision (16);
out.width (18);
out << this->values [i] << ' ' ;
if ((i%4) == 3) clog << endl;
}
out << endl;
return;
}
template<class Archive>
void data_type::serialize (Archive & ar, const unsigned int version)
{
ar & values;
return;
}
double do_pba_out (const data_type & a_data)
{
string filename = "pba_11.data";
ofstream fout (filename.c_str (), ios_base::binary);
boost::timer io_timer;
{
boost::archive::portable_binary_oarchive opba (fout);
opba & a_data;
}
return io_timer.elapsed ();
}
double do_pba_in (data_type & a_data)
{
string filename = "pba_11.data";
ifstream fin (filename.c_str (), ios_base::binary);
boost::timer io_timer;
{
boost::archive::portable_binary_iarchive ipba (fin);
ipba & a_data;
}
return io_timer.elapsed ();
}
double do_text_out (const data_type & a_data)
{
string filename = "pba_11.txt";
ofstream fout (filename.c_str ());
boost::timer io_timer;
{
boost::archive::text_oarchive ota (fout);
ota & a_data;
}
return io_timer.elapsed ();
}
double do_text_in (data_type & a_data)
{
string filename = "pba_11.txt";
ifstream fin (filename.c_str ());
boost::timer io_timer;
{
boost::archive::text_iarchive ita (fin);
ita & a_data;
}
return io_timer.elapsed ();
}
int main (void)
{
double elapsed_time_pba_out;
double elapsed_time_text_out;
double elapsed_time_pba_in;
double elapsed_time_text_in;
data_type my_data; // A data structure to be stored then loaded.
{
// Fill the vector with random values :
size_t dim = 10000000;
my_data.values.reserve (dim);
boost::random::mt19937 rng;
boost::random::uniform_real_distribution<> flat (0.0, 100.0);
for (int i = 0; i < dim; ++i)
{
double val = flat (rng);
my_data.values.push_back (val);
}
my_data.print (clog, "Stored data in PBA and text archive");
}
{
// Store in PBA :
elapsed_time_pba_out = do_pba_out (my_data);
}
{
// Store in text archive :
elapsed_time_text_out = do_text_out (my_data);
}
{
my_data.values.clear ();
// Load from PBA :
elapsed_time_pba_in = do_pba_in (my_data);
my_data.print (clog, "Loaded data from PBA");
}
{
my_data.values.clear ();
// Load from text archive :
elapsed_time_text_in = do_text_in (my_data);
my_data.print (clog, "Loaded data from text archive");
}
clog << "PBA store I/O elapsed time : " << elapsed_time_pba_out << " (second)" << endl;
clog << "Text store I/O elapsed time : " << elapsed_time_text_out << " (second)" << endl;
clog << "PBA load I/O elapsed time : " << elapsed_time_pba_in << " (second)" << endl;
clog << "Text load I/O elapsed time : " << elapsed_time_text_in << " (second)" << endl;
return 0;
}
// end of tutorial_pba_11.cpp
+105
View File
@@ -0,0 +1,105 @@
/** tutorial_pba_2.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This sample program shows how to use a portable binary archive
* to store/load floating point numbers including non-finite and
* special (denormalized) values.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
int main (void)
{
using namespace std;
// The name for the example data file :
string filename = "pba_2.data";
{
// A normal single precision floating point number :
float pi = 3.14159265;
// Single precision zeroed floating point number :
float zero = 0.0;
// A denormalized single precision floating point number :
float tiny = 1.e-40;
// A single precision floating point number with `+Infinity' value :
float plus_infinity = numeric_limits<float>::infinity ();
// A single precision floating point number with `-Infinity' value :
float minus_infinity = -numeric_limits<float>::infinity ();
// A single precision `Not-a-Number' (NaN):
float nan = numeric_limits<float>::quiet_NaN ();
// Open an output file stream in binary mode :
ofstream fout (filename.c_str (), ios_base::binary);
{
// Create an output portable binary archive attached to the output file :
boost::archive::portable_binary_oarchive opba (fout);
// Store (serialize) variables :
opba & pi & zero & tiny & plus_infinity & minus_infinity & nan;
}
}
{
// Single precision floating point numbers to be loaded :
float x[6];
// Open an input file stream in binary mode :
ifstream fin (filename.c_str (), ios_base::binary);
{
// Create an input portable binary archive attached to the input file :
boost::archive::portable_binary_iarchive ipba (fin);
// Load (de-serialize) variables using the same
// order than for serialization :
for (int i = 0; i < 6; ++i)
{
ipba & x[i];
}
}
// Print :
for (int i = 0; i < 6; ++i)
{
cout.precision (8);
cout << "Loaded x[" << i << "] = " << x[i];
switch (fp::fpclassify(x[i]))
{
case FP_NAN: cout << " (NaN)"; break;
case FP_INFINITE: cout << " (infinite)"; break;
case FP_SUBNORMAL: cout << " (denormalized)"; break;
case FP_NORMAL: cout << " (normalized)"; break;
}
cout << endl;
}
}
return 0;
}
// end of tutorial_pba_2.cpp
+70
View File
@@ -0,0 +1,70 @@
/** tutorial_pba_3.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This sample program shows how to use a portable binary archive
* and prevent the serialization of non-finite floating numbers.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <boost/archive/portable_binary_oarchive.hpp>
int main (void)
{
using namespace std;
// The name for the example data file :
string filename = "pba_3.data";
try
{
// An array of single precision floating numbers:
float x[5];
x[0] = 3.14159; // Pi
x[1] = 6.022e22; // Avogadro constant
x[2] = 1.6e-19; // Electron charge magnitude
x[3] = 1.e-40; // A tiny (denormalized) value
x[4] = numeric_limits<float>::infinity (); // This will fail while serializing...
// Open an output file stream in binary mode :
ofstream fout (filename.c_str (), ios_base::binary);
{
// Create an output portable binary archive attached to the output file,
// using the special 'boost::archive::no_infnan' flag :
boost::archive::portable_binary_oarchive opba (fout, boost::archive::no_infnan);
// Store (serialize) variables :
for (int i = 0; i < 5; ++i)
{
clog << "Serializing value : " << x[i] << " ... ";
opba & x[i];
clog << "Ok !" << endl;
}
}
}
catch (exception & x)
{
cerr << "ERROR: " << x.what () << endl;
return 1;
}
return 0;
}
// end of tutorial_pba_3.cpp
+105
View File
@@ -0,0 +1,105 @@
/** tutorial_pba_4.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This sample program shows how to use a portable binary archive
* to store/load integer numbers of various sizes using the Boost
* portable integer typedefs.
*
*/
#include <string>
#include <fstream>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
int main (void)
{
using namespace std;
// The name for the example data file :
string filename = "pba_4.data";
{
// Some integer numbers :
bool t = true;
char c = 'c';
unsigned char u = 'u';
int8_t b = -3; // char
uint8_t B = +6; // unsigned char
int16_t s = -16;
uint16_t S = +32;
int32_t l = -128;
uint32_t L = +127;
int64_t ll = -1024;
uint64_t LL = +2048;
// Open an output file stream in binary mode :
ofstream fout (filename.c_str (), ios_base::binary);
{
// Create an output portable binary archive attached to the output file :
boost::archive::portable_binary_oarchive opba (fout);
// Store (serialize) variables :
opba & t & c & u & b & B & s & S & l & L & ll & LL;
}
}
{
// Single precision floating numbers to be loaded :
// Some integer numbers :
bool t;
char c;
unsigned char u;
int8_t b;
uint8_t B;
int16_t s;
uint16_t S;
int32_t l;
uint32_t L;
int64_t ll;
uint64_t LL;
// Open an input file stream in binary mode :
ifstream fin (filename.c_str (), ios_base::binary);
{
// Create an input portable binary archive attached to the input file :
boost::archive::portable_binary_iarchive ipba (fin);
// Load (de-serialize) variables using the same
// order than for serialization :
ipba & t & c & u & b & B & s & S & l & L & ll & LL;
}
clog << "t = " << t << " (bool)" << endl;
clog << "c = '" << c << "' (char)" << endl;
clog << "u = '" << u << "' (unsigned char)" << endl;
clog << "b = " << (int) b << " (int8_t)" << endl;
clog << "B = " << (int) B << " (uint8_t)" << endl;
clog << "s = " << s << " (int16_t)" << endl;
clog << "S = " << S << " (uint16_t)" << endl;
clog << "l = " << l << " (int32_t)" << endl;
clog << "L = " << L << " (uint32_t)" << endl;
clog << "ll = " << ll << " (int64_t)" << endl;
clog << "LL = " << LL << " (uint64_t)" << endl;
}
return 0;
}
// end of tutorial_pba_4.cpp
+111
View File
@@ -0,0 +1,111 @@
/** tutorial_pba_5.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This sample program shows how to use a portable binary archive
* to store/load data in a memory buffer.
*
*/
#include <string>
#include <vector>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
int main (void)
{
using namespace std;
// The memory buffer is implemented using a STL vector :
typedef std::vector<char> buffer_type;
buffer_type buffer;
{
// Some data to be stored :
bool t = true;
char c = 'c';
int16_t s = +16;
int32_t l = -128;
int64_t ll = +10000000000;
float pi = 3.14159;
double nan = numeric_limits<double>::quiet_NaN ();
string hello = "World !";
buffer.reserve (1024); // pre-allocate some memory
// The output stream interface to the buffer :
boost::iostreams::stream<boost::iostreams::back_insert_device<buffer_type> > output_stream (buffer);
{
// Create an output portable binary archive attached to the output file :
boost::archive::portable_binary_oarchive opba (output_stream);
// Store (serialize) variables :
opba & t & c & s & l & ll & pi & nan & hello;
}
}
clog << "Buffer content is " << buffer.size () << " bytes : " << endl << " ";
for (int i = 0; i < buffer.size (); ++i)
{
clog << (int) ((unsigned char) buffer[i]) << ' ';
if ((i + 1) % 20 == 0) clog << endl << " ";
}
clog << endl;
{
// Some data to be loaded :
bool t;
char c;
int16_t s;
int32_t l;
int64_t ll;
float pi;
double nan;
string hello;
// The input stream interface to the buffer :
boost::iostreams::stream<boost::iostreams::array_source> input_stream (&buffer[0],
buffer.size ());
{
// Create an input portable binary archive attached to the input file :
boost::archive::portable_binary_iarchive ipba (input_stream);
// Load (de-serialize) variables :
ipba & t & c & s & l & ll & pi & nan & hello;
}
clog << "Loaded values from the buffer are: " << endl;
clog << " t = " << t << " (bool)" << endl;
clog << " c = '" << c << "' (char)" << endl;
clog << " s = " << s << " (int16_t)" << endl;
clog << " l = " << l << " (int32_t)" << endl;
clog << " ll = " << ll << " (int64_t)" << endl;
clog << " pi = " << pi << " (float)" << endl;
clog << " nan = " << nan << " (double)" << endl;
clog << " hello = \"" << hello << "\" (std::string)" << endl;
}
return 0;
}
// end of tutorial_pba_5.cpp
+112
View File
@@ -0,0 +1,112 @@
/** tutorial_pba_6.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This sample program shows how to use a portable binary archive
* associated to a memory buffer to copy a non-copyable object.
*
*/
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <boost/utility.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/back_inserter.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/cstdint.hpp>
#include <boost/archive/portable_binary_oarchive.hpp>
#include <boost/archive/portable_binary_iarchive.hpp>
using namespace std;
/* A foo noncopyable class */
struct foo : boost::noncopyable
{
uint32_t status;
double value;
double special;
string to_string () const
{
ostringstream sout;
sout << "foo={status=" << status << "; value=" << value << "; special=" << special<< "}";
return sout.str();
}
template<class Archive>
void serialize (Archive & ar, const unsigned int version)
{
ar & status;
ar & value;
ar & special;
return;
}
};
// A templatized copy function for Boost/Serialization equipped classes.
// Here we use PBAs associated to a memory buffer :
template <class Serializable>
void copy (const Serializable & source, Serializable & target)
{
namespace io = boost::iostreams;
namespace ba = boost::archive;
if (&source == &target) return; // self-copy guard
typedef std::vector<char> buffer_type;
buffer_type buffer;
buffer.reserve (1024);
{
io::stream<io::back_insert_device<buffer_type> > output_stream (buffer);
ba::portable_binary_oarchive opba (output_stream);
opba & source;
}
{
io::stream<io::array_source> input_stream (&buffer[0], buffer.size ());
ba::portable_binary_iarchive ipba (input_stream);
ipba & target;
}
return;
}
int main (void)
{
// Some instance of the 'foo' class :
foo dummy;
dummy.status = 1;
dummy.value = 3.14159;
dummy.special = numeric_limits<double>::quiet_NaN ();
clog << "dummy is : " << dummy.to_string () << endl;
// Another instance of the 'foo' class :
foo clone;
/* The following instruction is forbidden because foo
inherits 'boost::noncopyable' :
clone = dummy; // this ends in a compilation error.
*/
// Anyway, we can use this workaround :
copy (dummy, clone);
clog << "clone is : " << clone.to_string () << endl;
return 0;
}
// end of tutorial_pba_6.cpp
+54
View File
@@ -0,0 +1,54 @@
/** tutorial_pba_7.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example shows how the default behaviour of standard
* I/O streams does not support the read/write operations of
* non-finite floating point values in a portable way.
*
*/
#include <string>
#include <iostream>
#include <sstream>
#include <limits>
using namespace std;
int main (void)
{
{
float x = numeric_limits<float>::infinity ();
double y = numeric_limits<double>::quiet_NaN ();
cout.precision (8);
cout << "x = " << x << endl;
cout.precision (16);
cout << "y = " << y << endl;
}
{
string input ("inf nan");
istringstream iss (input);
float x;
double y;
iss >> x >> y;
if (! iss)
{
cerr << "Cannot read 'x' or 'y' : non finite values are not supported !" << endl;
}
}
return 0;
}
// end of tutorial_pba_7.cpp
+118
View File
@@ -0,0 +1,118 @@
/** tutorial_pba_8.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example shows how to store some variables
* of basic types (bool, integer, floating point numbers, STL string)
* using the text or XML archive format associated to a
* standard output file stream supporting portable non-finite
* floating point values.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <locale>
#include <boost/cstdint.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/codecvt_null.hpp>
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
using namespace std;
void do_text_out (void)
{
// The name for the example data text file :
string filename = "pba_8.txt";
// Some variables of various primitive types :
bool b = true;
char c = 'B';
uint32_t answer = 42;
float value = numeric_limits<float>::infinity ();
double precision = numeric_limits<double>::quiet_NaN ();
string question = "What makes you think she's a witch?";
// Open an output file stream :
ofstream fout (filename.c_str ());
// Prepare the output file stream for inf/NaN support :
locale default_locale (locale::classic (),
new boost::archive::codecvt_null<char>);
locale infnan_locale (default_locale,
new boost::math::nonfinite_num_put<char>);
fout.imbue (infnan_locale);
{
// Create an output text archive attached to the output file :
boost::archive::text_oarchive ota (fout, boost::archive::no_codecvt);
// Store (serializing) variables :
ota & b & c & answer & value & precision & question;
}
return;
}
void do_xml_out (void)
{
// The name for the example data XML file :
string filename = "pba_8.xml";
// Some variables of various primitive types :
bool b = true;
char c = 'B';
uint32_t answer = 42;
float value = numeric_limits<float>::infinity ();
double precision = numeric_limits<double>::quiet_NaN ();
string question = "What makes you think she's a witch?";
// Open an output file stream :
ofstream fout (filename.c_str ());
// Prepare the output file stream for inf/NaN support :
locale default_locale (locale::classic (),
new boost::archive::codecvt_null<char>);
locale infnan_locale (default_locale,
new boost::math::nonfinite_num_put<char>);
fout.imbue (infnan_locale);
{
// Create an output text archive attached to the output file :
boost::archive::xml_oarchive oxa (fout, boost::archive::no_codecvt);
// Store (serializing) variables :
oxa & BOOST_SERIALIZATION_NVP(b)
& BOOST_SERIALIZATION_NVP(c)
& BOOST_SERIALIZATION_NVP(answer)
& BOOST_SERIALIZATION_NVP(value)
& BOOST_SERIALIZATION_NVP(precision)
& BOOST_SERIALIZATION_NVP(question);
}
return;
}
int main (void)
{
do_text_out ();
do_xml_out ();
return 0;
}
// end of tutorial_pba_8.cpp
+134
View File
@@ -0,0 +1,134 @@
/** tutorial_pba_9.cpp
*
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
*
* 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)
*
*/
/**
* The intent of this program is to serve as a tutorial for
* users of the portable binary archive in the framework of
* the Boost/Serialization library.
*
* This example shows how to load some variables of basic
* types (bool, char, integer, floating point numbers, STL string)
* using the text or XML archive format associated to a
* standard file input stream supporting portable non-finite
* floating point values.
*
*/
#include <string>
#include <fstream>
#include <limits>
#include <locale>
#include <boost/cstdint.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/archive/codecvt_null.hpp>
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
using namespace std;
void do_text_in (void)
{
// The name for the example data text file :
string filename = "pba_8.txt";
// Some variables of various primitive types :
bool b;
char c;
uint32_t answer;
float value;
double precision;
string question;
// Open an input file stream :
ifstream fin (filename.c_str ());
// Prepare the input file stream for inf/NaN support :
locale default_locale (locale::classic (),
new boost::archive::codecvt_null<char>);
locale infnan_locale (default_locale,
new boost::math::nonfinite_num_get<char>);
fin.imbue (infnan_locale);
{
// Create an input text archive attached to the input file :
boost::archive::text_iarchive ita (fin, boost::archive::no_codecvt);
// Store (serializing) variables :
ita & b & c & answer & value & precision & question;
}
clog << "Loaded values from text archive are: " << endl;
clog << " b = " << b << endl;
clog << " c = '" << c << "'" << endl;
clog << " answer = " << answer << endl;
clog << " value = " << value << endl;
clog << " precision = " << precision << endl;
clog << " question = \"" << question << "\"" << endl;
return;
}
void do_xml_in (void)
{
// The name for the example data text file :
string filename = "pba_8.xml";
// Some variables of various primitive types :
bool b;
char c;
uint32_t answer;
float value;
double precision;
string question;
// Open an input file stream :
ifstream fin (filename.c_str ());
// Prepare the input file stream for inf/NaN support :
locale default_locale (locale::classic (),
new boost::archive::codecvt_null<char>);
locale infnan_locale (default_locale,
new boost::math::nonfinite_num_get<char>);
fin.imbue (infnan_locale);
{
// Create an output text archive attached to the output file :
boost::archive::xml_iarchive ixa (fin, boost::archive::no_codecvt);
// Store (serializing) variables :
ixa & BOOST_SERIALIZATION_NVP(b)
& BOOST_SERIALIZATION_NVP(c)
& BOOST_SERIALIZATION_NVP(answer)
& BOOST_SERIALIZATION_NVP(value)
& BOOST_SERIALIZATION_NVP(precision)
& BOOST_SERIALIZATION_NVP(question);
}
clog << "Loaded values from XML archive are: " << endl;
clog << " b = " << b << endl;
clog << " c = '" << c << "'" << endl;
clog << " answer = " << answer << endl;
clog << " value = " << value << endl;
clog << " precision = " << precision << endl;
clog << " question = \"" << question << "\"" << endl;
return;
}
int main (void)
{
do_text_in ();
do_xml_in ();
return 0;
}
// end of tutorial_pba_9.cpp
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

+36
View File
@@ -0,0 +1,36 @@
IMPORTANT:
This is the last release from me as EOS employee. I plan to contribute all of this
work to the official boost libraries distribution and will continue to support users.
Francois Mauger joined me recently and already added a valuable tutorial for you!
Dear user,
I am proud to announce the very first release of our portable_binary_[io]archive
which we use here at EOS to move data between different platforms. It really is
a conglomerate of pieces that already were there - as is most often the case in
OO world - we simply put them together in a way that seemed to make sense. I know
a lot of people were interested in portable binary archives, so here you are -
give it a try and let me know what you think about it!
We rely heavily on boost::serialization and really appreciate the amount of time
and knowledge that went into it. By publishing this small missing piece we hope
to contribute our mite to this great library.
The work extends the portable binary example which was done by Robert Ramey and
uses Beman Dawes' endian library plus the fp_utilities by Johan Rade. You will
need to get those two libraries in order to use our classes - look for them at
the boost vault (http://www.boost-consulting.com/vault/) in categories 'integer'
and 'math - numerics'. Finally you will find the portable binary archive in
category 'serialization' as well.
Regards,
Christian Pfligersdorffer
Munich, End of 2007
--
christian.pfligersdorffer@eos.info
christian.pfligersdorffer@gmx.at
http://www.eos.info
+151
View File
@@ -0,0 +1,151 @@
/*!
* jQuery JavaScript Library v1.4
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://docs.jquery.com/License
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Wed Jan 13 15:23:05 2010 -0500
*/
(function(A,w){function oa(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(oa,1);return}c.ready()}}function La(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function $(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var o in b)$(a,o,b[o],f,e,d);return a}if(d!==w){f=!i&&f&&c.isFunction(d);for(o=0;o<j;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,i);return a}return j?
e(a[0],b):null}function K(){return(new Date).getTime()}function aa(){return false}function ba(){return true}function pa(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function qa(a){var b=true,d=[],f=[],e=arguments,i,j,o,p,n,t=c.extend({},c.data(this,"events").live);for(p in t){j=t[p];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete t[p]}i=c(a.target).closest(f,a.currentTarget);
n=0;for(l=i.length;n<l;n++)for(p in t){j=t[p];o=i[n].elem;f=null;if(i[n].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==o)d.push({elem:o,fn:j})}}n=0;for(l=d.length;n<l;n++){i=d[n];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}function ra(a,b){return["live",a,b.replace(/\./g,"`").replace(/ /g,"&")].join(".")}function sa(a){return!a||!a.parentNode||a.parentNode.nodeType===
11}function ta(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ua(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:s;f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=
i?f:1;return{fragment:f,cacheable:e}}function T(a){for(var b=0,d,f;(d=a[b])!=null;b++)if(!c.noData[d.nodeName.toLowerCase()]&&(f=d[H]))delete c.cache[f]}function L(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ma=A.jQuery,Na=A.$,s=A.document,U,Oa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Pa=/^.[^:#\[\.,]*$/,Qa=/\S/,
Ra=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Sa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],M,ca=Object.prototype.toString,da=Object.prototype.hasOwnProperty,ea=Array.prototype.push,R=Array.prototype.slice,V=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Oa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Sa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];
c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ua([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return U.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a)}else return!b||b.jquery?(b||U).find(a):c(b).find(a);else if(c.isFunction(a))return U.ready(a);if(a.selector!==w){this.selector=a.selector;
this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,this)},selector:"",jquery:"1.4",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=
0;ea.apply(this,a);return this},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||
c(null)},push:ea,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];o=e[i];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(o)?[]:{};a[i]=c.extend(f,j,o)}else if(o!==w)a[i]=
o}return a};c.extend({noConflict:function(a){A.$=Na;if(a)A.jQuery=Ma;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",M,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",
M);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&oa()}}},isFunction:function(a){return ca.call(a)==="[object Function]"},isArray:function(a){return ca.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||ca.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!da.call(a,"constructor")&&!da.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===w||da.call(a,b)},
isEmptyObject:function(a){for(var b in a)return false;return true},noop:function(){},globalEval:function(a){if(a&&Qa.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===w||c.isFunction(a);
if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Ra,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ea.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=
0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b===
"string"){d=a;a=d[b];b=w}else if(b&&!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){var b={browser:""};a=a.toLowerCase();if(/webkit/.test(a))b={browser:"webkit",version:/webkit[\/ ]([\w.]+)/};else if(/opera/.test(a))b={browser:"opera",version:/version/.test(a)?/version[\/ ]([\w.]+)/:/opera[\/ ]([\w.]+)/};else if(/msie/.test(a))b={browser:"msie",version:/msie ([\w.]+)/};else if(/mozilla/.test(a)&&
!/compatible/.test(a))b={browser:"mozilla",version:/rv:([\w.]+)/};b.version=(b.version&&b.version.exec(a)||[0,"0"])[1];return b},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=true;if(V)c.inArray=function(a,b){return V.call(b,a)};U=c(s);if(s.addEventListener)M=function(){s.removeEventListener("DOMContentLoaded",M,false);c.ready()};else if(s.attachEvent)M=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",
M);c.ready()}};if(V)c.inArray=function(a,b){return V.call(b,a)};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+K();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,
htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,
a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function o(){c.support.noCloneEvent=false;d.detachEvent("onclick",o)});d.cloneNode(true).fireEvent("onclick")}c(function(){var o=s.createElement("div");o.style.width=o.style.paddingLeft="1px";s.body.appendChild(o);c.boxModel=c.support.boxModel=o.offsetWidth===2;s.body.removeChild(o).style.display="none"});a=function(o){var p=s.createElement("div");o="on"+o;var n=o in
p;if(!n){p.setAttribute(o,"return;");n=typeof p[o]==="function"}return n};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var H="jQuery"+K(),Ta=0,ya={},Ua={};c.extend({cache:{},expando:H,noData:{embed:true,object:true,applet:true},data:function(a,
b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var f=a[H],e=c.cache;if(!b&&!f)return null;f||(f=++Ta);if(typeof b==="object"){a[H]=f;e=e[f]=c.extend(true,{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Ua:(e[f]={});if(d!==w){a[H]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var d=a[H],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[H]}catch(i){a.removeAttribute&&
a.removeAttribute(H)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,
a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,
a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var za=/[\n\t]/g,fa=/\s+/,Va=/\r/g,Wa=/href|src|style/,Xa=/(button|input)/i,Ya=/(button|input|object|select|textarea)/i,Za=/^(a|area)$/i,Aa=/radio|checkbox/;c.fn.extend({attr:function(a,
b){return $(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.addClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,o=b.length;j<o;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=
" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.removeClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(za," "),j=0,o=b.length;j<o;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,
b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),o=b,p=a.split(fa);e=p[i++];){o=f?o:!j.hasClass(e);j[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=
" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(za," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(Aa.test(b.type)&&
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Va,"")}return w}var o=c.isFunction(a);return this.each(function(p){var n=c(this),t=a;if(this.nodeType===1){if(o)t=a.call(this,p,n.val());if(typeof t==="number")t+="";if(c.isArray(t)&&Aa.test(this.type))this.checked=c.inArray(n.val(),t)>=0;else if(c.nodeName(this,"select")){var z=c.makeArray(t);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),z)>=0});if(!z.length)this.selectedIndex=
-1}else this.value=t}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Wa.test(b);if(b in a&&f&&!i){if(e){if(b==="type"&&Xa.test(a.nodeName)&&a.parentNode)throw"type property can't be changed";a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;
if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Ya.test(a.nodeName)||Za.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var $a=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===
3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;if(!d.guid)d.guid=c.guid++;if(f!==w){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):w};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var o,p=0;o=b[p++];){var n=o.split(".");o=n.shift();d.type=n.slice(0).sort().join(".");var t=e[o],z=this.special[o]||{};if(!t){t=e[o]={};
if(!z.setup||z.setup.call(a,f,n,d)===false)if(a.addEventListener)a.addEventListener(o,i,false);else a.attachEvent&&a.attachEvent("on"+o,i)}if(z.add)if((n=z.add.call(a,d,f,n,t))&&c.isFunction(n)){n.guid=n.guid||d.guid;d=n}t[d.guid]=d;this.global[o]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===w||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);
for(var o=0;i=b[o++];){var p=i.split(".");i=p.shift();var n=!p.length,t=c.map(p.slice(0).sort(),$a);t=new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.)?")+"(\\.|$)");var z=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var B in f[i])if(n||t.test(f[i][B].type))delete f[i][B];z.remove&&z.remove.call(a,p,j);for(e in f[i])break;if(!e){if(!z.teardown||z.teardown.call(a,p)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+
i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(B=c.data(a,"handle"))B.elem=null;c.removeData(a,"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[H]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;var i=c.data(d,"handle");i&&i.apply(d,b);var j,o;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){j=d[e];o=d["on"+e]}}catch(p){}i=c.nodeName(d,"a")&&e==="click";if(!f&&j&&!a.isDefaultPrevented()&&!i){this.triggered=true;try{d[e]()}catch(n){}}else if(o&&d["on"+e].apply(d,b)===false)a.result=false;this.triggered=false;if(!a.isPropagationStopped())(d=d.parentNode||d.ownerDocument)&&c.event.trigger(a,b,d,true)},
handle:function(a){var b,d;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},
props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[H])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||
s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&
a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;c.event.add(this,b.live,qa,b)},remove:function(a){if(a.length){var b=0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],qa)}},special:{}},beforeunload:{setup:function(a,
b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=K();this[H]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=
ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:aa,isPropagationStopped:aa,isImmediatePropagationStopped:aa};var Ba=function(a){for(var b=a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ca=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",
mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ca:Ba,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ca:Ba)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return pa("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+
d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return pa("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var ga=/textarea|input|select/i;function Da(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>
-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ha(a,b){var d=a.target,f,e;if(!(!ga.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Da(d);if(e!==f){if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",e);if(d.type!=="select"&&(f!=null||e)){a.type="change";return c.event.trigger(a,b,this)}}}}c.event.special.change={filters:{focusout:ha,click:function(a){var b=a.target,d=b.type;if(d===
"radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ha.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ha.call(this,a)},beforeactivate:function(a){a=a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Da(a))}},setup:function(a,b,d){for(var f in W)c.event.add(this,f+".specialChange."+d.guid,W[f]);return ga.test(this.nodeName)},
remove:function(a,b){for(var d in W)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),W[d]);return ga.test(this.nodeName)}};var W=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,
f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){thisObject=e;e=f;f=w}var j=b==="one"?c.proxy(e,function(o){c(this).unbind(o,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e,thisObject):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,
b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||
a)},live:function(a,b,d){if(c.isFunction(b)){d=b;b=w}c(this.context).bind(ra(a,this.selector),{data:b,selector:this.selector,live:a},d);return this},die:function(a,b){c(this.context).unbind(ra(a,this.selector),b?{guid:b.guid+this.selector+a}:null);return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?
this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",k,m=0;g[m];m++){k=g[m];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===
k){y=m[u.sizset];break}if(u.nodeType===1&&!q){u.sizcache=k;u.sizset=r}if(u.nodeName.toLowerCase()===h){y=u;break}u=u[g]}m[r]=y}}}function d(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===k){y=m[u.sizset];break}if(u.nodeType===1){if(!q){u.sizcache=k;u.sizset=r}if(typeof h!=="string"){if(u===h){y=true;break}}else if(p.filter(h,[u]).length>0){y=u;break}}u=u[g]}m[r]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
e=0,i=Object.prototype.toString,j=false,o=true;[0,0].sort(function(){o=false;return 0});var p=function(g,h,k,m){k=k||[];var r=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return k;for(var q=[],v,u,y,S,I=true,N=x(h),J=g;(f.exec(""),v=f.exec(J))!==null;){J=v[3];q.push(v[1]);if(v[2]){S=v[3];break}}if(q.length>1&&t.exec(g))if(q.length===2&&n.relative[q[0]])u=ia(q[0]+q[1],h);else for(u=n.relative[q[0]]?[h]:p(q.shift(),h);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();
u=ia(g,u)}else{if(!m&&q.length>1&&h.nodeType===9&&!N&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){v=p.find(q.shift(),h,N);h=v.expr?p.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:q.pop(),set:B(m)}:p.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&h.parentNode?h.parentNode:h,N);u=v.expr?p.filter(v.expr,v.set):v.set;if(q.length>0)y=B(u);else I=false;for(;q.length;){var E=q.pop();v=E;if(n.relative[E])v=q.pop();else E="";if(v==null)v=h;n.relative[E](y,v,N)}}else y=[]}y||(y=u);if(!y)throw"Syntax error, unrecognized expression: "+
(E||g);if(i.call(y)==="[object Array]")if(I)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&F(h,y[g])))k.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&k.push(u[g]);else k.push.apply(k,y);else B(y,k);if(S){p(S,r,k,m);p.uniqueSort(k)}return k};p.uniqueSort=function(g){if(D){j=o;g.sort(D);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};p.matches=function(g,h){return p(g,null,null,h)};p.find=function(g,h,k){var m,r;if(!g)return[];
for(var q=0,v=n.order.length;q<v;q++){var u=n.order[q];if(r=n.leftMatch[u].exec(g)){var y=r[1];r.splice(1,1);if(y.substr(y.length-1)!=="\\"){r[1]=(r[1]||"").replace(/\\/g,"");m=n.find[u](r,h,k);if(m!=null){g=g.replace(n.match[u],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};p.filter=function(g,h,k,m){for(var r=g,q=[],v=h,u,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var I in n.filter)if((u=n.leftMatch[I].exec(g))!=null&&u[2]){var N=n.filter[I],J,E;E=u[1];y=false;u.splice(1,1);if(E.substr(E.length-
1)!=="\\"){if(v===q)q=[];if(n.preFilter[I])if(u=n.preFilter[I](u,v,k,q,m,S)){if(u===true)continue}else y=J=true;if(u)for(var X=0;(E=v[X])!=null;X++)if(E){J=N(E,u,X,v);var Ea=m^!!J;if(k&&J!=null)if(Ea)y=true;else v[X]=false;else if(Ea){q.push(E);y=true}}if(J!==w){k||(v=q);g=g.replace(n.match[I],"");if(!y)return[];break}}}if(g===r)if(y==null)throw"Syntax error, unrecognized expression: "+g;else break;r=g}return v};var n=p.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
relative:{"+":function(g,h){var k=typeof h==="string",m=k&&!/\W/.test(h);k=k&&!m;if(m)h=h.toLowerCase();m=0;for(var r=g.length,q;m<r;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=k||q&&q.nodeName.toLowerCase()===h?q||false:q===h}k&&p.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,r=g.length;m<r;m++){var q=g[m];if(q){k=q.parentNode;g[m]=k.nodeName.toLowerCase()===h?k:false}}}else{m=0;for(r=g.length;m<r;m++)if(q=g[m])g[m]=
k?q.parentNode:q.parentNode===h;k&&p.filter(h,g,true)}},"":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("parentNode",h,m,g,q,k)},"~":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("previousSibling",h,m,g,q,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];
h=h.getElementsByName(g[1]);for(var m=0,r=h.length;m<r;m++)h[m].getAttribute("name")===g[1]&&k.push(h[m]);return k.length===0?null:k}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,m,r,q){g=" "+g[1].replace(/\\/g,"")+" ";if(q)return g;q=0;for(var v;(v=h[q])!=null;q++)if(v)if(r^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||m.push(v);else if(k)h[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,m,r,q){h=g[1].replace(/\\/g,"");if(!q&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,m,r){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=p(g[3],null,null,h);else{g=p.filter(g[3],h,k,true^r);k||m.push.apply(m,
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!p(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
setFilters:{first:function(g,h){return h===0},last:function(g,h,k,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,m){var r=h[1],q=n.filters[r];if(q)return q(g,k,h,m);else if(r==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(r==="not"){h=
h[3];k=0;for(m=h.length;k<m;k++)if(h[k]===g)return false;return true}else throw"Syntax error, unrecognized expression: "+r;},CHILD:function(g,h){var k=h[1],m=g;switch(k){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(k==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":k=h[2];var r=h[3];if(k===1&&r===0)return true;h=h[0];var q=g.parentNode;if(q&&(q.sizcache!==h||!g.nodeIndex)){var v=0;for(m=q.firstChild;m;m=
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;q.sizcache=h}g=g.nodeIndex-r;return k===0?g===0:g%k===0&&g/k>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=n.attrHandle[k]?n.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
"="?k===h:m==="*="?k.indexOf(h)>=0:m==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:m==="!="?k!==h:m==="^="?k.indexOf(h)===0:m==="$="?k.substr(k.length-h.length)===h:m==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,m){var r=n.setFilters[h[2]];if(r)return r(g,k,h,m)}}},t=n.match.POS;for(var z in n.match){n.match[z]=new RegExp(n.match[z].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[z]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[z].source.replace(/\\(\d+)/g,function(g,
h){return"\\"+(h-0+1)}))}var B=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){B=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,m=g.length;k<m;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var D;if(s.documentElement.compareDocumentPosition)D=function(g,h){if(!g.compareDocumentPosition||
!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in s.documentElement)D=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(s.createRange)D=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),m=
h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)j=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=s.documentElement;k.insertBefore(g,k.firstChild);if(s.getElementById(h)){n.find.ID=function(m,r,q){if(typeof r.getElementById!=="undefined"&&!q)return(r=r.getElementById(m[1]))?r.id===m[1]||typeof r.getAttributeNode!=="undefined"&&
r.getAttributeNode("id").nodeValue===m[1]?[r]:w:[]};n.filter.ID=function(m,r){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===r}}k.removeChild(g);k=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;k[m];m++)k[m].nodeType===1&&h.push(k[m]);k=h}return k};g.innerHTML="<a href='#'></a>";
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=p,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){p=function(m,r,q,v){r=r||s;if(!v&&r.nodeType===9&&!x(r))try{return B(r.querySelectorAll(m),q)}catch(u){}return g(m,r,q,v)};for(var k in g)p[k]=g[k];h=null}}();
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,k,m){if(typeof k.getElementsByClassName!=="undefined"&&!m)return k.getElementsByClassName(h[1])};g=null}}})();var F=s.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,
h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ia=function(g,h){var k=[],m="",r;for(h=h.nodeType?[h]:h;r=n.match.PSEUDO.exec(g);){m+=r[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;r=0;for(var q=h.length;r<q;r++)p(g,h[r],k);return p.filter(m,k)};c.find=p;c.expr=p.selectors;c.expr[":"]=c.expr.filters;c.unique=p.uniqueSort;c.getText=a;c.isXMLDoc=x;c.contains=F})();var ab=/Until$/,bb=/^(?:parents|prevUntil|prevAll)/,
cb=/,/;R=Array.prototype.slice;var Fa=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Pa.test(b))return c.filter(b,f,!d);else b=c.filter(b,a)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Fa(this,a,false),"not",a)},filter:function(a){return this.pushStack(Fa(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i=
{},j;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var p=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,t){for(;t&&t.ownerDocument&&t!==b;){if(p?p.index(t)>-1:c(t).is(a))return t;t=t.parentNode}return null})},index:function(a){if(!a||typeof a===
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(sa(a[0])||sa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);ab.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||cb.test(f))&&bb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||!c(a).is(d));){a.nodeType===
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ga=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,db=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,hb=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},G={option:[1,"<select multiple='multiple'>","</select>"],
legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};G.optgroup=G.option;G.tbody=G.tfoot=G.colgroup=G.caption=G.thead;G.th=G.td;if(!c.support.htmlSerialize)G._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);
return d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.getText(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
wrapInner:function(a){return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&
this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,
"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ga,"").replace(Y,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ta(this,b);ta(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===
1?this[0].innerHTML.replace(Ga,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!Y.test(a))&&!G[(Ha.exec(a)||["",""])[1].toLowerCase()])try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){T(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
this[0].parentNode){c.isFunction(a)||(a=c(a).detach());return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(t){return c.nodeName(t,"table")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}var e,i,j=a[0],o=[];if(c.isFunction(j))return this.each(function(t){var z=
c(this);a[0]=j.call(this,t,b?z.html():w);return z.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ua(a,this,o);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var p=0,n=this.length;p<n;p++)d.call(b?f(this[p],i):this[p],e.cacheable||this.length>1||p>0?e.fragment.cloneNode(true):e.fragment)}o&&c.each(o,La)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},
function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){T(this.getElementsByTagName("*"));T([this])}this.parentNode&&this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&T(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},
function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j==="string"){j=j.replace(db,hb);var o=(Ha.exec(j)||["",""])[1].toLowerCase(),p=G[o]||G._default,n=p[0];i=b.createElement("div");for(i.innerHTML=p[1]+j+p[2];n--;)i=i.lastChild;
if(!c.support.tbody){n=fb.test(j);o=o==="table"&&!n?i.firstChild&&i.firstChild.childNodes:p[1]==="<table>"&&!n?i.childNodes:[];for(p=o.length-1;p>=0;--p)c.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!c.support.leadingWhitespace&&Y.test(j)&&i.insertBefore(b.createTextNode(Y.exec(j)[0]),i.firstChild);j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()===
"text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e}});var ib=/z-?index|font-?weight|opacity|zoom|line-?height/i,Ia=/alpha\([^)]*\)/,Ja=/opacity=([^)]*)/,ja=/float/i,ka=/-([a-z])/ig,jb=/([A-Z])/g,kb=/^-?\d+(?:px)?$/i,lb=/^-?\d/,mb={position:"absolute",visibility:"hidden",display:"block"},nb=["Left","Right"],ob=["Top","Bottom"],pb=s.defaultView&&
s.defaultView.getComputedStyle,Ka=c.support.cssFloat?"cssFloat":"styleFloat",la=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return $(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!ib.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""===
"NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ia.test(a)?a.replace(Ia,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ja.exec(f.filter)[1])/100+"":""}if(ja.test(b))b=Ka;b=b.replace(ka,la);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?nb:ob;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=
parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,mb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Ja.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ja.test(b))b=Ka;if(!d&&e&&e[b])f=e[b];else if(pb){if(ja.test(b))b="float";b=b.replace(jb,"-$1").toLowerCase();e=
a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ka,la);f=a.currentStyle[b]||a.currentStyle[d];if(!kb.test(f)&&lb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=
f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var qb=K(),rb=/<script(.|\s)*?\/script>/gi,sb=/select|textarea/i,tb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,O=/=\?(&|$)/,ma=/\?/,ub=/(\?|&)_=.*?(&|$)/,vb=/^(\w+:)?\/\/([^\/?#]+)/,
wb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}c.ajax({url:a,type:f,dataType:"html",data:b,context:this,complete:function(i,j){if(j==="success"||j==="notmodified")this.html(e?c("<div />").append(i.responseText.replace(rb,
"")).find(e):i.responseText);d&&this.each(d,[i.responseText,j,i])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||sb.test(this.nodeName)||tb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});
c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},
ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",
text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(p,o,j,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(p,x,j);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(r,q){(e.context?c(e.context):c.event).trigger(r,q)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,o,p=e.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,
e.traditional);if(e.dataType==="jsonp"){if(n==="GET")O.test(e.url)||(e.url+=(ma.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!O.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&O.test(e.data)||O.test(e.url))){i=e.jsonpCallback||"jsonp"+qb++;if(e.data)e.data=(e.data+"").replace(O,"="+i+"$1");e.url=e.url.replace(O,"="+i+"$1");e.dataType="script";A[i]=A[i]||function(r){o=r;b();d();A[i]=w;try{delete A[i]}catch(q){}B&&
B.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&n==="GET"){var t=K(),z=e.url.replace(ub,"$1_="+t+"$2");e.url=z+(z===e.url?(ma.test(e.url)?"&":"?")+"_="+t:"")}if(e.data&&n==="GET")e.url+=(ma.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");t=(t=vb.exec(e.url))&&(t[1]&&t[1]!==location.protocol||t[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&t){var B=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");
C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!i){var D=false;C.onload=C.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;b();d();C.onload=C.onreadystatechange=null;B&&C.parentNode&&B.removeChild(C)}}}B.insertBefore(C,B.firstChild);return w}var F=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",
e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}t||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ia){}if(e.beforeSend&&e.beforeSend.call(p,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",
[x,e]);var g=x.onreadystatechange=function(r){if(!x||x.readyState===0){F||d();F=true;if(x)x.onreadystatechange=c.noop}else if(!F&&x&&(x.readyState===4||r==="timeout")){F=true;x.onreadystatechange=c.noop;j=r==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";if(j==="success")try{o=c.httpData(x,e.dataType,e)}catch(q){j="parsererror"}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,x,j);d();r==="timeout"&&x.abort();if(e.async)x=
null}};try{var h=x.abort;x.abort=function(){if(x){h.call(x);if(x)x.readyState=0}g()}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){x&&!F&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||A,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol===
"file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;if(e&&a.documentElement.nodeName==="parsererror")throw"parsererror";if(d&&
d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))a=A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+a))();else throw"Invalid JSON: "+a;else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(e,i){i=
c.isFunction(i)?i():i;f[f.length]=encodeURIComponent(e)+"="+encodeURIComponent(i)}var f=[];if(b===w)b=c.ajaxSettings.traditional;c.isArray(a)||a.jquery?c.each(a,function(){d(this.name,this.value)}):c.each(a,function e(i,j){if(c.isArray(j))c.each(j,function(o,p){b?d(i,p):e(i+"["+(typeof p==="object"||c.isArray(p)?o:"")+"]",p)});else!b&&j!=null&&typeof j==="object"?c.each(j,function(o,p){e(i+"["+o+"]",p)}):d(i,j)});return f.join("&").replace(wb,"+")}});var na={},xb=/toggle|show|hide/,yb=/^([+-]=)?([\d+-.]+)(.*)$/,
Z,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a!=null)return this.animate(L("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(na[d])f=na[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
na[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a!=null)return this.animate(L("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(L("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,o=this.nodeType===1&&c(this).is(":hidden"),
p=this;for(j in a){var n=j.replace(ka,la);if(j!==n){a[n]=a[j];delete a[j];j=n}if(a[j]==="hide"&&o||a[j]==="show"&&!o)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(t,z){var B=new c.fx(p,i,t);if(xb.test(z))B[z==="toggle"?o?"show":"hide":z](a);
else{var C=yb.exec(z),D=B.cur(true)||0;if(C){z=parseFloat(C[2]);var F=C[3]||"px";if(F!=="px"){p.style[t]=(z||1)+F;D=(z||1)/B.cur(true)*D;p.style[t]=D+F}if(C[1])z=(C[1]==="-="?-1:1)*z+D;B.custom(D,z,F)}else B.custom(D,z,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:L("show",1),slideUp:L("hide",1),slideToggle:L("toggle",
1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=K();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!Z)Z=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=K(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(Z);Z=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(t){c.offset.setOffset(this,a,t)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
b,e=b.ownerDocument,i,j=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var p=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;p-=b.scrollTop;n-=b.scrollLeft;if(b===d){p+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){p+=parseFloat(i.borderTopWidth)||
0;n+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){p+=parseFloat(i.borderTopWidth)||0;n+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){p+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){p+=Math.max(j.scrollTop,o.scrollTop);n+=Math.max(j.scrollLeft,o.scrollLeft)}return{top:p,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),
d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==w)return this.each(function(){if(i=wa(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=wa(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+
b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
+39
View File
@@ -0,0 +1,39 @@
/*=============================================================================
Copyright 2002 William E. Kempf
Distributed under the Boost Software License, Version 1.0. (See accompany-
ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
H1
{
FONT-SIZE: 200%;
COLOR: #00008B;
}
H2
{
FONT-SIZE: 150%;
}
H3
{
FONT-SIZE: 125%;
}
H4
{
FONT-SIZE: 108%;
}
/*
BODY
{
FONT-SIZE: 100%;
BACKGROUND-COLOR: #ffffff;
COLOR: #000000;
}
*/
/*
PRE
{
MARGIN-LEFT: 2em;
FONT-FAMILY: Courier,
monospace;
}
*/
+92
View File
@@ -0,0 +1,92 @@
body
{
font-size: 12pt;
}
pre
{
border-right: gray 1pt solid;
border-top: gray 1pt solid;
border-left: gray 1pt solid;
border-bottom: gray 1pt solid;
margin-left: 0pt;
background-color: #EEEEEE;
font-size: smaller;
}
.button
{
color : black;
background-color : #FFFFFF;
border-radius: 0px;
border: outset 3px #d6d6d6;
text-decoration : none;
outline:none;
}
.fs
{
font-family: courier;
font-size: 11pt;
font-weight: bold;
color: maroon;
}
.code_string
{
font-family: courier;
font-size: 11pt;
font-weight: bold;
color: #bc8f8f;
}
.code
{
/*
top: 0;
border-style: inset;
margin-top: 5pt;
margin-bottom: 5pt;
margin-left: 5pt;
margin-right: 5pt;
border-width: 2px 2px 2px 2px ;
*/
font-family: courier;
font-size: 11pt;
font-weight: bold;
color: #228b22;
}
.byte
{
border-right: gray 1pt solid;
border-top: gray 1pt solid;
border-left: gray 1pt solid;
border-bottom: gray 1pt solid;
margin-left: 2pt;
margin-right: 2pt;
font-family: courier;
font-size: 11pt;
font-weight: bold;
color: #000000;
background-color: #eeeeee;
}
#pre
{
border-right: gray 1pt solid;
border-top: gray 1pt solid;
border-left: gray 1pt solid;
border-bottom: gray 1pt solid;
margin-left: 1pt;
margin-right: 1pt;
background-color: #EEEEEE;
}
/*
(C) Copyright 2011 François Mauger.
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)
*/
+2348
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -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 serializaton of pointers to only such classes would diminish the applicability
of the library.
<h3>Usage</h3>
@@ -46,7 +46,7 @@ const void_cast_detail::void_caster &
void_cast_register(
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
+4 -4
View File
@@ -43,7 +43,7 @@ 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
@@ -59,7 +59,7 @@ 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>
@@ -91,7 +91,7 @@ public:
};
</code></pre>
that can be serialized just like any other object.
Its default serialization is to use serialize each array element.
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.
@@ -171,7 +171,7 @@ xml_oarchive & operator&(const boost::serialization::nvp<T> & t)
}
</code></pre>
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
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);
+25 -38
View File
@@ -7,49 +7,36 @@
# See http://www.boost.org/libs/serialization for the library home page.
project libs/serialization/example
: id serialization_test
: id serialization_example
: requirements <library>../build//boost_serialization
;
rule demo_bsl_run ( demo-name : othersources * : requirements * )
{
return [ run
# sources
$(demo-name).cpp
$(othersources).cpp
: # command
: # input files
: # requirements
# toolset suppress-warnings
<toolset>gcc:<cxxflags>"-Wno-non-virtual-dtor -Wno-ctor-dtor-privacy"
<toolset>msvc-8.0:<cxxflags>"-wd4996"
<toolset>borland:<cxxflags>"-w-8080 -w-8071 -w-8057 -w-8062 -w-8008 -w-0018 -w-8066"
# toolset optimizations
<toolset>gcc:<cxxflags>"-ftemplate-depth-255"
<toolset>msvc:<cxxflags>"-Gy"
# toolset shared library support
<toolset>como,<runtime-link>shared:<build>no
<toolset>msvc,<stdlib>stlport,<runtime-link>shared:<build>no
<toolset>cw,<runtime-link>static:<build>no
$(requirements)
: # test name
$(demo-name)
]
;
}
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-bsl-run_polymorphic_archive
;
test-suite "demo-suite" :
# demos
[ demo_bsl_run demo ]
[ demo_bsl_run demo_auto_ptr ]
[ demo_bsl_run demo_exception ]
[ demo_bsl_run demo_fast_archive ]
[ demo_bsl_run demo_pimpl : demo_pimpl_A ]
[ demo_bsl_run demo_polymorphic : demo_polymorphic_A ]
[ demo_bsl_run demo_portable_archive : portable_binary_iarchive portable_binary_oarchive ]
[ demo_bsl_run demo_shared_ptr ]
[ demo_bsl_run demo_xml ]
[ demo_bsl_run demo_xml_save ]
[ demo_bsl_run demo_xml_load : : <dependency>demo_xml_save ]
[ 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 ]
;
+1 -1
View File
@@ -265,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)
{
+5 -5
View File
@@ -29,13 +29,13 @@ 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);
+4 -7
View File
@@ -2,7 +2,7 @@
#define BOOST_SERIALIZATION_TEST_A_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -20,6 +20,7 @@
#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)
@@ -245,13 +246,9 @@ inline bool A::operator==(const A &rhs) const
return false;
if(v != rhs.v)
return false;
if(w == 0 && std::fabs(rhs.w) > std::numeric_limits<float>::epsilon())
if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)
return false;
if(std::fabs(rhs.w/w - 1.0) > std::numeric_limits<float>::epsilon())
return false;
if(x == 0 && std::fabs(rhs.x - x) > std::numeric_limits<float>::epsilon())
return false;
if(std::fabs(rhs.x/x - 1.0) > std::numeric_limits<float>::epsilon())
if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)
return false;
if(0 != y.compare(rhs.y))
return false;
+3 -7
View File
@@ -2,7 +2,7 @@
#define BOOST_SERIALIZATION_TEST_A_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -244,14 +244,10 @@ inline bool A::operator==(const A &rhs) const
if(u != rhs.u)
return false;
if(v != rhs.v)
return false;
if(w == 0 && std::fabs(rhs.w) > std::numeric_limits<float>::epsilon())
return false;
if(std::fabs(rhs.w/w - 1.0) > std::numeric_limits<float>::epsilon())
if(std::abs( boost::math::float_distance(w, rhs.w)) > 1)
return false;
if(x == 0 && std::fabs(rhs.x - x) > std::numeric_limits<float>::epsilon())
return false;
if(std::fabs(rhs.x/x - 1.0) > std::numeric_limits<float>::epsilon())
if(std::abs( boost::math::float_distance(x, rhs.x)) > 1)
return false;
if(0 != y.compare(rhs.y))
return false;
+4 -3
View File
@@ -2,7 +2,7 @@
#define BOOST_SERIALIZATION_TEST_B_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -17,6 +17,7 @@
// 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)
@@ -104,8 +105,8 @@ inline bool B::operator==(const B &rhs) const
&& t == rhs.t
&& u == rhs.u
&& v == rhs.v
&& std::fabs(w - rhs.w) <= std::numeric_limits<float>::round_error()
&& std::fabs(x - rhs.x) <= std::numeric_limits<float>::round_error()
&& std::abs( boost::math::float_distance(w, rhs.w)) < 2
&& std::abs( boost::math::float_distance(x, rhs.x)) < 2
;
}
+3 -3
View File
@@ -2,7 +2,7 @@
#define BOOST_SERIALIZATION_TEST_B_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -104,8 +104,8 @@ inline bool B::operator==(const B &rhs) const
&& t == rhs.t
&& u == rhs.u
&& v == rhs.v
&& std::fabs(w - rhs.w) <= std::numeric_limits<float>::round_error()
&& std::fabs(x - rhs.x) <= std::numeric_limits<float>::round_error()
&& std::abs( boost::math::float_distance(w, rhs.w)) < 2
&& std::abs( boost::math::float_distance(x, rhs.x)) < 2
;
}
+12 -13
View File
@@ -11,7 +11,6 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_array.hpp>
#include <boost/serialization/pfto.hpp>
#define BOOST_ARCHIVE_SOURCE
#include <boost/archive/binary_oarchive_impl.hpp>
@@ -61,26 +60,26 @@ public:
// 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){
base_t::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:
@@ -129,24 +128,24 @@ public:
// 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){
base_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:
+2 -2
View File
@@ -10,16 +10,16 @@
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <string>
#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.
+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 routes
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 aother routes
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;
}
+12 -13
View File
@@ -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
);
+7 -2
View File
@@ -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;
+7 -1
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"
@@ -23,6 +27,7 @@ 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;
@@ -44,7 +49,8 @@ public:
;
}
A() :
c(std::rand()),
c(0xFF & std::rand()),
pa(0),
i(std::rand()),
i2(0x80),
ui(std::rand()),
+1 -1
View File
@@ -82,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";
+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 routes
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 aother routes
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 routes
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 aother routes
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;
}
+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 implemenation
// 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 clas
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
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_IARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_POLYMORPHIC_PORTABLE_BINARY_OARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
+1 -2
View File
@@ -7,13 +7,12 @@
// http://www.boost.org/LICENSE_1_0.txt)
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
#include <boost/serialization/pfto.hpp>
#include <boost/static_assert.hpp>
#include <climits>
+10 -7
View File
@@ -10,7 +10,6 @@
#include <istream>
#include <string>
//#include <cstring> // memcpy
#include <boost/detail/endian.hpp>
#include <boost/serialization/throw_exception.hpp>
@@ -48,7 +47,7 @@ portable_binary_iarchive::load_impl(boost::intmax_t & l, char maxsize){
#else
if(m_flags & endian_big)
#endif
reverse_bytes(size, cptr);
reverse_bytes(size, cptr);
if(negative)
l = -l;
@@ -56,11 +55,11 @@ portable_binary_iarchive::load_impl(boost::intmax_t & l, char maxsize){
void
portable_binary_iarchive::load_override(
boost::archive::class_name_type & t, int
boost::archive::class_name_type & t
){
std::string cn;
cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
load_override(cn, 0);
load_override(cn);
if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))
boost::serialization::throw_exception(
boost::archive::archive_exception(
@@ -85,11 +84,11 @@ portable_binary_iarchive::init(unsigned int flags){
);
// make sure the version of the reading archive library can
// support the format of the archive being read
boost::archive::version_type input_library_version;
boost::archive::library_version_type input_library_version;
* this >> input_library_version;
// extra little .t is to get around borland quirk
if(boost::archive::BOOST_ARCHIVE_VERSION() < input_library_version.t)
if(boost::archive::BOOST_ARCHIVE_VERSION() < input_library_version)
boost::serialization::throw_exception(
boost::archive::archive_exception(
boost::archive::archive_exception::unsupported_version
@@ -112,12 +111,16 @@ portable_binary_iarchive::init(unsigned int flags){
m_flags = x << CHAR_BIT;
}
#include <boost/archive/impl/archive_serializer_map.ipp>
#include <boost/archive/impl/basic_binary_iprimitive.ipp>
namespace boost {
namespace archive {
namespace detail {
template class archive_serializer_map<portable_binary_iarchive>;
}
template class basic_binary_iprimitive<
portable_binary_iarchive,
std::istream::char_type,
+33 -21
View File
@@ -2,7 +2,7 @@
#define PORTABLE_BINARY_IARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -23,10 +23,10 @@
#include <istream>
#include <boost/serialization/string.hpp>
#include <boost/serialization/item_version_type.hpp>
#include <boost/archive/archive_exception.hpp>
#include <boost/archive/basic_binary_iprimitive.hpp>
#include <boost/archive/detail/common_iarchive.hpp>
#include <boost/archive/shared_ptr_helper.hpp>
#include <boost/archive/detail/register_archive.hpp>
#include "portable_binary_archive.hpp"
@@ -35,19 +35,20 @@
// exception to be thrown if integer read from archive doesn't fit
// variable being loaded
class portable_binary_iarchive_exception :
public virtual boost::archive::archive_exception
public boost::archive::archive_exception
{
public:
typedef enum {
incompatible_integer_size
} exception_code;
enum exception_code {
incompatible_integer_size
} m_exception_code ;
portable_binary_iarchive_exception(exception_code c = incompatible_integer_size ) :
boost::archive::archive_exception(boost::archive::archive_exception::other_exception)
boost::archive::archive_exception(boost::archive::archive_exception::other_exception),
m_exception_code(c)
{}
virtual const char *what( ) const throw( )
{
const char *msg = "programmer error";
switch(code){
switch(m_exception_code){
case incompatible_integer_size:
msg = "integer cannot be represented";
break;
@@ -73,8 +74,6 @@ class portable_binary_iarchive :
public boost::archive::detail::common_iarchive<
portable_binary_iarchive
>
,
public boost::archive::detail::shared_ptr_helper
{
typedef boost::archive::basic_binary_iprimitive<
portable_binary_iarchive,
@@ -104,7 +103,26 @@ protected:
boost::intmax_t l;
load_impl(l, sizeof(T));
// use cast to avoid compile time warning
t = static_cast<T>(l);
//t = static_cast< T >(l);
t = T(l);
}
void load(boost::serialization::item_version_type & t){
boost::intmax_t l;
load_impl(l, sizeof(boost::serialization::item_version_type));
// use cast to avoid compile time warning
t = boost::serialization::item_version_type(l);
}
void load(boost::archive::version_type & t){
boost::intmax_t l;
load_impl(l, sizeof(boost::archive::version_type));
// use cast to avoid compile time warning
t = boost::archive::version_type(l);
}
void load(boost::archive::class_id_type & t){
boost::intmax_t l;
load_impl(l, sizeof(boost::archive::class_id_type));
// use cast to avoid compile time warning
t = boost::archive::class_id_type(static_cast<int>(l));
}
void load(std::string & t){
this->primitive_base_t::load(t);
@@ -130,21 +148,15 @@ protected:
void load(unsigned char & t){
this->primitive_base_t::load(t);
}
// intermediate level to support override of operators
// fot templates in the absence of partial function
// template ordering
typedef boost::archive::detail::common_iarchive<portable_binary_iarchive>
detail_common_iarchive;
template<class T>
void load_override(T & t, BOOST_PFTO int){
this->detail_common_iarchive::load_override(t, 0);
void load_override(T & t){
this->detail_common_iarchive::load_override(t);
}
void load_override(boost::archive::class_name_type & t, int);
void load_override(boost::archive::class_name_type & t);
// binary files don't include the optional information
void load_override(
boost::archive::class_id_optional_type & /* t */,
int
){}
void load_override(boost::archive::class_id_optional_type &){}
void init(unsigned int flags);
public:
+6 -1
View File
@@ -70,7 +70,7 @@ portable_binary_oarchive::init(unsigned int flags) {
);
* this << file_signature;
// write library version
const boost::archive::version_type v(
const boost::archive::library_version_type v(
boost::archive::BOOST_ARCHIVE_VERSION()
);
* this << v;
@@ -78,11 +78,16 @@ portable_binary_oarchive::init(unsigned int flags) {
save(static_cast<unsigned char>(m_flags >> CHAR_BIT));
}
#include <boost/archive/impl/archive_serializer_map.ipp>
#include <boost/archive/impl/basic_binary_oprimitive.ipp>
namespace boost {
namespace archive {
namespace detail {
template class archive_serializer_map<portable_binary_oarchive>;
}
template class basic_binary_oprimitive<
portable_binary_oarchive,
std::ostream::char_type,
+6 -7
View File
@@ -2,7 +2,7 @@
#define PORTABLE_BINARY_OARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -34,7 +34,7 @@
// exception to be thrown if integer read from archive doesn't fit
// variable being loaded
class portable_binary_oarchive_exception :
public virtual boost::archive::archive_exception
public boost::archive::archive_exception
{
public:
typedef enum {
@@ -131,18 +131,17 @@ protected:
typedef boost::archive::detail::common_oarchive<portable_binary_oarchive>
detail_common_oarchive;
template<class T>
void save_override(T & t, BOOST_PFTO int){
this->detail_common_oarchive::save_override(t, 0);
void save_override(T & t){
this->detail_common_oarchive::save_override(t);
}
// explicitly convert to char * to avoid compile ambiguities
void save_override(const boost::archive::class_name_type & t, int){
void save_override(const boost::archive::class_name_type & t){
const std::string s(t);
* this << s;
}
// binary files don't include the optional information
void save_override(
const boost::archive::class_id_optional_type & /* t */,
int
const boost::archive::class_id_optional_type & /* t */
){}
void init(unsigned int flags);
+167
View File
@@ -0,0 +1,167 @@
#ifndef BOOST_SIMPLE_LOG_ARCHIVE_HPP
#define BOOST_SIMPLE_LOG_ARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// simple_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 <ostream>
#include <cstddef> // std::size_t
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::size_t;
} // namespace std
#endif
#include <boost/type_traits/is_enum.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/access.hpp>
/////////////////////////////////////////////////////////////////////////
// log data to an output stream. This illustrates a simpler implemenation
// of text output which is useful for getting a formatted display of
// any serializable class. Intended to be useful as a debugging aid.
class simple_log_archive {
std::ostream & m_os;
unsigned int m_depth;
template<class Archive>
struct save_enum_type {
template<class T>
static void invoke(Archive &ar, const T &t){
ar.m_os << static_cast<int>(t);
}
};
template<class Archive>
struct save_primitive {
template<class T>
static void invoke(Archive & ar, const T & t){
ar.m_os << t;
}
};
template<class Archive>
struct save_only {
template<class T>
static void invoke(Archive & ar, const T & t){
// make sure call is routed through the highest interface that might
// be specialized by the user.
boost::serialization::serialize_adl(
ar,
const_cast<T &>(t),
::boost::serialization::version< T >::value
);
}
};
template<class T>
void save(const T &t){
typedef
BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<boost::is_enum< T >,
boost::mpl::identity<save_enum_type<simple_log_archive> >,
//else
BOOST_DEDUCED_TYPENAME boost::mpl::eval_if<
// if its primitive
boost::mpl::equal_to<
boost::serialization::implementation_level< T >,
boost::mpl::int_<boost::serialization::primitive_type>
>,
boost::mpl::identity<save_primitive<simple_log_archive> >,
// else
boost::mpl::identity<save_only<simple_log_archive> >
> >::type typex;
typex::invoke(*this, t);
}
#ifndef BOOST_NO_STD_WSTRING
void save(const std::wstring &ws){
m_os << "wide string types not suported in log archive";
}
#endif
public:
///////////////////////////////////////////////////
// Implement requirements for archive concept
typedef boost::mpl::bool_<false> is_loading;
typedef boost::mpl::bool_<true> is_saving;
// this can be a no-op since we ignore pointer polymorphism
template<class T>
void register_type(const T * = NULL){}
unsigned int get_library_version(){
return 0;
}
void
save_binary(const void *address, std::size_t count){
m_os << "save_binary not implemented";
}
// the << operators
template<class T>
simple_log_archive & operator<<(T const & t){
m_os << ' ';
save(t);
return * this;
}
template<class T>
simple_log_archive & operator<<(T * const t){
m_os << " ->";
if(NULL == t)
m_os << " null";
else
*this << * t;
return * this;
}
template<class T, int N>
simple_log_archive & operator<<(const T (&t)[N]){
return *this << boost::serialization::make_array(
static_cast<const T *>(&t[0]),
N
);
}
template<class T>
simple_log_archive & operator<<(const boost::serialization::nvp< T > & t){
m_os << '\n'; // start line with each named object
// indent according to object depth
for(unsigned int i = 0; i < m_depth; ++i)
m_os << ' ';
++m_depth;
m_os << t.name(); // output the name of the object
* this << t.const_value();
--m_depth;
return * this;
}
// the & operator
template<class T>
simple_log_archive & operator&(const T & t){
return * this << t;
}
///////////////////////////////////////////////
simple_log_archive(std::ostream & os) :
m_os(os),
m_depth(0)
{}
};
#endif // BOOST_SIMPLE_LOG_ARCHIVE_HPP
-55
View File
@@ -1,55 +0,0 @@
#ifndef BOOST_ARCHIVE_ADD_FACET_HPP
#define BOOST_ARCHIVE_ADD_FACET_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// add_facet.hpp
// (C) Copyright 2003 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 <locale>
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
// does STLport uses native STL for locales?
#if (defined(__SGI_STL_PORT)&& defined(_STLP_NO_OWN_IOSTREAMS))
// and this native STL lib is old Dinkumware (has not defined _CPPLIB_VER)
# if (defined(_YVALS) && !defined(__IBMCPP__)) || !defined(_CPPLIB_VER)
# define BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT
# endif
#endif
namespace boost {
namespace archive {
template<class Facet>
inline std::locale *
add_facet(const std::locale &l, Facet * f){
return
#if defined BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT
// std namespace used for native locale
new std::locale(std::_Addfac(l, f));
#elif BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) // old Dinkumwar
// std namespace used for native locale
new std::locale(std::_Addfac(l, f));
#else
// standard compatible
new std::locale(l, f);
#endif
}
} // namespace archive
} // namespace boost
#undef BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT
#endif // BOOST_ARCHIVE_ADD_FACET_HPP
+23 -19
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -17,11 +17,10 @@
// See http://www.boost.org for updates, documentation, and revision history.
#include <exception>
#include <cassert>
#include <boost/assert.hpp>
#include <string>
#include <boost/config.hpp>
#include <boost/preprocessor/empty.hpp>
#include <boost/archive/detail/decl.hpp>
// note: the only reason this is in here is that windows header
@@ -40,14 +39,21 @@ namespace archive {
//////////////////////////////////////////////////////////////////////
// exceptions thrown by archives
//
class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_exception :
class BOOST_SYMBOL_VISIBLE archive_exception :
public virtual std::exception
{
private:
char m_buffer[128];
protected:
BOOST_ARCHIVE_DECL unsigned int
append(unsigned int l, const char * a);
BOOST_ARCHIVE_DECL
archive_exception() BOOST_NOEXCEPT;
public:
typedef enum {
no_exception, // initialized without code
other_exception, // any excepton not listed below
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
@@ -55,37 +61,35 @@ public:
// subsequent to this one
pointer_conflict, // an attempt has been made to directly
// serialize an object which has
// already been serialzed through a pointer.
// Were this permited, the archive load would result
// already been serialized through a pointer.
// Were this permitted, the archive load would result
// in the creation of an extra copy of the obect.
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 input stream
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
// void_cast_register
unsupported_class_version, // type saved with a version # greater than the
// one used by the program. This indicates that the proggram
// one used by the program. This indicates that the program
// needs to be rebuilt.
multiple_code_instantiation // code for implementing serialization for some
multiple_code_instantiation, // code for implementing serialization for some
// type has been instantiated in more than one module.
output_stream_error // error on input stream
} exception_code;
protected:
std::string m_msg;
public:
exception_code code;
archive_exception(
BOOST_ARCHIVE_DECL archive_exception(
exception_code c,
const char * e1 = NULL,
const char * e2 = NULL
);
~archive_exception() throw ();
virtual const char *what( ) const throw();
protected:
archive_exception();
) BOOST_NOEXCEPT;
BOOST_ARCHIVE_DECL archive_exception(archive_exception const &) BOOST_NOEXCEPT ;
virtual BOOST_ARCHIVE_DECL ~archive_exception() BOOST_NOEXCEPT_OR_NOTHROW ;
virtual BOOST_ARCHIVE_DECL const char * what() const BOOST_NOEXCEPT_OR_NOTHROW ;
};
}// namespace archive
+200 -16
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -15,10 +15,12 @@
// http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for updates, documentation, and revision history.
#include <cstring> // count
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/serialization/strong_typedef.hpp>
#include <boost/cstdint.hpp> // size_t
#include <boost/noncopyable.hpp>
#include <boost/integer_traits.hpp>
#include <boost/archive/detail/auto_link_archive.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
@@ -26,15 +28,160 @@
namespace boost {
namespace archive {
BOOST_STRONG_TYPEDEF(unsigned int, version_type)
BOOST_STRONG_TYPEDEF(int, class_id_type)
BOOST_STRONG_TYPEDEF(int, class_id_optional_type)
BOOST_STRONG_TYPEDEF(int, class_id_reference_type)
BOOST_STRONG_TYPEDEF(unsigned int, object_id_type)
BOOST_STRONG_TYPEDEF(unsigned int, object_reference_type)
#if defined(_MSC_VER)
#pragma warning( push )
#pragma warning( disable : 4244 4267 )
#endif
/* NOTE : Warning : Warning : Warning : Warning : Warning
* Don't ever changes this. If you do, they previously created
* binary archives won't be readable !!!
*/
class library_version_type {
private:
typedef uint_least16_t base_type;
base_type t;
public:
library_version_type(): t(0) {};
explicit library_version_type(const unsigned int & t_) : t(t_){
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
}
library_version_type(const library_version_type & t_) :
t(t_.t)
{}
library_version_type & operator=(const library_version_type & rhs){
t = rhs.t;
return *this;
}
// used for text output
operator base_type () const {
return t;
}
// used for text input
operator base_type & (){
return t;
}
bool operator==(const library_version_type & rhs) const {
return t == rhs.t;
}
bool operator<(const library_version_type & rhs) const {
return t < rhs.t;
}
};
BOOST_ARCHIVE_DECL library_version_type
BOOST_ARCHIVE_VERSION();
class version_type {
private:
typedef uint_least32_t base_type;
base_type t;
public:
// should be private - but MPI fails if it's not!!!
version_type(): t(0) {};
explicit version_type(const unsigned int & t_) : t(t_){
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
}
version_type(const version_type & t_) :
t(t_.t)
{}
version_type & operator=(const version_type & rhs){
t = rhs.t;
return *this;
}
// used for text output
operator base_type () const {
return t;
}
// used for text intput
operator base_type & (){
return t;
}
bool operator==(const version_type & rhs) const {
return t == rhs.t;
}
bool operator<(const version_type & rhs) const {
return t < rhs.t;
}
};
class class_id_type {
private:
typedef int_least16_t base_type;
base_type t;
public:
// should be private - but then can't use BOOST_STRONG_TYPE below
class_id_type() : t(0) {};
explicit class_id_type(const int t_) : t(t_){
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
}
explicit class_id_type(const std::size_t t_) : t(t_){
// BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
}
class_id_type(const class_id_type & t_) :
t(t_.t)
{}
class_id_type & operator=(const class_id_type & rhs){
t = rhs.t;
return *this;
}
// used for text output
operator base_type () const {
return t;
}
// used for text input
operator base_type &() {
return t;
}
bool operator==(const class_id_type & rhs) const {
return t == rhs.t;
}
bool operator<(const class_id_type & rhs) const {
return t < rhs.t;
}
};
#define NULL_POINTER_TAG boost::archive::class_id_type(-1)
class object_id_type {
private:
typedef uint_least32_t base_type;
base_type t;
public:
object_id_type(): t(0) {};
// note: presumes that size_t >= unsigned int.
explicit object_id_type(const std::size_t & t_) : t(t_){
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
}
object_id_type(const object_id_type & t_) :
t(t_.t)
{}
object_id_type & operator=(const object_id_type & rhs){
t = rhs.t;
return *this;
}
// used for text output
operator base_type () const {
return t;
}
// used for text input
operator base_type & () {
return t;
}
bool operator==(const object_id_type & rhs) const {
return t == rhs.t;
}
bool operator<(const object_id_type & rhs) const {
return t < rhs.t;
}
};
#if defined(_MSC_VER)
#pragma warning( pop )
#endif
struct tracking_type {
// typedef bool value_type;
bool t;
explicit tracking_type(const bool t_ = false)
: t(t_)
@@ -64,7 +211,9 @@ struct tracking_type {
}
};
struct class_name_type : private boost::noncopyable {
struct class_name_type :
private boost::noncopyable
{
char *t;
operator const char * & () const {
return const_cast<const char * &>(t);
@@ -72,6 +221,9 @@ struct class_name_type : private boost::noncopyable {
operator char * () {
return t;
}
std::size_t size() const {
return std::strlen(t);
}
explicit class_name_type(const char *key_)
: t(const_cast<char *>(key_)){}
explicit class_name_type(char *key_)
@@ -90,13 +242,29 @@ enum archive_flags {
flags_last = 8
};
#define NULL_POINTER_TAG class_id_type(-1)
BOOST_ARCHIVE_DECL(const char *)
BOOST_ARCHIVE_DECL const char *
BOOST_ARCHIVE_SIGNATURE();
BOOST_ARCHIVE_DECL(unsigned char)
BOOST_ARCHIVE_VERSION();
/* NOTE : Warning : Warning : Warning : Warning : Warning
* If any of these are changed to different sized types,
* binary_iarchive won't be able to read older archives
* unless you rev the library version and include conditional
* code based on the library version. There is nothing
* inherently wrong in doing this - but you have to be super
* careful because it's easy to get wrong and start breaking
* old archives !!!
*/
#define BOOST_ARCHIVE_STRONG_TYPEDEF(T, D) \
class D : public T { \
public: \
explicit D(const T tt) : T(tt){} \
}; \
/**/
BOOST_ARCHIVE_STRONG_TYPEDEF(class_id_type, class_id_reference_type)
BOOST_ARCHIVE_STRONG_TYPEDEF(class_id_type, class_id_optional_type)
BOOST_ARCHIVE_STRONG_TYPEDEF(object_id_type, object_reference_type)
}// namespace archive
}// namespace boost
@@ -108,6 +276,7 @@ BOOST_ARCHIVE_VERSION();
// set implementation level to primitive for all types
// used internally by the serialization library
BOOST_CLASS_IMPLEMENTATION(boost::archive::library_version_type, primitive_type)
BOOST_CLASS_IMPLEMENTATION(boost::archive::version_type, primitive_type)
BOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_type, primitive_type)
BOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_reference_type, primitive_type)
@@ -117,4 +286,19 @@ BOOST_CLASS_IMPLEMENTATION(boost::archive::object_id_type, primitive_type)
BOOST_CLASS_IMPLEMENTATION(boost::archive::object_reference_type, primitive_type)
BOOST_CLASS_IMPLEMENTATION(boost::archive::tracking_type, primitive_type)
#include <boost/serialization/is_bitwise_serializable.hpp>
// set types used internally by the serialization library
// to be bitwise serializable
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::library_version_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::version_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_reference_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_id_optional_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::class_name_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::object_id_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::object_reference_type)
BOOST_IS_BITWISE_SERIALIZABLE(boost::archive::tracking_type)
#endif //BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
+134 -62
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -25,32 +25,45 @@
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/serialization/pfto.hpp>
#include <boost/archive/basic_archive.hpp>
#include <boost/archive/detail/common_iarchive.hpp>
#include <boost/serialization/collection_size_type.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/item_version_type.hpp>
#include <boost/integer_traits.hpp>
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable : 4511 4512)
#endif
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
namespace boost {
namespace archive {
namespace detail {
template<class Archive> class interface_iarchive;
} // namespace detail
/////////////////////////////////////////////////////////////////////////
// class basic_binary_iarchive - read serialized objects from a input binary stream
template<class Archive>
class basic_binary_iarchive :
class BOOST_SYMBOL_VISIBLE basic_binary_iarchive :
public detail::common_iarchive<Archive>
{
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#elif defined(BOOST_MSVC)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_iarchive<Archive>;
#else
friend class detail::interface_iarchive<Archive>;
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_iarchive<Archive>;
#else
friend class detail::interface_iarchive<Archive>;
#endif
#endif
// intermediate level to support override of operators
// fot templates in the absence of partial function
@@ -58,65 +71,120 @@ public:
// note extra nonsense to sneak it pass the borland compiers
typedef detail::common_iarchive<Archive> detail_common_iarchive;
template<class T>
void load_override(T & t, BOOST_PFTO int version){
this->detail_common_iarchive::load_override(t, static_cast<int>(version));
void load_override(T & t){
this->detail_common_iarchive::load_override(t);
}
// include these to trap a change in binary format which
// isn't specifically handled
// upto 32K classes
BOOST_STATIC_ASSERT(sizeof(class_id_type) == sizeof(int_least16_t));
BOOST_STATIC_ASSERT(sizeof(class_id_reference_type) == sizeof(int_least16_t));
// upto 2G objects
BOOST_STATIC_ASSERT(sizeof(object_id_type) == sizeof(uint_least32_t));
BOOST_STATIC_ASSERT(sizeof(object_reference_type) == sizeof(uint_least32_t));
// binary files don't include the optional information
void load_override(class_id_optional_type & /* t */, int){}
void load_override(class_id_optional_type & /* t */){}
// the following have been overridden to provide specific sizes
// for these pseudo prmitive types.
void load_override(version_type & t, int){
// upto 255 versions
unsigned char x=0;
* this->This() >> x;
t = version_type(x);
void load_override(tracking_type & t, int /*version*/){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(6) < lvt){
int_least8_t x=0;
* this->This() >> x;
t = boost::archive::tracking_type(x);
}
else{
bool x=0;
* this->This() >> x;
t = boost::archive::tracking_type(x);
}
}
void load_override(class_id_type & t, int){
// upto 32K classes
int_least16_t x=0;
* this->This() >> x;
t = class_id_type(x);
void load_override(class_id_type & t){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_iarchive::load_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
int_least16_t x=0;
* this->This() >> x;
t = boost::archive::class_id_type(x);
}
else{
int x=0;
* this->This() >> x;
t = boost::archive::class_id_type(x);
}
}
void load_override(class_id_reference_type & t, int){
// upto 32K classes
int_least16_t x=0;
* this->This() >> x;
t = class_id_reference_type(x);
}
void load_override(object_id_type & t, int){
// upto 2G objects
uint_least32_t x=0;
* this->This() >> x;
t = object_id_type(x);
}
void load_override(object_reference_type & t, int){
// upto 2G objects
uint_least32_t x=0;
* this->This() >> x;
t = object_reference_type(x);
}
void load_override(tracking_type & t, int){
char x=0;
* this->This() >> x;
t = (0 != x);
}
void load_override(serialization::collection_size_type & t, int){
if (this->get_library_version() < 6) {
unsigned int x=0;
* this->This() >> x;
t = serialization::collection_size_type(x);
}
else {
std::size_t x=0;
* this->This() >> x;
t = serialization::collection_size_type(x);
}
void load_override(class_id_reference_type & t){
load_override(static_cast<class_id_type &>(t));
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
load_override(class_name_type & t, int);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
void load_override(version_type & t){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_iarchive::load_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
uint_least8_t x=0;
* this->This() >> x;
t = boost::archive::version_type(x);
}
else
if(boost::archive::library_version_type(5) < lvt){
uint_least16_t x=0;
* this->This() >> x;
t = boost::archive::version_type(x);
}
else
if(boost::archive::library_version_type(2) < lvt){
// upto 255 versions
unsigned char x=0;
* this->This() >> x;
t = version_type(x);
}
else{
unsigned int x=0;
* this->This() >> x;
t = boost::archive::version_type(x);
}
}
void load_override(boost::serialization::item_version_type & t){
library_version_type lvt = this->get_library_version();
// if(boost::archive::library_version_type(7) < lvt){
if(boost::archive::library_version_type(6) < lvt){
this->detail_common_iarchive::load_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
uint_least16_t x=0;
* this->This() >> x;
t = boost::serialization::item_version_type(x);
}
else{
unsigned int x=0;
* this->This() >> x;
t = boost::serialization::item_version_type(x);
}
}
void load_override(serialization::collection_size_type & t){
if(boost::archive::library_version_type(5) < this->get_library_version()){
this->detail_common_iarchive::load_override(t);
}
else{
unsigned int x=0;
* this->This() >> x;
t = serialization::collection_size_type(x);
}
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load_override(class_name_type & t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init();
basic_binary_iarchive(unsigned int flags) :
@@ -127,6 +195,10 @@ public:
} // namespace archive
} // namespace boost
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
#endif // BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -28,7 +28,7 @@
// See http://www.boost.org for updates, documentation, and revision history.
#include <iosfwd>
#include <cassert>
#include <boost/assert.hpp>
#include <locale>
#include <cstring> // std::memcpy
#include <cstddef> // std::size_t
@@ -44,17 +44,18 @@ namespace std{
#endif
#include <boost/cstdint.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/serialization/throw_exception.hpp>
//#include <boost/limits.hpp>
//#include <boost/io/ios_state.hpp>
#include <boost/integer.hpp>
#include <boost/integer_traits.hpp>
//#include <boost/mpl/placeholders.hpp>
#include <boost/serialization/is_bitwise_serializable.hpp>
#include <boost/serialization/array_wrapper.hpp>
#include <boost/archive/basic_streambuf_locale_saver.hpp>
#include <boost/archive/codecvt_null.hpp>
#include <boost/archive/archive_exception.hpp>
#include <boost/archive/detail/auto_link_archive.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/serialization/is_bitwise_serializable.hpp>
#include <boost/serialization/array.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
namespace boost {
@@ -63,8 +64,7 @@ namespace archive {
/////////////////////////////////////////////////////////////////////////////
// class binary_iarchive - read serialized objects from a input binary stream
template<class Archive, class Elem, class Tr>
class basic_binary_iprimitive
{
class BOOST_SYMBOL_VISIBLE basic_binary_iprimitive {
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
friend class load_access;
protected:
@@ -78,8 +78,16 @@ public:
}
#ifndef BOOST_NO_STD_LOCALE
boost::scoped_ptr<std::locale> archive_locale;
// note order! - if you change this, libstd++ will fail!
// a) create new locale with new codecvt facet
// b) save current locale
// c) change locale to new one
// d) use stream buffer
// e) change locale back to original
// f) destroy new codecvt facet
boost::archive::codecvt_null<Elem> codecvt_null_facet;
basic_streambuf_locale_saver<Elem, Tr> locale_saver;
std::locale archive_locale;
#endif
// main template for serilization of primitive types
@@ -95,28 +103,28 @@ public:
void load(bool & t){
load_binary(& t, sizeof(t));
int i = t;
assert(0 == i || 1 == i);
BOOST_ASSERT(0 == i || 1 == i);
(void)i; // warning suppression for release builds.
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load(std::string &s);
#ifndef BOOST_NO_STD_WSTRING
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load(std::wstring &ws);
#endif
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load(char * t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load(wchar_t * t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init();
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
basic_binary_iprimitive(
std::basic_streambuf<Elem, Tr> & sb,
bool no_codecvt
);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
~basic_binary_iprimitive();
public:
// we provide an optimized load for all fundamental types
@@ -126,16 +134,16 @@ public:
template <class T>
#if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)
struct apply {
typedef BOOST_DEDUCED_TYPENAME boost::serialization::is_bitwise_serializable<T>::type type;
typedef typename boost::serialization::is_bitwise_serializable< T >::type type;
};
#else
struct apply : public boost::serialization::is_bitwise_serializable<T> {};
struct apply : public boost::serialization::is_bitwise_serializable< T > {};
#endif
};
// the optimized load_array dispatches to load_binary
template <class ValueType>
void load_array(serialization::array<ValueType>& a, unsigned int)
void load_array(serialization::array_wrapper<ValueType>& a, unsigned int)
{
load_binary(a.address(),a.count()*sizeof(ValueType));
}
@@ -151,17 +159,22 @@ basic_binary_iprimitive<Archive, Elem, Tr>::load_binary(
std::size_t count
){
// note: an optimizer should eliminate the following for char files
std::streamsize s = count / sizeof(Elem);
BOOST_ASSERT(
static_cast<std::streamsize>(count / sizeof(Elem))
<= boost::integer_traits<std::streamsize>::const_max
);
std::streamsize s = static_cast<std::streamsize>(count / sizeof(Elem));
std::streamsize scount = m_sb.sgetn(
static_cast<Elem *>(address),
s
);
if(scount != s)
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
archive_exception(archive_exception::input_stream_error)
);
// note: an optimizer should eliminate the following for char files
s = count % sizeof(Elem);
BOOST_ASSERT(count % sizeof(Elem) <= boost::integer_traits<std::streamsize>::const_max);
s = static_cast<std::streamsize>(count % sizeof(Elem));
if(0 < s){
// if(is.fail())
// boost::serialization::throw_exception(
@@ -171,9 +184,9 @@ basic_binary_iprimitive<Archive, Elem, Tr>::load_binary(
scount = m_sb.sgetn(& t, 1);
if(scount != 1)
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
archive_exception(archive_exception::input_stream_error)
);
std::memcpy(static_cast<char*>(address) + (count - s), &t, s);
std::memcpy(static_cast<char*>(address) + (count - s), &t, static_cast<std::size_t>(s));
}
}
+110 -57
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -23,21 +23,32 @@
// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON
#include <cassert>
#include <boost/assert.hpp>
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/integer.hpp>
#include <boost/integer_traits.hpp>
#include <boost/config.hpp>
#include <boost/serialization/pfto.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/archive/detail/common_oarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/collection_size_type.hpp>
#include <boost/serialization/item_version_type.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable : 4511 4512)
#endif
namespace boost {
namespace archive {
namespace detail {
template<class Archive> class interface_oarchive;
} // namespace detail
//////////////////////////////////////////////////////////////////////
// class basic_binary_oarchive - write serialized objects to a binary output stream
// note: this archive has no pretensions to portability. Archive format
@@ -47,78 +58,114 @@ namespace archive {
// does have the virtue of buiding the smalles archive in the minimum amount
// of time. So under some circumstances it may be he right choice.
template<class Archive>
class basic_binary_oarchive :
public archive::detail::common_oarchive<Archive>
class BOOST_SYMBOL_VISIBLE basic_binary_oarchive :
public detail::common_oarchive<Archive>
{
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#elif defined(BOOST_MSVC)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_oarchive<Archive>;
#else
friend class detail::interface_oarchive<Archive>;
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_oarchive<Archive>;
#else
friend class detail::interface_oarchive<Archive>;
#endif
#endif
// any datatype not specifed below will be handled by base class
typedef detail::common_oarchive<Archive> detail_common_oarchive;
template<class T>
void save_override(const T & t, BOOST_PFTO int version){
this->detail_common_oarchive::save_override(t, static_cast<int>(version));
void save_override(const T & t){
this->detail_common_oarchive::save_override(t);
}
// include these to trap a change in binary format which
// isn't specifically handled
BOOST_STATIC_ASSERT(sizeof(tracking_type) == sizeof(bool));
// upto 32K classes
BOOST_STATIC_ASSERT(sizeof(class_id_type) == sizeof(int_least16_t));
BOOST_STATIC_ASSERT(sizeof(class_id_reference_type) == sizeof(int_least16_t));
// upto 2G objects
BOOST_STATIC_ASSERT(sizeof(object_id_type) == sizeof(uint_least32_t));
BOOST_STATIC_ASSERT(sizeof(object_reference_type) == sizeof(uint_least32_t));
// binary files don't include the optional information
void save_override(const class_id_optional_type & /* t */, int){}
void save_override(const class_id_optional_type & /* t */){}
void save_override(const version_type & t, int){
// upto 255 versions
// note:t.t resolves borland ambguity
assert(t.t <= boost::integer_traits<unsigned char>::const_max);
const unsigned char x = static_cast<const unsigned char>(t.t);
* this->This() << x;
// enable this if we decide to support generation of previous versions
#if 0
void save_override(const boost::archive::version_type & t){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_oarchive::save_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
const boost::uint_least16_t x = t;
* this->This() << x;
}
else{
const unsigned int x = t;
* this->This() << x;
}
}
void save_override(const class_id_type & t, int){
// upto 32K classes
assert(t.t <= boost::integer_traits<boost::int_least16_t>::const_max);
const boost::int_least16_t x = static_cast<const boost::int_least16_t>(t.t);
* this->This() << x;
void save_override(const boost::serialization::item_version_type & t){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_oarchive::save_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
const boost::uint_least16_t x = t;
* this->This() << x;
}
else{
const unsigned int x = t;
* this->This() << x;
}
}
void save_override(const class_id_reference_type & t, int){
// upto 32K classes
assert(t.t <= boost::integer_traits<boost::int_least16_t>::const_max);
const boost::uint_least16_t x = t.t;
* this->This() << x;
void save_override(class_id_type & t){
library_version_type lvt = this->get_library_version();
if(boost::archive::library_version_type(7) < lvt){
this->detail_common_oarchive::save_override(t);
}
else
if(boost::archive::library_version_type(6) < lvt){
const boost::int_least16_t x = t;
* this->This() << x;
}
else{
const int x = t;
* this->This() << x;
}
}
void save_override(const object_id_type & t, int){
// upto 2G objects
assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
const boost::uint_least32_t x = t.t;
* this->This() << x;
}
void save_override(const object_reference_type & t, int){
// upto 2G objects
assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
const boost::uint_least32_t x = t.t;
* this->This() << x;
}
void save_override(const tracking_type & t, int){
const char x = t.t;
* this->This() << x;
void save_override(class_id_reference_type & t){
save_override(static_cast<class_id_type &>(t));
}
#endif
// explicitly convert to char * to avoid compile ambiguities
void save_override(const class_name_type & t, int){
void save_override(const class_name_type & t){
const std::string s(t);
* this->This() << s;
}
void save_override(const serialization::collection_size_type & t, int){
// for backward compatibility, 64 bit integer or variable length integer would be preferred
std::size_t x = t.t;
* this->This() << x;
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
#if 0
void save_override(const serialization::collection_size_type & t){
if (get_library_version() < boost::archive::library_version_type(6)){
unsigned int x=0;
* this->This() >> x;
t = serialization::collection_size_type(x);
}
else{
* this->This() >> t;
}
}
#endif
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init();
basic_binary_oarchive(unsigned int flags) :
@@ -129,4 +176,10 @@ public:
} // namespace archive
} // namespace boost
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
#endif // BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -24,7 +24,7 @@
// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON
#include <iosfwd>
#include <cassert>
#include <boost/assert.hpp>
#include <locale>
#include <streambuf> // basic_streambuf
#include <string>
@@ -38,17 +38,19 @@ namespace std{
#endif
#include <boost/cstdint.hpp>
//#include <boost/limits.hpp>
//#include <boost/io/ios_state.hpp>
#include <boost/integer.hpp>
#include <boost/integer_traits.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/serialization/throw_exception.hpp>
//#include <boost/mpl/placeholders.hpp>
#include <boost/serialization/is_bitwise_serializable.hpp>
#include <boost/serialization/array_wrapper.hpp>
#include <boost/archive/basic_streambuf_locale_saver.hpp>
#include <boost/archive/codecvt_null.hpp>
#include <boost/archive/archive_exception.hpp>
#include <boost/archive/detail/auto_link_archive.hpp>
#include <boost/serialization/is_bitwise_serializable.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/serialization/array.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
namespace boost {
@@ -58,8 +60,7 @@ namespace archive {
// class basic_binary_oprimitive - binary output of prmitives
template<class Archive, class Elem, class Tr>
class basic_binary_oprimitive
{
class BOOST_SYMBOL_VISIBLE basic_binary_oprimitive {
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
friend class save_access;
protected:
@@ -72,8 +73,16 @@ public:
return static_cast<Archive *>(this);
}
#ifndef BOOST_NO_STD_LOCALE
boost::scoped_ptr<std::locale> archive_locale;
// note order! - if you change this, libstd++ will fail!
// a) create new locale with new codecvt facet
// b) save current locale
// c) change locale to new one
// d) use stream buffer
// e) change locale back to original
// f) destroy new codecvt facet
boost::archive::codecvt_null<Elem> codecvt_null_facet;
basic_streambuf_locale_saver<Elem, Tr> locale_saver;
std::locale archive_locale;
#endif
// default saving of primitives.
template<class T>
@@ -88,29 +97,29 @@ public:
// trap usage of invalid uninitialized boolean which would
// otherwise crash on load.
void save(const bool t){
assert(0 == static_cast<int>(t) || 1 == static_cast<int>(t));
BOOST_ASSERT(0 == static_cast<int>(t) || 1 == static_cast<int>(t));
save_binary(& t, sizeof(t));
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
save(const std::string &s);
#ifndef BOOST_NO_STD_WSTRING
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
save(const std::wstring &ws);
#endif
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
save(const char * t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
save(const wchar_t * t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init();
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
basic_binary_oprimitive(
std::basic_streambuf<Elem, Tr> & sb,
bool no_codecvt
);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
~basic_binary_oprimitive();
public:
@@ -122,17 +131,16 @@ public:
template <class T>
#if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)
struct apply {
typedef BOOST_DEDUCED_TYPENAME boost::serialization::is_bitwise_serializable<T>::type type;
typedef typename boost::serialization::is_bitwise_serializable< T >::type type;
};
#else
struct apply : public boost::serialization::is_bitwise_serializable<T> {};
struct apply : public boost::serialization::is_bitwise_serializable< T > {};
#endif
};
// the optimized save_array dispatches to save_binary
template <class ValueType>
void save_array(boost::serialization::array<ValueType> const& a, unsigned int)
void save_array(boost::serialization::array_wrapper<ValueType> const& a, unsigned int)
{
save_binary(a.address(),a.count()*sizeof(ValueType));
}
@@ -146,33 +154,30 @@ basic_binary_oprimitive<Archive, Elem, Tr>::save_binary(
const void *address,
std::size_t count
){
//assert(
// static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)()) >= count
//);
// BOOST_ASSERT(count <= std::size_t(boost::integer_traits<std::streamsize>::const_max));
// note: if the following assertions fail
// a likely cause is that the output stream is set to "text"
// mode where by cr characters recieve special treatment.
// be sure that the output stream is opened with ios::binary
//if(os.fail())
// boost::serialization::throw_exception(
// archive_exception(archive_exception::stream_error)
// archive_exception(archive_exception::output_stream_error)
// );
// figure number of elements to output - round up
count = ( count + sizeof(Elem) - 1)
/ sizeof(Elem);
count = ( count + sizeof(Elem) - 1) / sizeof(Elem);
std::streamsize scount = m_sb.sputn(
static_cast<const Elem *>(address),
count
static_cast<std::streamsize>(count)
);
if(count != static_cast<std::size_t>(scount))
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
archive_exception(archive_exception::output_stream_error)
);
//os.write(
// static_cast<const BOOST_DEDUCED_TYPENAME OStream::char_type *>(address),
// static_cast<const typename OStream::char_type *>(address),
// count
//);
//assert(os.good());
//BOOST_ASSERT(os.good());
}
} //namespace boost
@@ -2,12 +2,12 @@
#define BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// basic_streambuf_local_saver.hpp
// basic_streambuf_locale_saver.hpp
// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com
@@ -27,34 +27,82 @@
#ifndef BOOST_NO_STD_LOCALE
#include <locale> // for std::locale
#include <ios>
#include <streambuf> // for std::basic_streambuf
#include <boost/config.hpp>
#include <boost/noncopyable.hpp>
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable : 4511 4512)
#endif
namespace boost{
namespace archive{
template < typename Ch, class Tr >
class basic_streambuf_locale_saver
class basic_streambuf_locale_saver :
private boost::noncopyable
{
public:
typedef ::std::basic_streambuf<Ch, Tr> state_type;
typedef ::std::locale aspect_type;
explicit basic_streambuf_locale_saver( state_type &s )
: s_save_( s ), a_save_( s.getloc() )
{}
basic_streambuf_locale_saver( state_type &s, aspect_type const &a )
: s_save_( s ), a_save_( s.pubimbue(a) )
{}
~basic_streambuf_locale_saver()
{ this->restore(); }
void restore()
{ s_save_.pubimbue( a_save_ ); }
explicit basic_streambuf_locale_saver(std::basic_streambuf<Ch, Tr> &s) :
m_streambuf(s),
m_locale(s.getloc())
{}
~basic_streambuf_locale_saver(){
m_streambuf.pubsync();
m_streambuf.pubimbue(m_locale);
}
private:
state_type & s_save_;
aspect_type const a_save_;
std::basic_streambuf<Ch, Tr> & m_streambuf;
std::locale const m_locale;
};
template < typename Ch, class Tr >
class basic_istream_locale_saver :
private boost::noncopyable
{
public:
explicit basic_istream_locale_saver(std::basic_istream<Ch, Tr> &s) :
m_istream(s),
m_locale(s.getloc())
{}
~basic_istream_locale_saver(){
// libstdc++ crashes without this
m_istream.sync();
m_istream.imbue(m_locale);
}
private:
std::basic_istream<Ch, Tr> & m_istream;
std::locale const m_locale;
};
template < typename Ch, class Tr >
class basic_ostream_locale_saver :
private boost::noncopyable
{
public:
explicit basic_ostream_locale_saver(std::basic_ostream<Ch, Tr> &s) :
m_ostream(s),
m_locale(s.getloc())
{}
~basic_ostream_locale_saver(){
m_ostream.flush();
m_ostream.imbue(m_locale);
}
private:
std::basic_ostream<Ch, Tr> & m_ostream;
std::locale const m_locale;
};
} // archive
} // boost
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
#endif // BOOST_NO_STD_LOCALE
#endif // BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP
+31 -19
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -21,53 +21,61 @@
//
// note the fact that on libraries without wide characters, ostream is
// is not a specialization of basic_ostream which in fact is not defined
// in such cases. So we can't use basic_ostream<IStream::char_type> but rather
// in such cases. So we can't use basic_istream<IStream::char_type> but rather
// use two template parameters
#include <boost/config.hpp>
#include <boost/serialization/pfto.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/archive/detail/common_iarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable : 4511 4512)
#endif
namespace boost {
namespace archive {
namespace detail {
template<class Archive> class interface_iarchive;
} // namespace detail
/////////////////////////////////////////////////////////////////////////
// class basic_text_iarchive - read serialized objects from a input text stream
template<class Archive>
class basic_text_iarchive :
class BOOST_SYMBOL_VISIBLE basic_text_iarchive :
public detail::common_iarchive<Archive>
{
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#elif defined(BOOST_MSVC)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_iarchive<Archive>;
#else
friend class detail::interface_iarchive<Archive>;
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_iarchive<Archive>;
#else
friend class detail::interface_iarchive<Archive>;
#endif
#endif
// intermediate level to support override of operators
// fot templates in the absence of partial function
// template ordering
typedef detail::common_iarchive<Archive> detail_common_iarchive;
template<class T>
void load_override(T & t, BOOST_PFTO int)
{
this->detail_common_iarchive::load_override(t, 0);
void load_override(T & t){
this->detail_common_iarchive::load_override(t);
}
// text file don't include the optional information
void load_override(class_id_optional_type & /*t*/, int){}
void load_override(class_id_optional_type & /*t*/){}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
load_override(class_name_type & t, int);
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load_override(class_name_type & t);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init(void);
basic_text_iarchive(unsigned int flags) :
@@ -79,6 +87,10 @@ public:
} // namespace archive
} // namespace boost
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
#endif // BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP
+55 -56
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -24,7 +24,6 @@
// in such cases. So we can't use basic_ostream<IStream::char_type> but rather
// use two template parameters
#include <cassert>
#include <locale>
#include <cstddef> // size_t
@@ -38,17 +37,17 @@ namespace std{
} // namespace std
#endif
#include <boost/io/ios_state.hpp>
#include <boost/static_assert.hpp>
#include <boost/detail/workaround.hpp>
#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
#include <boost/archive/dinkumware.hpp>
#endif
#include <boost/limits.hpp>
#include <boost/io/ios_state.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/serialization/throw_exception.hpp>
#include <boost/archive/codecvt_null.hpp>
#include <boost/archive/archive_exception.hpp>
#include <boost/archive/basic_streambuf_locale_saver.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
namespace boost {
@@ -56,85 +55,85 @@ namespace archive {
/////////////////////////////////////////////////////////////////////////
// class basic_text_iarchive - load serialized objects from a input text stream
template<class IStream>
class basic_text_iprimitive
{
#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
protected:
#else
public:
#if defined(_MSC_VER)
#pragma warning( push )
#pragma warning( disable : 4244 4267 )
#endif
template<class IStream>
class BOOST_SYMBOL_VISIBLE basic_text_iprimitive {
protected:
IStream &is;
io::ios_flags_saver flags_saver;
io::ios_precision_saver precision_saver;
#ifndef BOOST_NO_STD_LOCALE
boost::scoped_ptr<std::locale> archive_locale;
io::basic_ios_locale_saver<
BOOST_DEDUCED_TYPENAME IStream::char_type, BOOST_DEDUCED_TYPENAME IStream::traits_type
// note order! - if you change this, libstd++ will fail!
// a) create new locale with new codecvt facet
// b) save current locale
// c) change locale to new one
// d) use stream buffer
// e) change locale back to original
// f) destroy new codecvt facet
boost::archive::codecvt_null<typename IStream::char_type> codecvt_null_facet;
std::locale archive_locale;
basic_istream_locale_saver<
typename IStream::char_type,
typename IStream::traits_type
> locale_saver;
#endif
template<class T>
void load(T & t)
{
if(is.fail())
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
);
is >> t;
if(is >> t)
return;
boost::serialization::throw_exception(
archive_exception(archive_exception::input_stream_error)
);
}
void load(unsigned char & t)
void load(char & t)
{
if(is.fail())
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
);
unsigned short int i;
is >> i;
t = static_cast<unsigned char>(i);
short int i;
load(i);
t = i;
}
void load(signed char & t)
{
if(is.fail())
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
);
signed short int i;
is >> i;
t = static_cast<signed char>(i);
}
void load(char & t)
{
if(is.fail())
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
);
short int i;
is >> i;
t = static_cast<char>(i);
load(i);
t = i;
}
void load(unsigned char & t)
{
unsigned short int i;
load(i);
t = i;
}
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
void load(wchar_t & t)
{
if(is.fail())
boost::serialization::throw_exception(
archive_exception(archive_exception::stream_error)
);
unsigned i;
is >> i;
t = static_cast<wchar_t>(i);
BOOST_STATIC_ASSERT(sizeof(wchar_t) <= sizeof(int));
int i;
load(i);
t = i;
}
#endif
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
basic_text_iprimitive(IStream &is, bool no_codecvt);
BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
BOOST_ARCHIVE_OR_WARCHIVE_DECL
~basic_text_iprimitive();
public:
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
load_binary(void *address, std::size_t count);
};
#if defined(_MSC_VER)
#pragma warning( pop )
#endif
} // namespace archive
} // namespace boost
+33 -48
View File
@@ -2,7 +2,7 @@
#define BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#if defined(_MSC_VER)
# pragma once
#endif
@@ -24,43 +24,51 @@
// in such cases. So we can't use basic_ostream<OStream::char_type> but rather
// use two template parameters
#include <cassert>
#include <boost/config.hpp>
#include <boost/serialization/pfto.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/archive/detail/common_oarchive.hpp>
#include <boost/serialization/string.hpp>
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable : 4511 4512)
#endif
namespace boost {
namespace archive {
namespace detail {
template<class Archive> class interface_oarchive;
} // namespace detail
/////////////////////////////////////////////////////////////////////////
// class basic_text_oarchive
template<class Archive>
class basic_text_oarchive :
class BOOST_SYMBOL_VISIBLE basic_text_oarchive :
public detail::common_oarchive<Archive>
{
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
|| BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x560))
#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
public:
#elif defined(BOOST_MSVC)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_oarchive<Archive>;
#else
friend class detail::interface_oarchive<Archive>;
protected:
#if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
// for some inexplicable reason insertion of "class" generates compile erro
// on msvc 7.1
friend detail::interface_oarchive<Archive>;
#else
friend class detail::interface_oarchive<Archive>;
#endif
#endif
enum {
none,
eol,
space
} delimiter;
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
newtoken();
void newline(){
@@ -71,52 +79,25 @@ public:
// extra stuff to get it passed borland compilers
typedef detail::common_oarchive<Archive> detail_common_oarchive;
template<class T>
void save_override(T & t, BOOST_PFTO int){
this->detail_common_oarchive::save_override(t, 0);
void save_override(T & t){
this->detail_common_oarchive::save_override(t);
}
// start new objects on a new line
void save_override(const object_id_type & t, int){
void save_override(const object_id_type & t){
this->This()->newline();
// note extra .t to funciton with Borland 5.51 compiler
// and invoke prmitive to underlying value
this->This()->save(t.t);
}
void save_override(const object_reference_type & t, int){
this->This()->newline();
// note extra .t to funciton with Borland 5.51 compiler
// and invoke prmitive to underlying value
this->This()->save(t.t);
}
// note the following four overrides are necessary for some borland
// compilers(5.51) which don't handle BOOST_STRONG_TYPE properly.
void save_override(const version_type & t, int){
// note:t.t resolves borland ambguity
const unsigned int x = t.t;
* this->This() << x;
}
void save_override(const class_id_type & t, int){
// note:t.t resolves borland ambguity
const int x = t.t;
* this->This() << x;
}
void save_override(const class_id_reference_type & t, int){
// note:t.t resolves borland ambguity
const int x = t.t;
* this->This() << x;
this->detail_common_oarchive::save_override(t);
}
// text file don't include the optional information
void save_override(const class_id_optional_type & /* t */, int){}
void save_override(const class_id_optional_type & /* t */){}
void save_override(const class_name_type & t, int){
void save_override(const class_name_type & t){
const std::string s(t);
* this->This() << s;
}
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
init();
basic_text_oarchive(unsigned int flags) :
@@ -129,6 +110,10 @@ public:
} // namespace archive
} // namespace boost
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif
#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
#endif // BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP

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