88#ifdef _QX_ENABLE_BOOST_SERIALIZATION
89#if _QX_SERIALIZE_PORTABLE_BINARY
90#ifndef _QX_PORTABLE_BINARY_OARCHIVE_H_
91#define _QX_PORTABLE_BINARY_OARCHIVE_H_
99#pragma warning(disable:4996)
100#pragma warning(disable:4661)
106#include <boost/version.hpp>
107#include <boost/utility/enable_if.hpp>
108#include <boost/archive/basic_binary_oprimitive.hpp>
109#include <boost/archive/basic_binary_oarchive.hpp>
111#if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
112#include <boost/archive/shared_ptr_helper.hpp>
116#if BOOST_VERSION < 103600
117#include <boost/integer/endian.hpp>
118#include <boost/math/fpclassify.hpp>
119#elif BOOST_VERSION < 104800
120#include <boost/spirit/home/support/detail/integer/endian.hpp>
121#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
123#include <boost/spirit/home/support/detail/endian/endian.hpp>
124#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
128#if BOOST_VERSION < 103800
129namespace fp = boost::math;
131namespace fp = boost::spirit::math;
135#if BOOST_VERSION < 104800
136namespace endian = boost::detail;
138namespace endian = boost::spirit::detail;
141#if BOOST_VERSION >= 104500 && !defined BOOST_NO_STD_WSTRING
143#include <boost/program_options/config.hpp>
144#include <boost/program_options/detail/convert.hpp>
148#include <boost/type_traits/is_integral.hpp>
149#include <boost/type_traits/is_signed.hpp>
150#include <boost/type_traits/is_arithmetic.hpp>
151#include <boost/type_traits/is_floating_point.hpp>
157#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
158#error "VAX floating point format is not supported!"
164 class portable_oarchive;
166 typedef boost::archive::basic_binary_oprimitive<
168 #if BOOST_VERSION < 103400
171 , std::ostream::char_type
172 , std::ostream::traits_type
192 ,
public boost::archive::basic_binary_oarchive<portable_oarchive>
194 #if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
196 ,
public boost::archive::detail::shared_ptr_helper
206 portable_oprimitive::save(c);
215 if (flags & boost::archive::no_header)
243 #if BOOST_VERSION < 103400
248 , boost::archive::basic_binary_oarchive<portable_oarchive>(flags)
253 #if BOOST_VERSION >= 103400
263 void save(
const std::string& s)
265 portable_oprimitive::save(s);
268 #ifndef BOOST_NO_STD_WSTRING
281 void save(
const std::wstring& s)
283 save(boost::to_utf8(s));
312 template <
typename T>
313 typename boost::enable_if<boost::is_integral<T> >::type
320 signed char size = 0;
321 do { temp >>= CHAR_BIT; ++size; }
322 while (temp != 0 && temp != (T) -1);
326 BOOST_ASSERT(t > 0 || boost::is_signed<T>::value);
330 endian::store_little_endian<T, sizeof(T)>(&temp, t);
332 save_binary(&temp, size);
365 template <
typename T>
366 typename boost::enable_if<boost::is_floating_point<T> >::type
369 typedef typename fp::detail::fp_traits<T>::type traits;
372 if (get_flags() &
no_infnan && !fp::isfinite(t))
381 typename traits::bits bits;
382 BOOST_STATIC_ASSERT(
sizeof(bits) ==
sizeof(T));
383 BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_iec559);
386 switch (fp::fpclassify(t))
389 case FP_NAN: bits = traits::exponent | traits::mantissa;
break;
390 case FP_INFINITE: bits = traits::exponent | (t<0) * traits::sign;
break;
391 case FP_SUBNORMAL: assert(std::numeric_limits<T>::has_denorm);
393 case FP_NORMAL: traits::get_bits(t, bits);
break;
402 template <
typename T>
403 typename boost::disable_if<boost::is_arithmetic<T> >::type
411 save((
typename boost::uint_t<
sizeof(T)*CHAR_BIT>::least)(t));
418#if BOOST_VERSION < 103500
419#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES eos::portable_oarchive
428#ifndef NO_EXPLICIT_TEMPLATE_INSTANTIATION
430#ifndef _QX_BOOST_ARCHIVE_SERIALIZER_IMPL_DEFINED_
431#define _QX_BOOST_ARCHIVE_SERIALIZER_IMPL_DEFINED_
433#include <boost/archive/impl/basic_binary_iarchive.ipp>
434#include <boost/archive/impl/basic_binary_oarchive.ipp>
435#include <boost/archive/impl/basic_binary_iprimitive.ipp>
436#include <boost/archive/impl/basic_binary_oprimitive.ipp>
438#if _QX_SERIALIZE_TEXT
439#include <boost/archive/impl/basic_text_oprimitive.ipp>
440#include <boost/archive/impl/basic_text_iprimitive.ipp>
441#include <boost/archive/impl/basic_text_oarchive.ipp>
442#include <boost/archive/impl/basic_text_iarchive.ipp>
445#if (BOOST_VERSION < 104000)
446#include <boost/archive/impl/archive_pointer_iserializer.ipp>
447#include <boost/archive/impl/archive_pointer_oserializer.ipp>
448#elif !defined BOOST_ARCHIVE_SERIALIZER_INCLUDED
449#include <boost/archive/impl/archive_serializer_map.ipp>
450#define BOOST_ARCHIVE_SERIALIZER_INCLUDED
455namespace boost {
namespace archive {
458 template class basic_binary_oarchive<eos::portable_oarchive>;
460 template class basic_binary_oprimitive<
462 #if BOOST_VERSION < 103400
465 , std::ostream::char_type
466 , std::ostream::traits_type
470#if (! _QX_USE_EXPORT_DLL_BOOST_SERIALIZATION_SINGLETON)
471#if (BOOST_VERSION < 104000)
472 template class detail::archive_pointer_oserializer<eos::portable_oarchive>;
474 template class detail::archive_serializer_map<eos::portable_oarchive>;
QX_DLL_EXPORT QDataStream & operator<<(QDataStream &stream, const qx::QxBool &t) QX_USED
Exception being thrown when serialization cannot proceed.
Portable binary output archive using little endian format.
void save(const std::string &s)
Save narrow strings.
boost::disable_if< boost::is_arithmetic< T > >::type save(const T &t, dummy< 4 >=0)
void init(unsigned flags)
portable_oarchive(std::ostream &os, unsigned flags=0)
Constructor on a stream using ios::binary mode!
boost::enable_if< boost::is_floating_point< T > >::type save(const T &t, dummy< 3 >=0)
Save floating point types.
void save_signed_char(const signed char &c)
boost::enable_if< boost::is_integral< T > >::type save(const T &t, dummy< 2 >=0)
Save integer types.
void save(const std::wstring &s)
Save wide strings.
void save(const bool &b)
Saving bool type.
const signed char magic_byte
boost::archive::basic_binary_oprimitive< portable_oarchive, std::ostream > portable_oprimitive
const archive_version_type archive_version(boost::archive::ARCHIVE_VERSION())
Provides error handling and constants.