annotate DEPENDENCIES/generic/include/boost/uuid/uuid.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.hpp header file ----------------------------------------------//
Chris@16 2
Chris@16 3 // Copyright 2006 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 // 06 Feb 2006 - Initial Revision
Chris@16 10 // 09 Nov 2006 - fixed variant and version bits for v4 guids
Chris@16 11 // 13 Nov 2006 - added serialization
Chris@16 12 // 17 Nov 2006 - added name-based guid creation
Chris@16 13 // 20 Nov 2006 - add fixes for gcc (from Tim Blechmann)
Chris@16 14 // 07 Mar 2007 - converted to header only
Chris@16 15 // 10 May 2007 - removed need for Boost.Thread
Chris@16 16 // - added better seed - thanks Peter Dimov
Chris@16 17 // - removed null()
Chris@16 18 // - replaced byte_count() and output_bytes() with size() and begin() and end()
Chris@16 19 // 11 May 2007 - fixed guid(ByteInputIterator first, ByteInputIterator last)
Chris@16 20 // - optimized operator>>
Chris@16 21 // 14 May 2007 - converted from guid to uuid
Chris@16 22 // 29 May 2007 - uses new implementation of sha1
Chris@16 23 // 01 Jun 2007 - removed using namespace directives
Chris@16 24 // 09 Nov 2007 - moved implementation to uuid.ipp file
Chris@16 25 // 12 Nov 2007 - moved serialize code to uuid_serialize.hpp file
Chris@16 26 // 25 Feb 2008 - moved to namespace boost::uuids
Chris@16 27 // 19 Mar 2009 - changed to a POD, reorganized files
Chris@16 28 // 28 Nov 2009 - disabled deprecated warnings for MSVC
Chris@16 29 // 30 Nov 2009 - used BOOST_STATIC_CONSTANT
Chris@16 30 // 02 Dec 2009 - removed BOOST_STATIC_CONSTANT - not all compilers like it
Chris@101 31 // 29 Apr 2013 - added support for noexcept and constexpr, added optimizations for SSE/AVX
Chris@16 32
Chris@16 33 #ifndef BOOST_UUID_HPP
Chris@16 34 #define BOOST_UUID_HPP
Chris@16 35
Chris@101 36 #include <cstddef>
Chris@16 37 #include <boost/cstdint.hpp>
Chris@101 38 #include <boost/uuid/detail/config.hpp>
Chris@16 39 #ifndef BOOST_UUID_NO_TYPE_TRAITS
Chris@16 40 #include <boost/type_traits/is_pod.hpp>
Chris@16 41 #include <boost/type_traits/integral_constant.hpp>
Chris@16 42 #endif
Chris@16 43
Chris@101 44 #ifdef BOOST_HAS_PRAGMA_ONCE
Chris@101 45 #pragma once
Chris@101 46 #endif
Chris@101 47
Chris@16 48 #if defined(_MSC_VER)
Chris@16 49 #pragma warning(push) // Save warning settings.
Chris@16 50 #pragma warning(disable : 4996) // Disable deprecated std::swap_ranges, std::equal
Chris@16 51 #endif
Chris@16 52
Chris@16 53 #ifdef BOOST_NO_STDC_NAMESPACE
Chris@16 54 namespace std {
Chris@16 55 using ::size_t;
Chris@16 56 using ::ptrdiff_t;
Chris@16 57 } //namespace std
Chris@16 58 #endif //BOOST_NO_STDC_NAMESPACE
Chris@16 59
Chris@16 60 namespace boost {
Chris@16 61 namespace uuids {
Chris@16 62
Chris@16 63 struct uuid
Chris@16 64 {
Chris@16 65 public:
Chris@16 66 typedef uint8_t value_type;
Chris@16 67 typedef uint8_t& reference;
Chris@16 68 typedef uint8_t const& const_reference;
Chris@16 69 typedef uint8_t* iterator;
Chris@16 70 typedef uint8_t const* const_iterator;
Chris@16 71 typedef std::size_t size_type;
Chris@16 72 typedef std::ptrdiff_t difference_type;
Chris@16 73
Chris@16 74 // This does not work on some compilers
Chris@101 75 // They seem to want the variable definec in
Chris@16 76 // a cpp file
Chris@16 77 //BOOST_STATIC_CONSTANT(size_type, static_size = 16);
Chris@101 78 static BOOST_CONSTEXPR size_type static_size() BOOST_NOEXCEPT { return 16; }
Chris@16 79
Chris@16 80 public:
Chris@101 81 iterator begin() BOOST_NOEXCEPT { return data; }
Chris@101 82 const_iterator begin() const BOOST_NOEXCEPT { return data; }
Chris@101 83 iterator end() BOOST_NOEXCEPT { return data+size(); }
Chris@101 84 const_iterator end() const BOOST_NOEXCEPT { return data+size(); }
Chris@16 85
Chris@101 86 BOOST_CONSTEXPR size_type size() const BOOST_NOEXCEPT { return static_size(); }
Chris@16 87
Chris@101 88 bool is_nil() const BOOST_NOEXCEPT;
Chris@16 89
Chris@16 90 enum variant_type
Chris@16 91 {
Chris@16 92 variant_ncs, // NCS backward compatibility
Chris@16 93 variant_rfc_4122, // defined in RFC 4122 document
Chris@16 94 variant_microsoft, // Microsoft Corporation backward compatibility
Chris@16 95 variant_future // future definition
Chris@16 96 };
Chris@101 97 variant_type variant() const BOOST_NOEXCEPT
Chris@16 98 {
Chris@16 99 // variant is stored in octet 7
Chris@16 100 // which is index 8, since indexes count backwards
Chris@16 101 unsigned char octet7 = data[8]; // octet 7 is array index 8
Chris@16 102 if ( (octet7 & 0x80) == 0x00 ) { // 0b0xxxxxxx
Chris@16 103 return variant_ncs;
Chris@16 104 } else if ( (octet7 & 0xC0) == 0x80 ) { // 0b10xxxxxx
Chris@16 105 return variant_rfc_4122;
Chris@16 106 } else if ( (octet7 & 0xE0) == 0xC0 ) { // 0b110xxxxx
Chris@16 107 return variant_microsoft;
Chris@16 108 } else {
Chris@16 109 //assert( (octet7 & 0xE0) == 0xE0 ) // 0b111xxxx
Chris@16 110 return variant_future;
Chris@16 111 }
Chris@16 112 }
Chris@101 113
Chris@101 114 enum version_type
Chris@16 115 {
Chris@16 116 version_unknown = -1,
Chris@16 117 version_time_based = 1,
Chris@16 118 version_dce_security = 2,
Chris@16 119 version_name_based_md5 = 3,
Chris@16 120 version_random_number_based = 4,
Chris@16 121 version_name_based_sha1 = 5
Chris@16 122 };
Chris@101 123 version_type version() const BOOST_NOEXCEPT
Chris@16 124 {
Chris@101 125 // version is stored in octet 9
Chris@16 126 // which is index 6, since indexes count backwards
Chris@101 127 uint8_t octet9 = data[6];
Chris@16 128 if ( (octet9 & 0xF0) == 0x10 ) {
Chris@16 129 return version_time_based;
Chris@16 130 } else if ( (octet9 & 0xF0) == 0x20 ) {
Chris@16 131 return version_dce_security;
Chris@16 132 } else if ( (octet9 & 0xF0) == 0x30 ) {
Chris@16 133 return version_name_based_md5;
Chris@16 134 } else if ( (octet9 & 0xF0) == 0x40 ) {
Chris@16 135 return version_random_number_based;
Chris@16 136 } else if ( (octet9 & 0xF0) == 0x50 ) {
Chris@16 137 return version_name_based_sha1;
Chris@16 138 } else {
Chris@16 139 return version_unknown;
Chris@16 140 }
Chris@16 141 }
Chris@16 142
Chris@16 143 // note: linear complexity
Chris@101 144 void swap(uuid& rhs) BOOST_NOEXCEPT;
Chris@16 145
Chris@16 146 public:
Chris@16 147 // or should it be array<uint8_t, 16>
Chris@16 148 uint8_t data[16];
Chris@16 149 };
Chris@16 150
Chris@101 151 bool operator== (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT;
Chris@101 152 bool operator< (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT;
Chris@16 153
Chris@101 154 inline bool operator!=(uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
Chris@16 155 {
Chris@16 156 return !(lhs == rhs);
Chris@16 157 }
Chris@16 158
Chris@101 159 inline bool operator>(uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
Chris@16 160 {
Chris@16 161 return rhs < lhs;
Chris@16 162 }
Chris@101 163 inline bool operator<=(uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
Chris@16 164 {
Chris@16 165 return !(rhs < lhs);
Chris@16 166 }
Chris@16 167
Chris@101 168 inline bool operator>=(uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
Chris@16 169 {
Chris@16 170 return !(lhs < rhs);
Chris@16 171 }
Chris@16 172
Chris@101 173 inline void swap(uuid& lhs, uuid& rhs) BOOST_NOEXCEPT
Chris@16 174 {
Chris@16 175 lhs.swap(rhs);
Chris@16 176 }
Chris@16 177
Chris@16 178 // This is equivalent to boost::hash_range(u.begin(), u.end());
Chris@101 179 inline std::size_t hash_value(uuid const& u) BOOST_NOEXCEPT
Chris@16 180 {
Chris@16 181 std::size_t seed = 0;
Chris@101 182 for(uuid::const_iterator i=u.begin(), e=u.end(); i != e; ++i)
Chris@16 183 {
Chris@16 184 seed ^= static_cast<std::size_t>(*i) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Chris@16 185 }
Chris@16 186
Chris@16 187 return seed;
Chris@16 188 }
Chris@16 189
Chris@16 190 }} //namespace boost::uuids
Chris@16 191
Chris@16 192 #ifndef BOOST_UUID_NO_TYPE_TRAITS
Chris@16 193 // type traits specializations
Chris@16 194 namespace boost {
Chris@16 195
Chris@16 196 template <>
Chris@16 197 struct is_pod<uuids::uuid> : true_type {};
Chris@16 198
Chris@16 199 } // namespace boost
Chris@16 200 #endif
Chris@16 201
Chris@101 202 #if defined(BOOST_UUID_USE_SSE2)
Chris@101 203 #include <boost/uuid/detail/uuid_x86.hpp>
Chris@101 204 #else
Chris@101 205 #include <boost/uuid/detail/uuid_generic.hpp>
Chris@101 206 #endif
Chris@101 207
Chris@16 208 #if defined(_MSC_VER)
Chris@16 209 #pragma warning(pop) // Restore warnings to previous state.
Chris@16 210 #endif
Chris@16 211
Chris@16 212 #endif // BOOST_UUID_HPP