QxOrm
1.5.0
C++ Object Relational Mapping library
|
Portable binary input archive using little endian format. More...
#include <portable_iarchive.hpp>
Classes | |
struct | dummy |
Public Member Functions | |
portable_iarchive (std::istream &is, unsigned flags=0) | |
Constructor on a stream using ios::binary mode! | |
void | load (std::string &s) |
Load narrow strings. | |
void | load (std::wstring &s) |
Load wide strings. | |
void | load (bool &b) |
Loading bool type. | |
template<typename T > | |
boost::enable_if < boost::is_integral< T > >::type | load (T &t, dummy< 2 >=0) |
Load integer types. | |
template<typename T > | |
boost::enable_if < boost::is_floating_point< T > >::type | load (T &t, dummy< 3 >=0) |
Load floating point types. | |
template<typename T > | |
boost::disable_if < boost::is_arithmetic< T > >::type | load (T &t, dummy< 4 >=0) |
Private Member Functions | |
signed char | load_signed_char () |
void | init (unsigned flags) |
Friends | |
class | boost::archive::basic_binary_iarchive< portable_iarchive > |
Portable binary input archive using little endian format.
This archive addresses integer size, endianness and floating point types so that data can be transferred across different systems. There may still be constraints as to what systems are compatible and the user will have to take care that e.g. a very large int being saved on a 64 bit machine will result in a portable_archive_exception if loaded into an int on a 32 bit system. A possible workaround to this would be to use fixed types like boost::uint64_t in your serialization structures.
Definition at line 187 of file portable_iarchive.hpp.
eos::portable_iarchive::portable_iarchive | ( | std::istream & | is, |
unsigned | flags = 0 |
||
) | [inline] |
Constructor on a stream using ios::binary mode!
We cannot call basic_binary_iprimitive::init which tries to detect if the binary archive stems from a different platform by examining type sizes.
We could have called basic_binary_iarchive::init which would create the boost::serialization standard archive header containing also the library version. Due to efficiency we stick with our own.
Definition at line 254 of file portable_iarchive.hpp.
void eos::portable_iarchive::init | ( | unsigned | flags | ) | [inline, private] |
Definition at line 214 of file portable_iarchive.hpp.
void eos::portable_iarchive::load | ( | std::string & | s | ) | [inline] |
Load narrow strings.
Definition at line 275 of file portable_iarchive.hpp.
void eos::portable_iarchive::load | ( | std::wstring & | s | ) | [inline] |
Load wide strings.
This is rather tricky to get right for true portability as there are so many different character encodings around. However, wide strings that are encoded in one of the Unicode schemes only need to be _transcoded_ which is a lot easier actually.
We generate the output string to be encoded in the system's native format, ie. UTF-16 on Windows and UTF-32 on Linux machines. Don't know about Mac here so I can't really say about that.
Definition at line 293 of file portable_iarchive.hpp.
void eos::portable_iarchive::load | ( | bool & | b | ) | [inline] |
Loading bool type.
Byte pattern is same as with integer types, so this function is somewhat redundant but treating bool as integer generates a lot of compiler warnings.
Definition at line 314 of file portable_iarchive.hpp.
boost::enable_if<boost::is_integral<T> >::type eos::portable_iarchive::load | ( | T & | t, |
dummy< 2 > | = 0 |
||
) | [inline] |
Load integer types.
First we load the size information ie. the number of bytes that hold the actual data. Then we retrieve the data and transform it to the original value by using load_little_endian.
Definition at line 333 of file portable_iarchive.hpp.
boost::enable_if<boost::is_floating_point<T> >::type eos::portable_iarchive::load | ( | T & | t, |
dummy< 3 > | = 0 |
||
) | [inline] |
Load floating point types.
We simply rely on fp_traits to set the bit pattern from the (unsigned) integral type that was stored in the stream. Francois Mauger provided standardized behaviour for special values like inf and NaN, that need to be serialized in his application.
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.
Definition at line 387 of file portable_iarchive.hpp.
boost::disable_if<boost::is_arithmetic<T> >::type eos::portable_iarchive::load | ( | T & | t, |
dummy< 4 > | = 0 |
||
) | [inline] |
Definition at line 420 of file portable_iarchive.hpp.
signed char eos::portable_iarchive::load_signed_char | ( | ) | [inline, private] |
Definition at line 206 of file portable_iarchive.hpp.
friend class boost::archive::basic_binary_iarchive< portable_iarchive > [friend] |
Definition at line 199 of file portable_iarchive.hpp.