1/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 2// basic_text_oprimitive.ipp: 3 4// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 5// Use, modification and distribution is subject to the Boost Software 6// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 7// http://www.boost.org/LICENSE_1_0.txt) 8 9// See http://www.boost.org for updates, documentation, and revision history. 10 11#include <cstddef> // NULL 12#include <algorithm> // std::copy 13#include <boost/config.hpp> 14#if defined(BOOST_NO_STDC_NAMESPACE) 15namespace std{ 16 using ::size_t; 17} // namespace std 18#endif 19 20#include <boost/core/uncaught_exceptions.hpp> 21 22#include <boost/archive/basic_text_oprimitive.hpp> 23 24#include <boost/archive/iterators/base64_from_binary.hpp> 25#include <boost/archive/iterators/insert_linebreaks.hpp> 26#include <boost/archive/iterators/transform_width.hpp> 27#include <boost/archive/iterators/ostream_iterator.hpp> 28 29namespace boost { 30namespace archive { 31 32// translate to base64 and copy in to buffer. 33template<class OStream> 34BOOST_ARCHIVE_OR_WARCHIVE_DECL void 35basic_text_oprimitive<OStream>::save_binary( 36 const void *address, 37 std::size_t count 38){ 39 typedef typename OStream::char_type CharType; 40 41 if(0 == count) 42 return; 43 44 if(os.fail()) 45 boost::serialization::throw_exception( 46 archive_exception(archive_exception::output_stream_error) 47 ); 48 49 os.put('\n'); 50 51 typedef 52 boost::archive::iterators::insert_linebreaks< 53 boost::archive::iterators::base64_from_binary< 54 boost::archive::iterators::transform_width< 55 const char *, 56 6, 57 8 58 > 59 > 60 ,76 61 ,const char // cwpro8 needs this 62 > 63 base64_text; 64 65 boost::archive::iterators::ostream_iterator<CharType> oi(os); 66 std::copy( 67 base64_text(static_cast<const char *>(address)), 68 base64_text( 69 static_cast<const char *>(address) + count 70 ), 71 oi 72 ); 73 74 std::size_t tail = count % 3; 75 if(tail > 0){ 76 *oi++ = '='; 77 if(tail < 2) 78 *oi = '='; 79 } 80} 81 82template<class OStream> 83BOOST_ARCHIVE_OR_WARCHIVE_DECL 84basic_text_oprimitive<OStream>::basic_text_oprimitive( 85 OStream & os_, 86 bool no_codecvt 87) : 88 os(os_), 89 flags_saver(os_), 90 precision_saver(os_), 91#ifndef BOOST_NO_STD_LOCALE 92 codecvt_null_facet(1), 93 archive_locale(os.getloc(), & codecvt_null_facet), 94 locale_saver(os) 95{ 96 if(! no_codecvt){ 97 os_.flush(); 98 os_.imbue(archive_locale); 99 } 100 os_ << std::noboolalpha; 101} 102#else 103{} 104#endif 105 106 107template<class OStream> 108BOOST_ARCHIVE_OR_WARCHIVE_DECL 109basic_text_oprimitive<OStream>::~basic_text_oprimitive(){ 110 if(boost::core::uncaught_exceptions() > 0) 111 return; 112 os << std::endl; 113} 114 115} //namespace boost 116} //namespace archive 117