annotate DEPENDENCIES/generic/include/boost/archive/dinkumware.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
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