fast to_string() implementation
This commit is contained in:
parent
c6ad65304b
commit
8e9d0f87f5
@ -270,6 +270,18 @@ namespace uuids
|
|||||||
size_t m_blockByteIndex;
|
size_t m_blockByteIndex;
|
||||||
size_t m_byteCount;
|
size_t m_byteCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename CharT>
|
||||||
|
constexpr CharT empty_guid[] = "00000000-0000-0000-0000-000000000000";
|
||||||
|
|
||||||
|
template <>
|
||||||
|
constexpr wchar_t empty_guid<wchar_t>[] = L"00000000-0000-0000-0000-000000000000";
|
||||||
|
|
||||||
|
template <typename CharT>
|
||||||
|
constexpr CharT guid_encoder[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
template <>
|
||||||
|
constexpr wchar_t guid_encoder<wchar_t>[] = L"0123456789abcdef";
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -511,6 +523,9 @@ namespace uuids
|
|||||||
|
|
||||||
template <class Elem, class Traits>
|
template <class Elem, class Traits>
|
||||||
friend std::basic_ostream<Elem, Traits> & operator<<(std::basic_ostream<Elem, Traits> &s, uuid const & id);
|
friend std::basic_ostream<Elem, Traits> & operator<<(std::basic_ostream<Elem, Traits> &s, uuid const & id);
|
||||||
|
|
||||||
|
template<class CharT, class Traits, class Allocator>
|
||||||
|
friend std::basic_string<CharT, Traits, Allocator> to_string(uuid const& id);
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -572,9 +587,20 @@ namespace uuids
|
|||||||
class Allocator = std::allocator<CharT>>
|
class Allocator = std::allocator<CharT>>
|
||||||
inline std::basic_string<CharT, Traits, Allocator> to_string(uuid const & id)
|
inline std::basic_string<CharT, Traits, Allocator> to_string(uuid const & id)
|
||||||
{
|
{
|
||||||
std::basic_stringstream<CharT, Traits, Allocator> sstr;
|
std::basic_string<CharT, Traits, Allocator> uustr{detail::empty_guid<CharT>};
|
||||||
sstr << id;
|
|
||||||
return sstr.str();
|
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<CharT>[id.data[index] >> 4 & 0x0f];
|
||||||
|
uustr[++i] = detail::guid_encoder<CharT>[id.data[index] & 0x0f];
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return uustr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void swap(uuids::uuid & lhs, uuids::uuid & rhs) noexcept
|
inline void swap(uuids::uuid & lhs, uuids::uuid & rhs) noexcept
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user