#include "Uid.hpp" #include "RapidJsonHelper.hpp" #include #include #include Uid Uid::Create() { std::random_device rd; std::mt19937_64 gen(rd()); std::uniform_int_distribution dist( std::numeric_limits::min(), std::numeric_limits::max()); Uid uid; uid.upper = dist(gen); uid.lower = dist(gen); return uid; } bool Uid::IsNull() const { return upper == 0 && lower == 0; } void Uid::ReadString(std::string_view str) { sscanf(str.data(), BRUSSEL_Uid_SCAN_STR, &upper, &lower); } std::string Uid::WriteString() { char buf[256]; snprintf(buf, sizeof(buf), BRUSSEL_Uid_FORMAT_STR, upper, lower); return std::string(buf); } void Uid::Read(const rapidjson::Value& value) { if (value.IsString()) { ReadString(rapidjson::AsStringView(value)); } else if (value.IsArray()) { // Compatibility support assert(value.Size() == 2); auto& upper = value[0]; assert(upper.IsUint64()); auto& lower = value[1]; assert(lower.IsUint64()); this->upper = upper.GetUint64(); this->lower = lower.GetUint64(); } else { assert(false); } } void Uid::WriteInto(rapidjson::Value& value, rapidjson::Document& root) const { #if BRUSSEL_Uid_WRITE_USE_ARRAY value.Reserve(2, root.GetAllocator()); value.PushBack((uint64_t)upper, root.GetAllocator()); value.PushBack((uint64_t)lower, root.GetAllocator()); #else char buf[256]; int len = snprintf(buf, sizeof(buf), BRUSSEL_Uid_FORMAT_STR, upper, lower); value.SetString(buf, len, root.GetAllocator()); #endif } rapidjson::Value Uid::Write(rapidjson::Document& root) const { rapidjson::Value result(rapidjson::kArrayType); WriteInto(result, root); return result; }