diff --git a/include/uuid.h b/include/uuid.h index d17713a..0515d47 100644 --- a/include/uuid.h +++ b/include/uuid.h @@ -270,6 +270,18 @@ namespace uuids size_t m_blockByteIndex; size_t m_byteCount; }; + + template + constexpr CharT empty_guid[] = "00000000-0000-0000-0000-000000000000"; + + template <> + constexpr wchar_t empty_guid[] = L"00000000-0000-0000-0000-000000000000"; + + template + constexpr CharT guid_encoder[] = "0123456789abcdef"; + + template <> + constexpr wchar_t guid_encoder[] = L"0123456789abcdef"; } // -------------------------------------------------------------------------------------------------------------------------- @@ -511,6 +523,9 @@ namespace uuids template friend std::basic_ostream & operator<<(std::basic_ostream &s, uuid const & id); + + template + friend std::basic_string to_string(uuid const& id); }; // -------------------------------------------------------------------------------------------------------------------------- @@ -572,9 +587,20 @@ namespace uuids class Allocator = std::allocator> inline std::basic_string to_string(uuid const & id) { - std::basic_stringstream sstr; - sstr << id; - return sstr.str(); + std::basic_string uustr{detail::empty_guid}; + + for (size_t i = 0, index = 0; i < 36; ++i) + { + if (i == 8 || i == 13 || i == 18 || i == 23) + { + continue; + } + uustr[i] = detail::guid_encoder[id.data[index] >> 4 & 0x0f]; + uustr[++i] = detail::guid_encoder[id.data[index] & 0x0f]; + index++; + } + + return uustr; } inline void swap(uuids::uuid & lhs, uuids::uuid & rhs) noexcept