Bayeux  3.4.1
Core Foundation library for SuperNEMO
Classes | Namespaces | Typedefs
portable_oarchive.hpp File Reference

Provides an archive to create portable binary files. More...

#include <ostream>
#include <boost/version.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/archive/basic_binary_oprimitive.hpp>
#include <boost/archive/basic_binary_oarchive.hpp>
#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
#include <boost/endian/conversion.hpp>
#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
#include <boost/program_options/config.hpp>
#include <boost/program_options/detail/convert.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_signed.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
#include <boost/type_traits/is_floating_point.hpp>
#include "portable_archive_exception.hpp"

Go to the source code of this file.

Classes

class  boost::archive::portable_oarchive
 Portable binary output archive using little endian format. More...
 

Namespaces

 boost
 Serialization stuff for CLHEP 'vector_3d'.
 
 boost::archive
 

Typedefs

typedef basic_binary_oprimitive< portable_oarchive, std::ostream::char_type, std::ostream::traits_type > boost::archive::portable_oprimitive
 
typedef detail::polymorphic_oarchive_route< portable_oarchive > boost::archive::polymorphic_portable_oarchive
 

Detailed Description

Provides an archive to create portable binary files.

Author
chris.nosp@m.tian.nosp@m..pfli.nosp@m.gers.nosp@m.dorff.nosp@m.er@g.nosp@m.mx.at
Version
6.0

This pair of archives brings the advantages of binary streams to the cross platform boost::serialization user. While being almost as fast as the native binary archive it allows its files to be exchanged between cpu architectures using different byte order (endianness). Speaking of speed: in serializing numbers the (portable) binary approach is approximately ten times faster than the ascii implementation (that is inherently portable)!

Based on the portable archive example by Robert Ramey this implementation uses Beman Dawes endian library and fp_utilities from Johan Rade, both being in boost since 1.36. Prior to that you need to add them both (header only) to your boost directory before you're able to use the archives provided. Our archives have been tested successfully for boost versions 1.33 to 1.49!

Note
Correct behaviour has so far been confirmed using PowerPC-32, x86-32 and x86-64 platforms featuring different byte order. So there is a good chance it will instantly work for your specific setup. If you encounter problems or have suggestions please contact the author.
Version 6.0 is prepared for submission to boost serialization library. Full backwards compatibility is maintained for all your archived data! Namespaces changed and some refactoring was necessary, that's all.
Version 5.1 is now compatible with boost up to version 1.59. Thanks to ecotax for pointing to the issue with shared_ptr_helper.
Version 5.0 is now compatible with boost up to version 1.49 and enables serialization of std::wstring by converting it to/from utf8 (thanks to Arash Abghari for this suggestion). With that all unit tests from the serialization library pass again with the notable exception of user defined primitive types. Those are not supported and as a result any user defined type to be used with the portable archives are required to be at least object_serializable.
Oliver Putz pointed out that -0.0 was not serialized correctly, so version 4.3 provides a fix for that. Thanks Ollie!
Version 4.2 maintains compatibility with the latest boost 1.45 and adds serialization of special floating point values inf and NaN as proposed by Francois Mauger.
Version 4.1 makes the archives work together with boost 1.40 and 1.41. Thanks to Francois Mauger for his suggestions.
Version 4 removes one level of the inheritance hierarchy and directly builds upon binary primitive and basic binary archive, thereby fixing the last open issue regarding array serialization. Thanks to Robert Ramey for the hint.
A few fixes introduced in version 3.1 let the archives pass all of the serialization tests. Thanks to Sergey Morozov for running the tests. Wouter Bijlsma pointed out where to find the fp_utilities and endian libraries headers inside the boost distribution. I would never have found them so thank him it works out of the box since boost 1.36.
With Version 3.0 the archives have been made portable across different boost versions. For that purpose a header is added to the data that supplies the underlying serialization library version. Backwards compatibility is maintained by assuming library version boost 1.33 if the iarchive is created using the no_header flag. Whether a header is present or not can be guessed by peeking into the stream: the header's first byte is the magic number 127 coinciding with 'e'|'o'|'s' :-)
Version 2.1 removes several compiler warnings and enhances floating point diagnostics to inform the user if some preconditions are violated on his platform. We do not strive for the universally portable solution in binary floating point serialization as desired by some boost users. Instead we support only the most widely used IEEE 754 format and try to detect when requirements are not met and hence our approach must fail. Contributions we made by Johan Rade and Ákos Maróy.
Version 2.0 fixes a serious bug that effectively transformed most of negative integral values into positive values! For example the two numbers -12 and 234 were stored in the same 8-bit pattern and later always restored to 234. This was fixed in this version in a way that does not change the interpretation of existing archives that did work because there were no negative numbers. The other way round archives created by version 2.0 and containing negative numbers will raise an integer type size exception when reading it with version 1.0. Thanks to Markus Frohnmaier for testing the archives and finding the bug.