| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 | #ifndef BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP#define BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP// MS compatible compilers support #pragma once#if defined(_MSC_VER)# pragma once#endif/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// basic_binary_oprimitive.hpp// (C) Copyright 2002 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.// archives stored as native binary - this should be the fastest way// to archive the state of a group of obects.  It makes no attempt to// convert to any canonical form.// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON#include <iosfwd>#include <boost/assert.hpp>#include <locale>#include <streambuf> // basic_streambuf#include <string>#include <cstddef> // size_t#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{    using ::size_t;} // namespace std#endif#include <boost/cstdint.hpp>#include <boost/integer.hpp>#include <boost/integer_traits.hpp>#include <boost/scoped_ptr.hpp>#include <boost/serialization/throw_exception.hpp>//#include <boost/mpl/placeholders.hpp>#include <boost/serialization/is_bitwise_serializable.hpp>#include <boost/serialization/array_wrapper.hpp>#include <boost/archive/basic_streambuf_locale_saver.hpp>#include <boost/archive/codecvt_null.hpp>#include <boost/archive/archive_exception.hpp>#include <boost/archive/detail/auto_link_archive.hpp>#include <boost/archive/detail/abi_prefix.hpp> // must be the last headernamespace boost {namespace archive {/////////////////////////////////////////////////////////////////////////// class basic_binary_oprimitive - binary output of prmitivestemplate<class Archive, class Elem, class Tr>class BOOST_SYMBOL_VISIBLE basic_binary_oprimitive {#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS    friend class save_access;protected:#elsepublic:#endif    std::basic_streambuf<Elem, Tr> & m_sb;    // return a pointer to the most derived class    Archive * This(){        return static_cast<Archive *>(this);    }    #ifndef BOOST_NO_STD_LOCALE    // note order! - if you change this, libstd++ will fail!    // a) create new locale with new codecvt facet    // b) save current locale    // c) change locale to new one    // d) use stream buffer    // e) change locale back to original    // f) destroy new codecvt facet    boost::archive::codecvt_null<Elem> codecvt_null_facet;    basic_streambuf_locale_saver<Elem, Tr> locale_saver;    std::locale archive_locale;    #endif    // default saving of primitives.    template<class T>    void save(const T & t)    {        save_binary(& t, sizeof(T));    }    /////////////////////////////////////////////////////////    // fundamental types that need special treatment    // trap usage of invalid uninitialized boolean which would    // otherwise crash on load.    void save(const bool t){        BOOST_ASSERT(0 == static_cast<int>(t) || 1 == static_cast<int>(t));        save_binary(& t, sizeof(t));    }    BOOST_ARCHIVE_OR_WARCHIVE_DECL void    save(const std::string &s);    #ifndef BOOST_NO_STD_WSTRING    BOOST_ARCHIVE_OR_WARCHIVE_DECL void    save(const std::wstring &ws);    #endif    BOOST_ARCHIVE_OR_WARCHIVE_DECL void    save(const char * t);    BOOST_ARCHIVE_OR_WARCHIVE_DECL void    save(const wchar_t * t);    BOOST_ARCHIVE_OR_WARCHIVE_DECL void    init();    BOOST_ARCHIVE_OR_WARCHIVE_DECL    basic_binary_oprimitive(        std::basic_streambuf<Elem, Tr> & sb,        bool no_codecvt    );    BOOST_ARCHIVE_OR_WARCHIVE_DECL    ~basic_binary_oprimitive();public:    // we provide an optimized save for all fundamental types    // typedef serialization::is_bitwise_serializable<mpl::_1>    // use_array_optimization;    // workaround without using mpl lambdas    struct use_array_optimization {        template <class T>        #if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)            struct apply {                typedef typename boost::serialization::is_bitwise_serializable< T >::type type;            };        #else            struct apply : public boost::serialization::is_bitwise_serializable< T > {};        #endif    };    // the optimized save_array dispatches to save_binary    template <class ValueType>    void save_array(boost::serialization::array_wrapper<ValueType> const& a, unsigned int)    {      save_binary(a.address(),a.count()*sizeof(ValueType));    }    void save_binary(const void *address, std::size_t count);};template<class Archive, class Elem, class Tr>inline voidbasic_binary_oprimitive<Archive, Elem, Tr>::save_binary(    const void *address,    std::size_t count){    // BOOST_ASSERT(count <= std::size_t(boost::integer_traits<std::streamsize>::const_max));    // note: if the following assertions fail    // a likely cause is that the output stream is set to "text"    // mode where by cr characters recieve special treatment.    // be sure that the output stream is opened with ios::binary    //if(os.fail())    //    boost::serialization::throw_exception(    //        archive_exception(archive_exception::output_stream_error)    //    );    // figure number of elements to output - round up    count = ( count + sizeof(Elem) - 1) / sizeof(Elem);    std::streamsize scount = m_sb.sputn(        static_cast<const Elem *>(address),        static_cast<std::streamsize>(count)    );    if(count != static_cast<std::size_t>(scount))        boost::serialization::throw_exception(            archive_exception(archive_exception::output_stream_error)        );    //os.write(    //    static_cast<const typename OStream::char_type *>(address),    //    count    //);    //BOOST_ASSERT(os.good());}} //namespace boost} //namespace archive#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas#endif // BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP
 |