aboutsummaryrefslogtreecommitdiff
path: root/source/Uid.cpp
blob: 2520d1e4168a02de73ddd02080a205f46eddf2e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "Uid.hpp"

#include "RapidJsonHelper.hpp"

#include <rapidjson/document.h>
#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::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;
}