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