Chris@16: #ifndef BOOST_ARCHIVE_DINKUMWARE_HPP Chris@16: #define BOOST_ARCHIVE_DINKUMWARE_HPP Chris@16: Chris@16: // MS compatible compilers support #pragma once Chris@101: #if defined(_MSC_VER) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // dinkumware.hpp: Chris@16: Chris@16: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: Chris@16: // this file adds a couple of things that are missing from the dinkumware Chris@16: // implementation of the standard library. Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace std { Chris@16: Chris@16: // define i/o operators for 64 bit integers Chris@16: template Chris@16: basic_ostream & Chris@16: operator<<(basic_ostream & os, boost::uint64_t t){ Chris@16: // octal rendering of 64 bit number would be 22 octets + eos Chris@16: CharType d[23]; Chris@16: unsigned int radix; Chris@16: Chris@16: if(os.flags() & (int)std::ios_base::hex) Chris@16: radix = 16; Chris@16: else Chris@16: if(os.flags() & (int)std::ios_base::oct) Chris@16: radix = 8; Chris@16: else Chris@16: //if(s.flags() & (int)std::ios_base::dec) Chris@16: radix = 10; Chris@16: unsigned int i = 0; Chris@16: do{ Chris@16: unsigned int j = t % radix; Chris@16: d[i++] = j + ((j < 10) ? '0' : ('a' - 10)); Chris@16: t /= radix; Chris@16: } Chris@16: while(t > 0); Chris@16: d[i--] = '\0'; Chris@16: Chris@16: // reverse digits Chris@16: unsigned int j = 0; Chris@16: while(j < i){ Chris@16: CharType k = d[i]; Chris@16: d[i] = d[j]; Chris@16: d[j] = k; Chris@16: --i;++j; Chris@16: } Chris@16: os << d; Chris@16: return os; Chris@16: Chris@16: } Chris@16: Chris@16: template Chris@16: basic_ostream & Chris@16: operator<<(basic_ostream &os, boost::int64_t t){ Chris@16: if(0 <= t){ Chris@16: os << static_cast(t); Chris@16: } Chris@16: else{ Chris@16: os.put('-'); Chris@16: os << -t; Chris@16: } Chris@16: return os; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_istream & Chris@16: operator>>(basic_istream &is, boost::int64_t & t){ Chris@16: CharType d; Chris@16: do{ Chris@16: d = is.get(); Chris@16: } Chris@16: while(::isspace(d)); Chris@16: bool negative = (d == '-'); Chris@16: if(negative) Chris@16: d = is.get(); Chris@16: unsigned int radix; Chris@16: if(is.flags() & (int)std::ios_base::hex) Chris@16: radix = 16; Chris@16: else Chris@16: if(is.flags() & (int)std::ios_base::oct) Chris@16: radix = 8; Chris@16: else Chris@16: //if(s.flags() & (int)std::ios_base::dec) Chris@16: radix = 10; Chris@16: t = 0; Chris@16: do{ Chris@16: if('0' <= d && d <= '9') Chris@16: t = t * radix + (d - '0'); Chris@16: else Chris@16: if('a' <= d && d <= 'f') Chris@16: t = t * radix + (d - 'a' + 10); Chris@16: else Chris@16: break; Chris@16: d = is.get(); Chris@16: } Chris@16: while(!is.fail()); Chris@16: // restore the delimiter Chris@16: is.putback(d); Chris@16: is.clear(); Chris@16: if(negative) Chris@16: t = -t; Chris@16: return is; Chris@16: } Chris@16: Chris@16: template Chris@16: basic_istream & Chris@16: operator>>(basic_istream &is, boost::uint64_t & t){ Chris@16: boost::int64_t it; Chris@16: is >> it; Chris@16: t = it; Chris@16: return is; Chris@16: } Chris@16: Chris@16: //#endif Chris@16: Chris@16: template<> Chris@16: class back_insert_iterator > : public Chris@16: iterator Chris@16: { Chris@16: public: Chris@16: typedef basic_string container_type; Chris@16: typedef container_type::reference reference; Chris@16: Chris@16: explicit back_insert_iterator(container_type & s) Chris@16: : container(& s) Chris@16: {} // construct with container Chris@16: Chris@16: back_insert_iterator & operator=( Chris@16: container_type::const_reference Val_ Chris@16: ){ // push value into container Chris@16: //container->push_back(Val_); Chris@16: *container += Val_; Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator & operator*(){ Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator & operator++(){ Chris@16: // pretend to preincrement Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator operator++(int){ Chris@16: // pretend to postincrement Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: protected: Chris@16: container_type *container; // pointer to container Chris@16: }; Chris@16: Chris@16: template Chris@16: inline back_insert_iterator > back_inserter( Chris@16: basic_string & s Chris@16: ){ Chris@16: return (std::back_insert_iterator >(s)); Chris@16: } Chris@16: Chris@16: template<> Chris@16: class back_insert_iterator > : public Chris@16: iterator Chris@16: { Chris@16: public: Chris@16: typedef basic_string container_type; Chris@16: typedef container_type::reference reference; Chris@16: Chris@16: explicit back_insert_iterator(container_type & s) Chris@16: : container(& s) Chris@16: {} // construct with container Chris@16: Chris@16: back_insert_iterator & operator=( Chris@16: container_type::const_reference Val_ Chris@16: ){ // push value into container Chris@16: //container->push_back(Val_); Chris@16: *container += Val_; Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator & operator*(){ Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator & operator++(){ Chris@16: // pretend to preincrement Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: back_insert_iterator operator++(int){ Chris@16: // pretend to postincrement Chris@16: return (*this); Chris@16: } Chris@16: Chris@16: protected: Chris@16: container_type *container; // pointer to container Chris@16: }; Chris@16: Chris@16: template Chris@16: inline back_insert_iterator > back_inserter( Chris@16: basic_string & s Chris@16: ){ Chris@16: return (std::back_insert_iterator >(s)); Chris@16: } Chris@16: Chris@16: } // namespace std Chris@16: Chris@16: #endif //BOOST_ARCHIVE_DINKUMWARE_HPP