summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-12-18 09:07:25 -0500
committerGravatar Zach Hilman2019-04-25 08:07:57 -0400
commitca5638a1426ce560f3896b3ff0d3efd02b654585 (patch)
tree45ad83b82fd843aa08371365410e7b1780b58c5f /src/common
parentMerge pull request #2416 from lioncash/wait (diff)
downloadyuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.tar.gz
yuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.tar.xz
yuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.zip
common: Extract UUID to its own class
Since the Mii database uses UUIDs very similar to the Accounts database, it makes no sense to not share code between them.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/CMakeLists.txt2
-rw-r--r--src/common/uuid.cpp33
-rw-r--r--src/common/uuid.h45
3 files changed, 80 insertions, 0 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 1e8e1b215..cb514a0d2 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -123,6 +123,8 @@ add_library(common STATIC
123 timer.h 123 timer.h
124 uint128.cpp 124 uint128.cpp
125 uint128.h 125 uint128.h
126 uuid.cpp
127 uuid.h
126 vector_math.h 128 vector_math.h
127 web_result.h 129 web_result.h
128 zstd_compression.cpp 130 zstd_compression.cpp
diff --git a/src/common/uuid.cpp b/src/common/uuid.cpp
new file mode 100644
index 000000000..8e63b58b8
--- /dev/null
+++ b/src/common/uuid.cpp
@@ -0,0 +1,33 @@
1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <random>
6
7#include <fmt/format.h>
8
9#include "common/uuid.h"
10
11namespace Common {
12
13UUID UUID::Generate() {
14 std::random_device device;
15 std::mt19937 gen(device());
16 std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max());
17 return UUID{distribution(gen), distribution(gen)};
18}
19
20std::string UUID::Format() const {
21 return fmt::format("0x{:016X}{:016X}", uuid[1], uuid[0]);
22}
23
24std::string UUID::FormatSwitch() const {
25 std::array<u8, 16> s{};
26 std::memcpy(s.data(), uuid.data(), sizeof(u128));
27 return fmt::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{"
28 ":02x}{:02x}{:02x}{:02x}{:02x}",
29 s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10], s[11],
30 s[12], s[13], s[14], s[15]);
31}
32
33} // namespace Common
diff --git a/src/common/uuid.h b/src/common/uuid.h
new file mode 100644
index 000000000..4a5e5fa7c
--- /dev/null
+++ b/src/common/uuid.h
@@ -0,0 +1,45 @@
1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include "common/common_types.h"
8
9namespace Common {
10
11constexpr u128 INVALID_UUID{{0, 0}};
12
13struct UUID {
14 // UUIDs which are 0 are considered invalid!
15 u128 uuid = INVALID_UUID;
16 constexpr UUID() = default;
17 constexpr explicit UUID(const u128& id) : uuid{id} {}
18 constexpr explicit UUID(const u64 lo, const u64 hi) : uuid{{lo, hi}} {}
19
20 explicit operator bool() const {
21 return uuid != INVALID_UUID;
22 }
23
24 bool operator==(const UUID& rhs) const {
25 return uuid == rhs.uuid;
26 }
27
28 bool operator!=(const UUID& rhs) const {
29 return !operator==(rhs);
30 }
31
32 // TODO(ogniK): Properly generate uuids based on RFC-4122
33 static UUID Generate();
34
35 // Set the UUID to {0,0} to be considered an invalid user
36 void Invalidate() {
37 uuid = INVALID_UUID;
38 }
39
40 std::string Format() const;
41 std::string FormatSwitch() const;
42};
43static_assert(sizeof(UUID) == 16, "UUID is an invalid size!");
44
45} // namespace Common