libultraship
Reimplementations of libultra (N64 SDK) functions for modern hardware
Loading...
Searching...
No Matches
ResourceIdentifier.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <functional>
5#include <memory>
6#include <string>
7#include <variant>
8
9namespace Ship {
10class Archive;
11
17
18 public:
19 ResourceIdentifier() = default;
20
21 ResourceIdentifier(std::string path, const uintptr_t owner = 0, const std::shared_ptr<Archive> parent = nullptr)
22 : mPath(std::move(path)), mOwner(owner), mParent(parent) {
23 }
24
25 ResourceIdentifier(uint64_t hash, const uintptr_t owner = 0, const std::shared_ptr<Archive> parent = nullptr)
26 : mPath(hash), mOwner(owner), mParent(parent) {
27 }
28
29 bool operator==(const ResourceIdentifier& rhs) const {
30 return mOwner == rhs.mOwner && mPath == rhs.mPath && mParent == rhs.mParent;
31 }
32
33 bool IsPath() const {
34 return std::holds_alternative<std::string>(mPath);
35 }
36
37 bool IsHash() const {
38 return std::holds_alternative<uint64_t>(mPath);
39 }
40
41 const std::string& GetPath() const {
42 static const std::string emptyPath = "";
43 return IsPath() ? std::get<std::string>(mPath) : emptyPath;
44 }
45
46 uint64_t GetPathHash() const {
47 return IsHash() ? std::get<uint64_t>(mPath) : 0;
48 }
49
50 const std::variant<std::string, uint64_t>& GetPathOrHash() const {
51 return mPath;
52 }
53
54 uintptr_t GetOwner() const {
55 return mOwner;
56 }
57
58 const std::shared_ptr<Archive>& GetParent() const {
59 return mParent;
60 }
61
62 void SetPath(const std::string& path) {
63 mPath = path;
64 }
65
66 void SetPath(std::string&& path) {
67 mPath = std::move(path);
68 }
69
70 void SetHash(uint64_t hash) {
71 mPath = hash;
72 }
73
74 void SetPathOrHash(std::variant<std::string, uint64_t> pathOrHash) {
75 mPath = std::move(pathOrHash);
76 }
77
78 void SetOwner(uintptr_t owner) {
79 mOwner = owner;
80 }
81
82 void SetParent(const std::shared_ptr<Archive>& parent) {
83 mParent = parent;
84 }
85
86 private:
87 static size_t HashCombine(size_t lhs, size_t rhs) {
88 lhs ^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2);
89 return lhs;
90 }
91
92 size_t GetHash() const {
93 return CalculateHash();
94 }
95
96 size_t CalculateHash() const {
97 size_t pathHash =
98 HashCombine(std::hash<size_t>{}(mPath.index()),
99 IsPath() ? std::hash<std::string>{}(GetPath()) : std::hash<uint64_t>{}(GetPathHash()));
100
101 size_t hash = HashCombine(pathHash, std::hash<std::uintptr_t>{}(mOwner));
102 hash = HashCombine(hash, std::hash<std::shared_ptr<Archive>>{}(mParent));
103 return hash;
104 }
105
106 std::variant<std::string, uint64_t> mPath = std::string();
107 uintptr_t mOwner = 0;
108 std::shared_ptr<Archive> mParent = nullptr;
109};
110
115 size_t operator()(const ResourceIdentifier& rcd) const {
116 return rcd.GetHash();
117 }
118};
119} // namespace Ship
Uniquely identifies a cached resource by path/hash, owner, and source archive.
Definition ResourceIdentifier.h:15
const std::string & GetPath() const
Definition ResourceIdentifier.h:41
void SetPath(std::string &&path)
Definition ResourceIdentifier.h:66
uintptr_t GetOwner() const
Definition ResourceIdentifier.h:54
ResourceIdentifier(uint64_t hash, const uintptr_t owner=0, const std::shared_ptr< Archive > parent=nullptr)
Definition ResourceIdentifier.h:25
bool operator==(const ResourceIdentifier &rhs) const
Definition ResourceIdentifier.h:29
bool IsHash() const
Definition ResourceIdentifier.h:37
void SetParent(const std::shared_ptr< Archive > &parent)
Definition ResourceIdentifier.h:82
void SetOwner(uintptr_t owner)
Definition ResourceIdentifier.h:78
bool IsPath() const
Definition ResourceIdentifier.h:33
ResourceIdentifier(std::string path, const uintptr_t owner=0, const std::shared_ptr< Archive > parent=nullptr)
Definition ResourceIdentifier.h:21
uint64_t GetPathHash() const
Definition ResourceIdentifier.h:46
const std::shared_ptr< Archive > & GetParent() const
Definition ResourceIdentifier.h:58
void SetHash(uint64_t hash)
Definition ResourceIdentifier.h:70
void SetPathOrHash(std::variant< std::string, uint64_t > pathOrHash)
Definition ResourceIdentifier.h:74
void SetPath(const std::string &path)
Definition ResourceIdentifier.h:62
const std::variant< std::string, uint64_t > & GetPathOrHash() const
Definition ResourceIdentifier.h:50
Core namespace for the libultraship engine framework.
Definition gfx_direct3d_common.h:14
std::hash specialization for ResourceIdentifier, used by unordered containers.
Definition ResourceIdentifier.h:114
size_t operator()(const ResourceIdentifier &rcd) const
Definition ResourceIdentifier.h:115