143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// MS compatible compilers support #pragma once
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								# pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
							 | 
						||
| 
								 | 
							
								// basic_text_iprimitive.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 text - note these are templated on the basic
							 | 
						||
| 
								 | 
							
								// stream templates to accommodate wide (and other?) kind of characters
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Note the fact that on libraries without wide characters, ostream is
							 | 
						||
| 
								 | 
							
								// not a specialization of basic_ostream which in fact is not defined
							 | 
						||
| 
								 | 
							
								// in such cases.   So we can't use basic_ostream<IStream::char_type> but rather
							 | 
						||
| 
								 | 
							
								// use two template parameters
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <locale>
							 | 
						||
| 
								 | 
							
								#include <cstddef> // size_t
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_NO_STDC_NAMESPACE)
							 | 
						||
| 
								 | 
							
								namespace std{ 
							 | 
						||
| 
								 | 
							
								    using ::size_t; 
							 | 
						||
| 
								 | 
							
								    #if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT)
							 | 
						||
| 
								 | 
							
								        using ::locale;
							 | 
						||
| 
								 | 
							
								    #endif
							 | 
						||
| 
								 | 
							
								} // namespace std
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/io/ios_state.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/static_assert.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/detail/workaround.hpp>
							 | 
						||
| 
								 | 
							
								#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
							 | 
						||
| 
								 | 
							
								#include <boost/archive/dinkumware.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/throw_exception.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/codecvt_null.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/archive_exception.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/basic_streambuf_locale_saver.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace archive {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								// class basic_text_iarchive - load serialized objects from a input text stream
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								#pragma warning( push )
							 | 
						||
| 
								 | 
							
								#pragma warning( disable : 4244 4267 )
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class IStream>
							 | 
						||
| 
								 | 
							
								class BOOST_SYMBOL_VISIBLE basic_text_iprimitive {
							 | 
						||
| 
								 | 
							
								protected:
							 | 
						||
| 
								 | 
							
								    IStream &is;
							 | 
						||
| 
								 | 
							
								    io::ios_flags_saver flags_saver;
							 | 
						||
| 
								 | 
							
								    io::ios_precision_saver precision_saver;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #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<typename IStream::char_type> codecvt_null_facet;
							 | 
						||
| 
								 | 
							
								    std::locale archive_locale;
							 | 
						||
| 
								 | 
							
								    basic_istream_locale_saver<
							 | 
						||
| 
								 | 
							
								        typename IStream::char_type,
							 | 
						||
| 
								 | 
							
								        typename IStream::traits_type
							 | 
						||
| 
								 | 
							
								    > locale_saver;
							 | 
						||
| 
								 | 
							
								    #endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<class T>
							 | 
						||
| 
								 | 
							
								    void load(T & t)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(is >> t)
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        boost::serialization::throw_exception(
							 | 
						||
| 
								 | 
							
								            archive_exception(archive_exception::input_stream_error)
							 | 
						||
| 
								 | 
							
								        );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    void load(char & t)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        short int i;
							 | 
						||
| 
								 | 
							
								        load(i);
							 | 
						||
| 
								 | 
							
								        t = i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    void load(signed char & t)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        short int i;
							 | 
						||
| 
								 | 
							
								        load(i);
							 | 
						||
| 
								 | 
							
								        t = i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    void load(unsigned char & t)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        unsigned short int i;
							 | 
						||
| 
								 | 
							
								        load(i);
							 | 
						||
| 
								 | 
							
								        t = i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
							 | 
						||
| 
								 | 
							
								    void load(wchar_t & t)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        BOOST_STATIC_ASSERT(sizeof(wchar_t) <= sizeof(int));
							 | 
						||
| 
								 | 
							
								        int i;
							 | 
						||
| 
								 | 
							
								        load(i);
							 | 
						||
| 
								 | 
							
								        t = i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    #endif
							 | 
						||
| 
								 | 
							
								    BOOST_ARCHIVE_OR_WARCHIVE_DECL 
							 | 
						||
| 
								 | 
							
								    basic_text_iprimitive(IStream  &is, bool no_codecvt);
							 | 
						||
| 
								 | 
							
								    BOOST_ARCHIVE_OR_WARCHIVE_DECL 
							 | 
						||
| 
								 | 
							
								    ~basic_text_iprimitive();
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    BOOST_ARCHIVE_OR_WARCHIVE_DECL void
							 | 
						||
| 
								 | 
							
								    load_binary(void *address, std::size_t count);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(_MSC_VER)
							 | 
						||
| 
								 | 
							
								#pragma warning( pop )
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace archive
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
							 |