diff options
author | rtk0c <[email protected]> | 2023-10-19 22:50:07 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2025-08-16 11:31:16 -0700 |
commit | 297232d21594b138bb368a42b5b0d085ff9ed6aa (patch) | |
tree | 075d5407e1e12a9d35cbee6e4c20ad34e0765c42 /src/brussel.common/Uid.cpp | |
parent | d5cd34ff69f7fd134d5450696f298af1a864afbc (diff) |
The great renaming: switch to "module style"
Diffstat (limited to 'src/brussel.common/Uid.cpp')
-rw-r--r-- | src/brussel.common/Uid.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/brussel.common/Uid.cpp b/src/brussel.common/Uid.cpp new file mode 100644 index 0000000..58dfffd --- /dev/null +++ b/src/brussel.common/Uid.cpp @@ -0,0 +1,70 @@ +#include "Uid.hpp" + +#include "RapidJsonHelper.hpp" + +#include <rapidjson/document.h> +#include <cstring> +#include <random> + +Uid Uid::Create() { + std::random_device rd; + std::mt19937_64 gen(rd()); + std::uniform_int_distribution<uint64_t> dist( + std::numeric_limits<uint64_t>::min(), + std::numeric_limits<uint64_t>::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; +} |