/////////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 #include #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(negative ? -size : size) ); if(negative) ll = -l; else ll = l; char * cptr = reinterpret_cast(& ll); #if BOOST_ENDIAN_BIG_BYTE 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::library_version_type v( boost::archive::BOOST_ARCHIVE_VERSION() ); * this << v; } save(static_cast(m_flags >> CHAR_BIT)); } #include #include namespace boost { namespace archive { namespace detail { template class archive_serializer_map; } template class basic_binary_oprimitive< portable_binary_oarchive, std::ostream::char_type, std::ostream::traits_type > ; } // namespace archive } // namespace boost