mirror of
https://github.com/boostorg/serialization.git
synced 2026-01-25 06:42:11 +00:00
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]
97 lines
2.5 KiB
C++
97 lines
2.5 KiB
C++
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
|
// portable_binary_oarchive.cpp
|
|
|
|
// (C) Copyright 2002-7 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 <boost/detail/endian.hpp>
|
|
#include "portable_binary_oarchive.hpp"
|
|
|
|
void
|
|
portable_binary_oarchive::save_impl(
|
|
const boost::intmax_t l,
|
|
const char maxsize
|
|
){
|
|
char size = 0;
|
|
|
|
if(l == 0){
|
|
this->primitive_base_t::save(size);
|
|
return;
|
|
}
|
|
|
|
boost::intmax_t ll;
|
|
bool negative = (l < 0);
|
|
if(negative)
|
|
ll = -l;
|
|
else
|
|
ll = l;
|
|
|
|
do{
|
|
ll >>= CHAR_BIT;
|
|
++size;
|
|
}while(ll != 0);
|
|
|
|
this->primitive_base_t::save(
|
|
static_cast<char>(negative ? -size : size)
|
|
);
|
|
|
|
if(negative)
|
|
ll = -l;
|
|
else
|
|
ll = l;
|
|
char * cptr = reinterpret_cast<char *>(& ll);
|
|
#ifdef BOOST_BIG_ENDIAN
|
|
cptr += (sizeof(boost::intmax_t) - size);
|
|
if(m_flags & endian_little)
|
|
reverse_bytes(size, cptr);
|
|
#else
|
|
if(m_flags & endian_big)
|
|
reverse_bytes(size, cptr);
|
|
#endif
|
|
this->primitive_base_t::save_binary(cptr, size);
|
|
}
|
|
|
|
void
|
|
portable_binary_oarchive::init(unsigned int flags) {
|
|
if(m_flags == (endian_big | endian_little)){
|
|
boost::serialization::throw_exception(
|
|
portable_binary_oarchive_exception()
|
|
);
|
|
}
|
|
if(0 == (flags & boost::archive::no_header)){
|
|
// write signature in an archive version independent manner
|
|
const std::string file_signature(
|
|
boost::archive::BOOST_ARCHIVE_SIGNATURE()
|
|
);
|
|
* this << file_signature;
|
|
// write library version
|
|
const boost::archive::version_type v(
|
|
boost::archive::BOOST_ARCHIVE_VERSION()
|
|
);
|
|
* this << v;
|
|
}
|
|
save(static_cast<unsigned char>(m_flags >> CHAR_BIT));
|
|
}
|
|
|
|
// explicitly instantiate for this type of stream
|
|
#include <boost/archive/impl/archive_pointer_oserializer.ipp>
|
|
#include <boost/archive/impl/basic_binary_oprimitive.ipp>
|
|
|
|
namespace boost {
|
|
namespace archive {
|
|
|
|
template class detail::archive_pointer_oserializer<portable_binary_oarchive> ;
|
|
template class basic_binary_oprimitive<
|
|
portable_binary_oarchive,
|
|
std::ostream::char_type,
|
|
std::ostream::traits_type
|
|
> ;
|
|
|
|
} // namespace archive
|
|
} // namespace boost
|