portable_binary_oarchive.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 97 行

CPP
97
字号
/////////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

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?