116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 | ||
|  | // basic_text_oprimitive.ipp: | ||
|  | 
 | ||
|  | // (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. | ||
|  | 
 | ||
|  | #include <cstddef> // NULL | ||
|  | #include <algorithm> // std::copy | ||
|  | #include <exception> // std::uncaught_exception | ||
|  | #include <boost/config.hpp> | ||
|  | #if defined(BOOST_NO_STDC_NAMESPACE) | ||
|  | namespace std{  | ||
|  |     using ::size_t;  | ||
|  | } // namespace std | ||
|  | #endif | ||
|  | 
 | ||
|  | #include <boost/archive/basic_text_oprimitive.hpp> | ||
|  | 
 | ||
|  | #include <boost/archive/iterators/base64_from_binary.hpp> | ||
|  | #include <boost/archive/iterators/insert_linebreaks.hpp> | ||
|  | #include <boost/archive/iterators/transform_width.hpp> | ||
|  | #include <boost/archive/iterators/ostream_iterator.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace archive { | ||
|  | 
 | ||
|  | // translate to base64 and copy in to buffer. | ||
|  | template<class OStream> | ||
|  | BOOST_ARCHIVE_OR_WARCHIVE_DECL void | ||
|  | basic_text_oprimitive<OStream>::save_binary( | ||
|  |     const void *address,  | ||
|  |     std::size_t count | ||
|  | ){ | ||
|  |     typedef typename OStream::char_type CharType; | ||
|  |      | ||
|  |     if(0 == count) | ||
|  |         return; | ||
|  |      | ||
|  |     if(os.fail()) | ||
|  |         boost::serialization::throw_exception( | ||
|  |             archive_exception(archive_exception::output_stream_error) | ||
|  |         ); | ||
|  |          | ||
|  |     os.put('\n'); | ||
|  |      | ||
|  |     typedef  | ||
|  |         boost::archive::iterators::insert_linebreaks< | ||
|  |             boost::archive::iterators::base64_from_binary< | ||
|  |                 boost::archive::iterators::transform_width< | ||
|  |                     const char *, | ||
|  |                     6, | ||
|  |                     8 | ||
|  |                 > | ||
|  |             >  | ||
|  |             ,76 | ||
|  |             ,const char // cwpro8 needs this | ||
|  |         >  | ||
|  |         base64_text; | ||
|  | 
 | ||
|  |     boost::archive::iterators::ostream_iterator<CharType> oi(os); | ||
|  |     std::copy( | ||
|  |         base64_text(static_cast<const char *>(address)), | ||
|  |         base64_text( | ||
|  |             static_cast<const char *>(address) + count | ||
|  |         ), | ||
|  |         oi | ||
|  |     ); | ||
|  |      | ||
|  |     std::size_t tail = count % 3; | ||
|  |     if(tail > 0){ | ||
|  |         *oi++ = '='; | ||
|  |         if(tail < 2) | ||
|  |             *oi = '='; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | template<class OStream> | ||
|  | BOOST_ARCHIVE_OR_WARCHIVE_DECL | ||
|  | basic_text_oprimitive<OStream>::basic_text_oprimitive( | ||
|  |     OStream & os_, | ||
|  |     bool no_codecvt | ||
|  | ) :  | ||
|  |     os(os_), | ||
|  |     flags_saver(os_), | ||
|  |     precision_saver(os_), | ||
|  | #ifndef BOOST_NO_STD_LOCALE | ||
|  |     codecvt_null_facet(1), | ||
|  |     archive_locale(os.getloc(), & codecvt_null_facet), | ||
|  |     locale_saver(os) | ||
|  | { | ||
|  |     if(! no_codecvt){ | ||
|  |         os_.flush(); | ||
|  |         os_.imbue(archive_locale); | ||
|  |     } | ||
|  |     os_ << std::noboolalpha; | ||
|  | } | ||
|  | #else | ||
|  | {} | ||
|  | #endif | ||
|  | 
 | ||
|  | 
 | ||
|  | template<class OStream> | ||
|  | BOOST_ARCHIVE_OR_WARCHIVE_DECL | ||
|  | basic_text_oprimitive<OStream>::~basic_text_oprimitive(){ | ||
|  |     if(std::uncaught_exception()) | ||
|  |         return; | ||
|  |     os << std::endl; | ||
|  | } | ||
|  | 
 | ||
|  | } //namespace boost  | ||
|  | } //namespace archive  |