mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
apply review suggestions
This commit is contained in:
parent
29451cc8f2
commit
c3a38e7f8c
@ -1,4 +1,5 @@
|
||||
#include <Core/Defines.h>
|
||||
#include <Common/hex.h>
|
||||
#include <Common/PODArray.h>
|
||||
#include <Common/StringUtils/StringUtils.h>
|
||||
#include <Common/memcpySmall.h>
|
||||
@ -27,6 +28,59 @@ namespace ErrorCodes
|
||||
extern const int INCORRECT_DATA;
|
||||
}
|
||||
|
||||
template <typename IteratorSrc, typename IteratorDst>
|
||||
void parseHex(IteratorSrc src, IteratorDst dst, const size_t num_bytes)
|
||||
{
|
||||
size_t src_pos = 0;
|
||||
size_t dst_pos = 0;
|
||||
for (; dst_pos < num_bytes; ++dst_pos, src_pos += 2)
|
||||
dst[dst_pos] = unhex2(reinterpret_cast<const char *>(&src[src_pos]));
|
||||
}
|
||||
|
||||
void parseUUID(const UInt8 * src36, UInt8 * dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
|
||||
parseHex(&src36[0], &dst16[0], 4);
|
||||
parseHex(&src36[9], &dst16[4], 2);
|
||||
parseHex(&src36[14], &dst16[6], 2);
|
||||
parseHex(&src36[19], &dst16[8], 2);
|
||||
parseHex(&src36[24], &dst16[10], 6);
|
||||
}
|
||||
|
||||
void parseUUIDWithoutSeparator(const UInt8 * src36, UInt8 * dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
|
||||
parseHex(&src36[0], &dst16[0], 16);
|
||||
}
|
||||
|
||||
/** Function used when byte ordering is important when parsing uuid
|
||||
* ex: When we create an UUID type
|
||||
*/
|
||||
void parseUUID(const UInt8 * src36, std::reverse_iterator<UInt8 *> dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
|
||||
/// FIXME This code looks like trash.
|
||||
parseHex(&src36[0], dst16 + 8, 4);
|
||||
parseHex(&src36[9], dst16 + 12, 2);
|
||||
parseHex(&src36[14], dst16 + 14, 2);
|
||||
parseHex(&src36[19], dst16, 2);
|
||||
parseHex(&src36[24], dst16 + 2, 6);
|
||||
}
|
||||
|
||||
/** Function used when byte ordering is important when parsing uuid
|
||||
* ex: When we create an UUID type
|
||||
*/
|
||||
void parseUUIDWithoutSeparator(const UInt8 * src36, std::reverse_iterator<UInt8 *> dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
|
||||
parseHex(&src36[0], dst16 + 8, 8);
|
||||
parseHex(&src36[16], dst16, 8);
|
||||
}
|
||||
|
||||
UInt128 stringToUUID(const String & str)
|
||||
{
|
||||
return parseFromString<UUID>(str);
|
||||
|
@ -35,7 +35,6 @@
|
||||
#include <DataTypes/DataTypeDateTime.h>
|
||||
|
||||
#include <double-conversion/double-conversion.h>
|
||||
#include <Common/hex.h>
|
||||
|
||||
|
||||
/// 1 GiB
|
||||
@ -488,66 +487,10 @@ struct NullSink
|
||||
void push_back(char) {}
|
||||
};
|
||||
|
||||
template <typename IteratorSrc, typename IteratorDst>
|
||||
void parseHex(IteratorSrc src, IteratorDst dst, const size_t num_bytes)
|
||||
{
|
||||
size_t src_pos = 0;
|
||||
size_t dst_pos = 0;
|
||||
for (; dst_pos < num_bytes; ++dst_pos)
|
||||
{
|
||||
dst[dst_pos] = UInt8(unhex(src[src_pos])) * 16 + UInt8(unhex(src[src_pos + 1]));
|
||||
src_pos += 2;
|
||||
}
|
||||
}
|
||||
|
||||
template <bool with_separator>
|
||||
void parseUUID(const UInt8 * src36, UInt8 * dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
if constexpr (with_separator)
|
||||
{
|
||||
parseHex(&src36[0], &dst16[0], 4);
|
||||
parseHex(&src36[9], &dst16[4], 2);
|
||||
parseHex(&src36[14], &dst16[6], 2);
|
||||
parseHex(&src36[19], &dst16[8], 2);
|
||||
parseHex(&src36[24], &dst16[10], 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
parseHex(&src36[0], &dst16[0], 4);
|
||||
parseHex(&src36[8], &dst16[4], 2);
|
||||
parseHex(&src36[12], &dst16[6], 2);
|
||||
parseHex(&src36[16], &dst16[8], 2);
|
||||
parseHex(&src36[20], &dst16[10], 6);
|
||||
}
|
||||
}
|
||||
|
||||
/** Function used when byte ordering is important when parsing uuid
|
||||
* ex: When we create an UUID type
|
||||
*/
|
||||
template <bool with_separator>
|
||||
void parseUUID(const UInt8 * src36, std::reverse_iterator<UInt8 *> dst16)
|
||||
{
|
||||
/// If string is not like UUID - implementation specific behaviour.
|
||||
|
||||
/// FIXME This code looks like trash.
|
||||
if constexpr (with_separator)
|
||||
{
|
||||
parseHex(&src36[0], dst16 + 8, 4);
|
||||
parseHex(&src36[9], dst16 + 12, 2);
|
||||
parseHex(&src36[14], dst16 + 14, 2);
|
||||
parseHex(&src36[19], dst16, 2);
|
||||
parseHex(&src36[24], dst16 + 2, 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
parseHex(&src36[0], dst16 + 8, 4);
|
||||
parseHex(&src36[8], dst16 + 12, 2);
|
||||
parseHex(&src36[12], dst16 + 14, 2);
|
||||
parseHex(&src36[16], dst16, 2);
|
||||
parseHex(&src36[20], dst16 + 2, 6);
|
||||
}
|
||||
}
|
||||
void parseUUID(const UInt8 * src36, UInt8 * dst16);
|
||||
void parseUUIDWithoutSeparator(const UInt8 * src36, UInt8 * dst16);
|
||||
void parseUUID(const UInt8 * src36, std::reverse_iterator<UInt8 *> dst16);
|
||||
void parseUUIDWithoutSeparator(const UInt8 * src36, std::reverse_iterator<UInt8 *> dst16);
|
||||
|
||||
template <typename IteratorSrc, typename IteratorDst>
|
||||
void formatHex(IteratorSrc src, IteratorDst dst, const size_t num_bytes);
|
||||
@ -648,10 +591,10 @@ inline void readUUIDText(UUID & uuid, ReadBuffer & buf)
|
||||
throw Exception(std::string("Cannot parse uuid ") + s, ErrorCodes::CANNOT_PARSE_UUID);
|
||||
}
|
||||
|
||||
parseUUID<true>(reinterpret_cast<const UInt8 *>(s), std::reverse_iterator<UInt8 *>(reinterpret_cast<UInt8 *>(&uuid) + 16));
|
||||
parseUUID(reinterpret_cast<const UInt8 *>(s), std::reverse_iterator<UInt8 *>(reinterpret_cast<UInt8 *>(&uuid) + 16));
|
||||
}
|
||||
else
|
||||
parseUUID<false>(reinterpret_cast<const UInt8 *>(s), std::reverse_iterator<UInt8 *>(reinterpret_cast<UInt8 *>(&uuid) + 16));
|
||||
parseUUIDWithoutSeparator(reinterpret_cast<const UInt8 *>(s), std::reverse_iterator<UInt8 *>(reinterpret_cast<UInt8 *>(&uuid) + 16));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user