225 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			225 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #ifndef BOOST_ARCHIVE_DINKUMWARE_HPP | ||
|  | #define BOOST_ARCHIVE_DINKUMWARE_HPP | ||
|  | 
 | ||
|  | // MS compatible compilers support #pragma once | ||
|  | #if defined(_MSC_VER) | ||
|  | # pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 | ||
|  | // dinkumware.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. | ||
|  | 
 | ||
|  | // this file adds a couple of things that are missing from the dinkumware | ||
|  | // implementation of the standard library. | ||
|  | 
 | ||
|  | #include <iterator> | ||
|  | #include <string> | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/cstdint.hpp> | ||
|  | 
 | ||
|  | namespace std { | ||
|  | 
 | ||
|  | // define i/o operators for 64 bit integers | ||
|  | template<class CharType> | ||
|  | basic_ostream<CharType> &  | ||
|  | operator<<(basic_ostream<CharType> & os, boost::uint64_t t){ | ||
|  |     // octal rendering of 64 bit number would be 22 octets + eos | ||
|  |     CharType d[23]; | ||
|  |     unsigned int radix; | ||
|  | 
 | ||
|  |     if(os.flags() & (int)std::ios_base::hex) | ||
|  |         radix = 16; | ||
|  |     else | ||
|  |     if(os.flags() & (int)std::ios_base::oct) | ||
|  |         radix = 8; | ||
|  |     else | ||
|  |     //if(s.flags() & (int)std::ios_base::dec) | ||
|  |         radix =  10; | ||
|  |     unsigned int i = 0; | ||
|  |     do{ | ||
|  |         unsigned int j = t % radix; | ||
|  |         d[i++] = j + ((j < 10) ? '0' : ('a' - 10)); | ||
|  |         t /= radix; | ||
|  |     } | ||
|  |     while(t > 0); | ||
|  |     d[i--] = '\0'; | ||
|  | 
 | ||
|  |     // reverse digits | ||
|  |     unsigned int j = 0; | ||
|  |     while(j < i){ | ||
|  |         CharType k = d[i]; | ||
|  |         d[i] = d[j]; | ||
|  |         d[j] = k; | ||
|  |         --i;++j; | ||
|  |     } | ||
|  |     os << d; | ||
|  |     return os; | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | template<class CharType> | ||
|  | basic_ostream<CharType> &  | ||
|  | operator<<(basic_ostream<CharType> &os, boost::int64_t t){ | ||
|  |     if(0 <= t){ | ||
|  |         os << static_cast<boost::uint64_t>(t); | ||
|  |     } | ||
|  |     else{ | ||
|  |         os.put('-'); | ||
|  |         os << -t; | ||
|  |     } | ||
|  |     return os; | ||
|  | } | ||
|  | 
 | ||
|  | template<class CharType> | ||
|  | basic_istream<CharType> &  | ||
|  | operator>>(basic_istream<CharType> &is, boost::int64_t & t){ | ||
|  |     CharType d; | ||
|  |     do{ | ||
|  |         d = is.get(); | ||
|  |     } | ||
|  |     while(::isspace(d)); | ||
|  |     bool negative = (d == '-'); | ||
|  |     if(negative) | ||
|  |         d = is.get(); | ||
|  |     unsigned int radix; | ||
|  |     if(is.flags() & (int)std::ios_base::hex) | ||
|  |         radix = 16; | ||
|  |     else | ||
|  |     if(is.flags() & (int)std::ios_base::oct) | ||
|  |         radix = 8; | ||
|  |     else | ||
|  |     //if(s.flags() & (int)std::ios_base::dec) | ||
|  |         radix =  10; | ||
|  |     t = 0; | ||
|  |     do{ | ||
|  |         if('0' <= d && d <= '9') | ||
|  |             t = t * radix + (d - '0'); | ||
|  |         else | ||
|  |         if('a' <= d && d <= 'f') | ||
|  |             t = t * radix + (d - 'a' + 10); | ||
|  |         else | ||
|  |             break; | ||
|  |         d = is.get(); | ||
|  |     } | ||
|  |     while(!is.fail()); | ||
|  |     // restore the delimiter | ||
|  |     is.putback(d); | ||
|  |     is.clear(); | ||
|  |     if(negative) | ||
|  |         t = -t; | ||
|  |     return is; | ||
|  | } | ||
|  | 
 | ||
|  | template<class CharType> | ||
|  | basic_istream<CharType> &  | ||
|  | operator>>(basic_istream<CharType> &is, boost::uint64_t & t){ | ||
|  |     boost::int64_t it; | ||
|  |     is >> it; | ||
|  |     t = it; | ||
|  |     return is; | ||
|  | } | ||
|  | 
 | ||
|  | //#endif | ||
|  | 
 | ||
|  | template<> | ||
|  | class back_insert_iterator<basic_string<char> > : public  | ||
|  |     iterator<output_iterator_tag, char> | ||
|  | { | ||
|  | public: | ||
|  |     typedef basic_string<char> container_type; | ||
|  |     typedef container_type::reference reference; | ||
|  | 
 | ||
|  |     explicit back_insert_iterator(container_type & s) | ||
|  |         : container(& s) | ||
|  |     {}    // construct with container | ||
|  |      | ||
|  |     back_insert_iterator<container_type> & operator=( | ||
|  |         container_type::const_reference Val_ | ||
|  |     ){    // push value into container | ||
|  |         //container->push_back(Val_); | ||
|  |         *container += Val_; | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> & operator*(){ | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> & operator++(){ | ||
|  |         // pretend to preincrement | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> operator++(int){ | ||
|  |         // pretend to postincrement | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  | protected: | ||
|  |     container_type *container;    // pointer to container | ||
|  | }; | ||
|  | 
 | ||
|  | template<char>  | ||
|  | inline back_insert_iterator<basic_string<char> > back_inserter( | ||
|  |     basic_string<char> & s | ||
|  | ){ | ||
|  |     return (std::back_insert_iterator<basic_string<char> >(s)); | ||
|  | } | ||
|  | 
 | ||
|  | template<> | ||
|  | class back_insert_iterator<basic_string<wchar_t> > : public  | ||
|  |     iterator<output_iterator_tag, wchar_t> | ||
|  | { | ||
|  | public: | ||
|  |     typedef basic_string<wchar_t> container_type; | ||
|  |     typedef container_type::reference reference; | ||
|  | 
 | ||
|  |     explicit back_insert_iterator(container_type & s) | ||
|  |         : container(& s) | ||
|  |     {}    // construct with container | ||
|  |      | ||
|  |     back_insert_iterator<container_type> & operator=( | ||
|  |         container_type::const_reference Val_ | ||
|  |     ){    // push value into container | ||
|  |         //container->push_back(Val_); | ||
|  |         *container += Val_; | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> & operator*(){ | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> & operator++(){ | ||
|  |         // pretend to preincrement | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  |     back_insert_iterator<container_type> operator++(int){ | ||
|  |         // pretend to postincrement | ||
|  |         return (*this); | ||
|  |     } | ||
|  | 
 | ||
|  | protected: | ||
|  |     container_type *container;    // pointer to container | ||
|  | }; | ||
|  | 
 | ||
|  | template<wchar_t>  | ||
|  | inline back_insert_iterator<basic_string<wchar_t> > back_inserter( | ||
|  |     basic_string<wchar_t> & s | ||
|  | ){ | ||
|  |     return (std::back_insert_iterator<basic_string<wchar_t> >(s)); | ||
|  | } | ||
|  | 
 | ||
|  | } // namespace std | ||
|  | 
 | ||
|  | #endif //BOOST_ARCHIVE_DINKUMWARE_HPP |