ossrv_pub/boost_apis/boost/archive/dinkumware.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 #ifndef BOOST_ARCHIVE_DINKUMWARE_HPP
       
     2 #define BOOST_ARCHIVE_DINKUMWARE_HPP
       
     3 
       
     4 // MS compatible compilers support #pragma once
       
     5 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
       
     6 # pragma once
       
     7 #endif
       
     8 
       
     9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
       
    10 // dinkumware.hpp:
       
    11 
       
    12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
       
    13 // Use, modification and distribution is subject to the Boost Software
       
    14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
       
    15 // http://www.boost.org/LICENSE_1_0.txt)
       
    16 
       
    17 //  See http://www.boost.org for updates, documentation, and revision history.
       
    18 
       
    19 // this file adds a couple of things that are missing from the dinkumware
       
    20 // implementation of the standard library.
       
    21 
       
    22 #include <iterator>
       
    23 #include <string>
       
    24 
       
    25 #include <boost/config.hpp>
       
    26 #include <boost/cstdint.hpp>
       
    27 
       
    28 namespace std {
       
    29 
       
    30 // define i/o operators for 64 bit integers
       
    31 template<class CharType>
       
    32 basic_ostream<CharType> & 
       
    33 operator<<(basic_ostream<CharType> & os, boost::uint64_t t){
       
    34     // octal rendering of 64 bit number would be 22 octets + eos
       
    35     CharType d[23];
       
    36     unsigned int radix;
       
    37 
       
    38     if(os.flags() & (int)std::ios_base::hex)
       
    39         radix = 16;
       
    40     else
       
    41     if(os.flags() & (int)std::ios_base::oct)
       
    42         radix = 8;
       
    43     else
       
    44     //if(s.flags() & (int)std::ios_base::dec)
       
    45         radix =  10;
       
    46     unsigned int i = 0;
       
    47     do{
       
    48         unsigned int j = t % radix;
       
    49         d[i++] = j + ((j < 10) ? '0' : ('a' - 10));
       
    50         t /= radix;
       
    51     }
       
    52     while(t > 0);
       
    53     d[i--] = '\0';
       
    54 
       
    55     // reverse digits
       
    56     unsigned int j = 0;
       
    57     while(j < i){
       
    58         CharType k = d[i];
       
    59         d[i] = d[j];
       
    60         d[j] = k;
       
    61         --i;++j;
       
    62     }
       
    63     os << d;
       
    64     return os;
       
    65 
       
    66 }
       
    67 
       
    68 template<class CharType>
       
    69 basic_ostream<CharType> & 
       
    70 operator<<(basic_ostream<CharType> &os, boost::int64_t t){
       
    71     if(0 <= t){
       
    72         os << static_cast<boost::uint64_t>(t);
       
    73     }
       
    74     else{
       
    75         os.put('-');
       
    76         os << -t;
       
    77     }
       
    78     return os;
       
    79 }
       
    80 
       
    81 template<class CharType>
       
    82 basic_istream<CharType> & 
       
    83 operator>>(basic_istream<CharType> &is, boost::int64_t & t){
       
    84     CharType d;
       
    85     do{
       
    86         d = is.get();
       
    87     }
       
    88     while(::isspace(d));
       
    89     bool negative = (d == '-');
       
    90     if(negative)
       
    91         d = is.get();
       
    92     unsigned int radix;
       
    93     if(is.flags() & (int)std::ios_base::hex)
       
    94         radix = 16;
       
    95     else
       
    96     if(is.flags() & (int)std::ios_base::oct)
       
    97         radix = 8;
       
    98     else
       
    99     //if(s.flags() & (int)std::ios_base::dec)
       
   100         radix =  10;
       
   101     t = 0;
       
   102     do{
       
   103         if('0' <= d && d <= '9')
       
   104             t = t * radix + (d - '0');
       
   105         else
       
   106         if('a' <= d && d <= 'f')
       
   107             t = t * radix + (d - 'a' + 10);
       
   108         else
       
   109             break;
       
   110         d = is.get();
       
   111     }
       
   112     while(!is.fail());
       
   113     // restore the delimiter
       
   114     is.putback(d);
       
   115     is.clear();
       
   116     if(negative)
       
   117         t = -t;
       
   118     return is;
       
   119 }
       
   120 
       
   121 template<class CharType>
       
   122 basic_istream<CharType> & 
       
   123 operator>>(basic_istream<CharType> &is, boost::uint64_t & t){
       
   124     boost::int64_t it;
       
   125     is >> it;
       
   126     t = it;
       
   127     return is;
       
   128 }
       
   129 
       
   130 //#endif
       
   131 
       
   132 template<>
       
   133 class back_insert_iterator<basic_string<char> > : public 
       
   134     iterator<output_iterator_tag, char>
       
   135 {
       
   136 public:
       
   137     typedef basic_string<char> container_type;
       
   138     typedef container_type::reference reference;
       
   139 
       
   140     explicit back_insert_iterator(container_type & s)
       
   141         : container(& s)
       
   142     {}    // construct with container
       
   143     
       
   144     back_insert_iterator<container_type> & operator=(
       
   145         container_type::const_reference Val_
       
   146     ){    // push value into container
       
   147         //container->push_back(Val_);
       
   148         *container += Val_;
       
   149         return (*this);
       
   150     }
       
   151 
       
   152     back_insert_iterator<container_type> & operator*(){
       
   153         return (*this);
       
   154     }
       
   155 
       
   156     back_insert_iterator<container_type> & operator++(){
       
   157         // pretend to preincrement
       
   158         return (*this);
       
   159     }
       
   160 
       
   161     back_insert_iterator<container_type> operator++(int){
       
   162         // pretend to postincrement
       
   163         return (*this);
       
   164     }
       
   165 
       
   166 protected:
       
   167     container_type *container;    // pointer to container
       
   168 };
       
   169 
       
   170 template<char> 
       
   171 inline back_insert_iterator<basic_string<char> > back_inserter(
       
   172     basic_string<char> & s
       
   173 ){
       
   174     return (std::back_insert_iterator<basic_string<char> >(s));
       
   175 }
       
   176 
       
   177 template<>
       
   178 class back_insert_iterator<basic_string<wchar_t> > : public 
       
   179     iterator<output_iterator_tag, wchar_t>
       
   180 {
       
   181 public:
       
   182     typedef basic_string<wchar_t> container_type;
       
   183     typedef container_type::reference reference;
       
   184 
       
   185     explicit back_insert_iterator(container_type & s)
       
   186         : container(& s)
       
   187     {}    // construct with container
       
   188     
       
   189     back_insert_iterator<container_type> & operator=(
       
   190         container_type::const_reference Val_
       
   191     ){    // push value into container
       
   192         //container->push_back(Val_);
       
   193         *container += Val_;
       
   194         return (*this);
       
   195     }
       
   196 
       
   197     back_insert_iterator<container_type> & operator*(){
       
   198         return (*this);
       
   199     }
       
   200 
       
   201     back_insert_iterator<container_type> & operator++(){
       
   202         // pretend to preincrement
       
   203         return (*this);
       
   204     }
       
   205 
       
   206     back_insert_iterator<container_type> operator++(int){
       
   207         // pretend to postincrement
       
   208         return (*this);
       
   209     }
       
   210 
       
   211 protected:
       
   212     container_type *container;    // pointer to container
       
   213 };
       
   214 
       
   215 template<wchar_t> 
       
   216 inline back_insert_iterator<basic_string<wchar_t> > back_inserter(
       
   217     basic_string<wchar_t> & s
       
   218 ){
       
   219     return (std::back_insert_iterator<basic_string<wchar_t> >(s));
       
   220 }
       
   221 
       
   222 } // namespace std
       
   223 
       
   224 #endif //BOOST_ARCHIVE_DINKUMWARE_HPP