aboutsummaryrefslogtreecommitdiff
path: root/source/Common/Uid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Common/Uid.cpp')
-rw-r--r--source/Common/Uid.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/source/Common/Uid.cpp b/source/Common/Uid.cpp
new file mode 100644
index 0000000..1930cd8
--- /dev/null
+++ b/source/Common/Uid.cpp
@@ -0,0 +1,58 @@
+#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) {
+ assert(value.IsArray());
+ 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();
+}
+
+void Uid::WriteInto(rapidjson::Value& value, rapidjson::Document& root) {
+ value.Reserve(2, root.GetAllocator());
+ value.PushBack((uint64_t)upper, root.GetAllocator());
+ value.PushBack((uint64_t)lower, root.GetAllocator());
+}
+
+rapidjson::Value Uid::Write(rapidjson::Document& root) {
+ rapidjson::Value result(rapidjson::kArrayType);
+ WriteInto(result, root);
+ return result;
+}