annotate DEPENDENCIES/generic/include/boost/uuid/uuid_io.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 // Boost uuid_io.hpp header file ----------------------------------------------//
Chris@16 2
Chris@16 3 // Copyright 2009 Andy Tompkins.
Chris@16 4 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 5 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 6 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7
Chris@16 8 // Revision History
Chris@16 9 // 20 Mar 2009 - Initial Revision
Chris@16 10 // 28 Nov 2009 - disabled deprecated warnings for MSVC
Chris@16 11
Chris@16 12 #ifndef BOOST_UUID_IO_HPP
Chris@16 13 #define BOOST_UUID_IO_HPP
Chris@16 14
Chris@16 15 #include <boost/uuid/uuid.hpp>
Chris@16 16 #include <ios>
Chris@16 17 #include <ostream>
Chris@16 18 #include <istream>
Chris@16 19 #include <boost/io/ios_state.hpp>
Chris@16 20 #include <locale>
Chris@16 21 #include <algorithm>
Chris@16 22
Chris@16 23 #if defined(_MSC_VER)
Chris@16 24 #pragma warning(push) // Save warning settings.
Chris@16 25 #pragma warning(disable : 4996) // Disable deprecated std::ctype<char>::widen, std::copy
Chris@16 26 #endif
Chris@16 27
Chris@16 28 namespace boost {
Chris@16 29 namespace uuids {
Chris@16 30
Chris@16 31 template <typename ch, typename char_traits>
Chris@16 32 std::basic_ostream<ch, char_traits>& operator<<(std::basic_ostream<ch, char_traits> &os, uuid const& u)
Chris@16 33 {
Chris@16 34 io::ios_flags_saver flags_saver(os);
Chris@16 35 io::basic_ios_fill_saver<ch, char_traits> fill_saver(os);
Chris@16 36
Chris@16 37 const typename std::basic_ostream<ch, char_traits>::sentry ok(os);
Chris@16 38 if (ok) {
Chris@16 39 const std::streamsize width = os.width(0);
Chris@16 40 const std::streamsize uuid_width = 36;
Chris@16 41 const std::ios_base::fmtflags flags = os.flags();
Chris@16 42 const typename std::basic_ios<ch, char_traits>::char_type fill = os.fill();
Chris@16 43 if (flags & (std::ios_base::right | std::ios_base::internal)) {
Chris@16 44 for (std::streamsize i=uuid_width; i<width; i++) {
Chris@16 45 os << fill;
Chris@16 46 }
Chris@16 47 }
Chris@16 48
Chris@16 49 os << std::hex;
Chris@16 50 os.fill(os.widen('0'));
Chris@16 51
Chris@16 52 std::size_t i=0;
Chris@16 53 for (uuid::const_iterator i_data = u.begin(); i_data!=u.end(); ++i_data, ++i) {
Chris@16 54 os.width(2);
Chris@16 55 os << static_cast<unsigned int>(*i_data);
Chris@16 56 if (i == 3 || i == 5 || i == 7 || i == 9) {
Chris@16 57 os << os.widen('-');
Chris@16 58 }
Chris@16 59 }
Chris@16 60
Chris@16 61 if (flags & std::ios_base::left) {
Chris@101 62 for (std::streamsize s=uuid_width; s<width; s++) {
Chris@16 63 os << fill;
Chris@16 64 }
Chris@16 65 }
Chris@16 66
Chris@16 67 os.width(0); //used the width so reset it
Chris@16 68 }
Chris@16 69 return os;
Chris@16 70 }
Chris@16 71
Chris@16 72 template <typename ch, typename char_traits>
Chris@16 73 std::basic_istream<ch, char_traits>& operator>>(std::basic_istream<ch, char_traits> &is, uuid &u)
Chris@16 74 {
Chris@16 75 const typename std::basic_istream<ch, char_traits>::sentry ok(is);
Chris@16 76 if (ok) {
Chris@16 77 unsigned char data[16];
Chris@16 78
Chris@16 79 typedef std::ctype<ch> ctype_t;
Chris@16 80 ctype_t const& ctype = std::use_facet<ctype_t>(is.getloc());
Chris@16 81
Chris@16 82 ch xdigits[16];
Chris@16 83 {
Chris@16 84 char szdigits[] = "0123456789ABCDEF";
Chris@16 85 ctype.widen(szdigits, szdigits+16, xdigits);
Chris@16 86 }
Chris@16 87 ch*const xdigits_end = xdigits+16;
Chris@16 88
Chris@16 89 ch c;
Chris@16 90 for (std::size_t i=0; i<u.size() && is; ++i) {
Chris@16 91 is >> c;
Chris@16 92 c = ctype.toupper(c);
Chris@16 93
Chris@16 94 ch* f = std::find(xdigits, xdigits_end, c);
Chris@16 95 if (f == xdigits_end) {
Chris@16 96 is.setstate(std::ios_base::failbit);
Chris@16 97 break;
Chris@16 98 }
Chris@16 99
Chris@16 100 unsigned char byte = static_cast<unsigned char>(std::distance(&xdigits[0], f));
Chris@16 101
Chris@16 102 is >> c;
Chris@16 103 c = ctype.toupper(c);
Chris@16 104 f = std::find(xdigits, xdigits_end, c);
Chris@16 105 if (f == xdigits_end) {
Chris@16 106 is.setstate(std::ios_base::failbit);
Chris@16 107 break;
Chris@16 108 }
Chris@16 109
Chris@16 110 byte <<= 4;
Chris@16 111 byte |= static_cast<unsigned char>(std::distance(&xdigits[0], f));
Chris@16 112
Chris@16 113 data[i] = byte;
Chris@16 114
Chris@16 115 if (is) {
Chris@16 116 if (i == 3 || i == 5 || i == 7 || i == 9) {
Chris@16 117 is >> c;
Chris@16 118 if (c != is.widen('-')) is.setstate(std::ios_base::failbit);
Chris@16 119 }
Chris@16 120 }
Chris@16 121 }
Chris@16 122
Chris@16 123 if (is) {
Chris@16 124 std::copy(data, data+16, u.begin());
Chris@16 125 }
Chris@16 126 }
Chris@16 127 return is;
Chris@16 128 }
Chris@16 129
Chris@16 130 namespace detail {
Chris@16 131 inline char to_char(size_t i) {
Chris@16 132 if (i <= 9) {
Chris@16 133 return static_cast<char>('0' + i);
Chris@16 134 } else {
Chris@16 135 return static_cast<char>('a' + (i-10));
Chris@16 136 }
Chris@16 137 }
Chris@16 138
Chris@16 139 inline wchar_t to_wchar(size_t i) {
Chris@16 140 if (i <= 9) {
Chris@16 141 return static_cast<wchar_t>(L'0' + i);
Chris@16 142 } else {
Chris@16 143 return static_cast<wchar_t>(L'a' + (i-10));
Chris@16 144 }
Chris@16 145 }
Chris@16 146
Chris@16 147 } // namespace detail
Chris@16 148
Chris@16 149 inline std::string to_string(uuid const& u)
Chris@16 150 {
Chris@16 151 std::string result;
Chris@16 152 result.reserve(36);
Chris@16 153
Chris@16 154 std::size_t i=0;
Chris@16 155 for (uuid::const_iterator it_data = u.begin(); it_data!=u.end(); ++it_data, ++i) {
Chris@16 156 const size_t hi = ((*it_data) >> 4) & 0x0F;
Chris@16 157 result += detail::to_char(hi);
Chris@16 158
Chris@16 159 const size_t lo = (*it_data) & 0x0F;
Chris@16 160 result += detail::to_char(lo);
Chris@16 161
Chris@16 162 if (i == 3 || i == 5 || i == 7 || i == 9) {
Chris@16 163 result += '-';
Chris@16 164 }
Chris@16 165 }
Chris@16 166 return result;
Chris@16 167 }
Chris@16 168
Chris@16 169 #ifndef BOOST_NO_STD_WSTRING
Chris@16 170 inline std::wstring to_wstring(uuid const& u)
Chris@16 171 {
Chris@16 172 std::wstring result;
Chris@16 173 result.reserve(36);
Chris@16 174
Chris@16 175 std::size_t i=0;
Chris@16 176 for (uuid::const_iterator it_data = u.begin(); it_data!=u.end(); ++it_data, ++i) {
Chris@16 177 const size_t hi = ((*it_data) >> 4) & 0x0F;
Chris@16 178 result += detail::to_wchar(hi);
Chris@16 179
Chris@16 180 const size_t lo = (*it_data) & 0x0F;
Chris@16 181 result += detail::to_wchar(lo);
Chris@16 182
Chris@16 183 if (i == 3 || i == 5 || i == 7 || i == 9) {
Chris@16 184 result += L'-';
Chris@16 185 }
Chris@16 186 }
Chris@16 187 return result;
Chris@16 188 }
Chris@16 189
Chris@16 190 #endif
Chris@16 191
Chris@16 192 }} //namespace boost::uuids
Chris@16 193
Chris@16 194 #if defined(_MSC_VER)
Chris@16 195 #pragma warning(pop) // Restore warnings to previous state.
Chris@16 196 #endif
Chris@16 197
Chris@16 198 #endif // BOOST_UUID_IO_HPP