Blame boost/archive/dinkumware.hpp

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