aboutsummaryrefslogtreecommitdiff
path: root/src/brussel.common/Uid.cpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2023-10-19 22:50:07 -0700
committerrtk0c <[email protected]>2025-08-16 11:31:16 -0700
commit297232d21594b138bb368a42b5b0d085ff9ed6aa (patch)
tree075d5407e1e12a9d35cbee6e4c20ad34e0765c42 /src/brussel.common/Uid.cpp
parentd5cd34ff69f7fd134d5450696f298af1a864afbc (diff)
The great renaming: switch to "module style"
Diffstat (limited to 'src/brussel.common/Uid.cpp')
-rw-r--r--src/brussel.common/Uid.cpp70
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;
+}