QxOrm  1.2.9
C++ Object Relational Mapping library
eos::portable_oarchive Class Reference

Portable binary output archive using little endian format. More...

#include <portable_oarchive.hpp>

List of all members.

Classes

struct  dummy

Public Member Functions

template<class T >
boost::disable_if
< boost::is_arithmetic< T >
>::type 
save (const T &t, dummy< 1 >=0)
 Default fall through for non-arithmetic types (ie. strings)
void save (const bool &b)
 Saving bool directly.
template<typename T >
boost::enable_if
< boost::is_integral< T >
>::type 
save (const T &t, dummy< 2 >=0)
 Save integer types.
template<typename T >
boost::enable_if
< boost::is_floating_point< T >
>::type 
save (const T &t, dummy< 3 >=0)
 Save floating point types.
 portable_oarchive (std::ostream &os, unsigned flags=0)
 always construct on a stream using ios::binary mode!

Private Member Functions

void save_signed_char (const signed char &c)

Detailed Description

Portable binary output archive using little endian format.

This archive addresses integer size, endianness and floating point types so that data can be transferred across different systems. The archive consists primarily of three different save implementations for integral types, floating point types and string types. Those functions are templates and use enable_if to be correctly selected for overloading.

Note:
The class is based on the portable binary example by Robert Ramey and uses Beman Dawes endian library plus fp_utilities by Johan Rade.
Robert Ramey changed his example in boost 1.36 and no longer inherits from binary_oarchive_impl but goes down to basic_binary_oprimitive!?

Definition at line 142 of file portable_oarchive.hpp.


Constructor & Destructor Documentation

eos::portable_oarchive::portable_oarchive ( std::ostream &  os,
unsigned  flags = 0 
) [inline]

always construct on a stream using ios::binary mode!

Definition at line 258 of file portable_oarchive.hpp.


Member Function Documentation

template<class T >
boost::disable_if<boost::is_arithmetic<T> >::type eos::portable_oarchive::save ( const T &  t,
dummy< 1 >  = 0 
) [inline]

Default fall through for non-arithmetic types (ie. strings)

Definition at line 163 of file portable_oarchive.hpp.

void eos::portable_oarchive::save ( const bool &  b) [inline]

Saving bool directly.

Definition at line 169 of file portable_oarchive.hpp.

template<typename T >
boost::enable_if<boost::is_integral<T> >::type eos::portable_oarchive::save ( const T &  t,
dummy< 2 >  = 0 
) [inline]

Save integer types.

First we save the size information ie. the number of bytes that hold the actual data. We subsequently transform the data using store_little_endian and store non-zero bytes to the stream.

Definition at line 184 of file portable_oarchive.hpp.

template<typename T >
boost::enable_if<boost::is_floating_point<T> >::type eos::portable_oarchive::save ( const T &  t,
dummy< 3 >  = 0 
) [inline]

Save floating point types.

We simply rely on fp_traits to extract the bit pattern into an (unsigned) integral type and store that into the stream.

Note:
by Johan Rade (author of the floating point utilities library): Be warned that the math::detail::fp_traits<T>::type::get_bits() function is *not* guaranteed to give you all bits of the floating point number. It will give you all bits if and only if there is an integer type that has the same size as the floating point you are copying from. It will not give you all bits for double if there is no uint64_t. It will not give you all bits for long double if sizeof(long double) > 8 or there is no uint64_t.

The member fp_traits<T>::type::coverage will tell you whether all bits are copied. This is a typedef for either math::detail::all_bits or math::detail::not_all_bits.

If the function does not copy all bits, then it will copy the most significant bits. So if you serialize and deserialize the way you describe, and fp_traits<T>::type::coverage is math::detail::not_all_bits, then your floating point numbers will be truncated. This will introduce small rounding off errors.

Note:
treat nan values using fpclassify

Definition at line 236 of file portable_oarchive.hpp.

void eos::portable_oarchive::save_signed_char ( const signed char &  c) [inline, private]

Definition at line 153 of file portable_oarchive.hpp.


The documentation for this class was generated from the following file: