ultimatepp/uppsrc/Core/Uuid.cpp
cxl ef006549b1 Core: Uuid optimized
git-svn-id: svn://ultimatepp.org/upp/trunk@13396 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2019-06-15 15:32:35 +00:00

109 lines
1.9 KiB
C++

#include "Core.h"
namespace Upp {
//#BLITZ_APPROVE
INITBLOCK {
Value::Register<Uuid>("Uuid");
}
void Uuid::Serialize(Stream& s) {
int version = 0;
s / version % v[0] % v[1];
}
void Uuid::Jsonize(JsonIO& jio)
{
String h;
if(jio.IsStoring()) {
h = Format(*this);
jio.Set(h);
}
else
*this = ScanUuid((String)jio.Get());
}
void Uuid::New()
{
do
Random64(v, 2);
while(IsNullInstance());
}
String Format(const Uuid& id) {
return Sprintf("%08X%08X%08X%08X", LODWORD(id.v[0]), HIDWORD(id.v[0]), LODWORD(id.v[1]), HIDWORD(id.v[1]));
}
String FormatWithDashes(const Uuid& id) {
return Sprintf("%08X-%04X-%04X-%04X-%04X%08X", LODWORD(id.v[0]),
HIWORD(HIDWORD(id.v[0])), LOWORD(HIDWORD(id.v[0])),
HIWORD(LODWORD(id.v[1])), LOWORD(LODWORD(id.v[1])),
HIDWORD(id.v[1]));
}
dword scanX(const char *s)
{
dword r = 0;
for(int i = 0; i < 8; i++) {
r = (r << 4) | (*s >= '0' && *s <= '9' ? *s - '0' :
*s >= 'A' && *s <= 'F' ? 10 + *s - 'A' :
*s >= 'a' && *s <= 'f' ? 10 + *s - 'a' : 0);
s++;
}
return r;
}
Uuid ScanUuid(const char *s)
{
Uuid id;
String xu;
while(*s) {
if(IsXDigit(*s))
xu.Cat(*s);
s++;
}
if(xu.GetCount() < 32)
return Null;
id.v[0] = MAKEQWORD(scanX(~xu), scanX(~xu + 8));
id.v[1] = MAKEQWORD(scanX(~xu + 16), scanX(~xu + 24));
return id;
}
void Uuid::Xmlize(XmlIO& xio)
{
String h;
if(xio.IsStoring())
h = Format(*this);
xio.Attr("value", h);
if(xio.IsLoading())
*this = ScanUuid(h);
}
String Uuid::ToString() const
{
return Format(*this);
}
String Uuid::ToStringWithDashes() const
{
return FormatWithDashes(*this);
}
String Dump(const Uuid& id) {
return "UUID: " + Format(id);
}
struct UuidValueGenClass : ValueGen
{
virtual Value Get() {
return Format(Uuid::Create());
}
};
ValueGen& UuidValueGen()
{
return Single<UuidValueGenClass>();
}
}