[29] | 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 |
---|