Sound Bakery  v0.1.0
Open-source audio middleware for games
Loading...
Searching...
No Matches
database.h
1#pragma once
2
3#include "sound_bakery/core/database/database_object.h"
4
5namespace SB::Core
6{
10 class SB_CLASS Database
11 {
12 public:
13 void addOrUpdateID(SB_ID oldID, SB_ID newID, DatabaseObject* object)
14 {
15 assert(object != nullptr && "Object was nullptr");
16
17 if (newID == SB_INVALID_ID)
18 {
19 newID = createNewID();
20 object->m_objectID = newID; // privately set the ID without recursion
21 }
22
23 assert(newID != 0 && "New ID cannot be 0!");
24
25 if (auto iter = m_idToPointerMap.find(oldID); iter != m_idToPointerMap.end())
26 {
27 assert(iter->second.get() == object && "Provided object does not match the one in the database");
28
29 m_idToPointerMap.erase(iter);
30 }
31
32 m_idToPointerMap[newID].reset(object);
33 }
34
35 void addOrUpdateName(std::string_view oldName, std::string_view newName, DatabaseObject* object)
36 {
37 assert(object != nullptr && "Object was nullptr");
38
39 if (!oldName.empty())
40 {
41 if (auto iter = m_nameToIdMap.find(oldName.data()); iter != m_nameToIdMap.end())
42 {
43 m_nameToIdMap.erase(iter);
44 }
45 }
46
47 if (!newName.empty())
48 {
49 m_nameToIdMap.emplace(newName, object->getDatabaseID());
50 }
51 }
52
53 void remove(SB_ID id)
54 {
55 if (id)
56 {
57 if (m_idToPointerMap.contains(id))
58 {
59 m_idToPointerMap.erase(id);
60 }
61 }
62 }
63
64 void remove(DatabaseObject* object)
65 {
66 assert(object != nullptr && "Object was nullptr");
67
68 if (object)
69 {
70 m_nameToIdMap.erase(object->getDatabaseName().data());
71 m_idToPointerMap.erase(object->getDatabaseID());
72 }
73 }
74
79 std::shared_ptr<DatabaseObject> removeUnsafe(DatabaseObject* object)
80 {
81 assert(object != nullptr);
82
83 std::shared_ptr<DatabaseObject> result;
84
85 m_nameToIdMap.erase(object->getDatabaseName().data());
86 m_idToPointerMap[object->getDatabaseID()].swap(result);
87 m_idToPointerMap.erase(object->getDatabaseID());
88
89 return result;
90 }
91
92 DatabaseObject* tryFind(SB_ID id) const
93 {
94 DatabaseObject* result = nullptr;
95
96 if (auto iter = m_idToPointerMap.find(id); iter != m_idToPointerMap.end())
97 {
98 result = iter->second.get();
99 }
100
101 return result;
102 }
103
104 DatabaseObject* tryFind(std::string_view name) const
105 {
106 DatabaseObject* result = nullptr;
107
108 if (auto iter = m_nameToIdMap.find(name.data()); iter != m_nameToIdMap.end())
109 {
110 result = tryFind(iter->second);
111 }
112
113 return result;
114 }
115
116 std::weak_ptr<DatabaseObject> tryFindWeak(SB_ID id) const
117 {
118 std::weak_ptr<DatabaseObject> result;
119
120 if (auto iter = m_idToPointerMap.find(id); iter != m_idToPointerMap.end())
121 {
122 result = iter->second;
123 }
124
125 return result;
126 }
127
128 std::weak_ptr<DatabaseObject> tryFindWeak(std::string_view name) const
129 {
130 std::weak_ptr<DatabaseObject> result;
131
132 if (auto iter = m_nameToIdMap.find(name.data()); iter != m_nameToIdMap.end())
133 {
134 result = tryFindWeak(iter->second);
135 }
136
137 return result;
138 }
139
140 std::vector<std::weak_ptr<DatabaseObject>> getAll() const
141 {
142 std::vector<std::weak_ptr<DatabaseObject>> result;
143 result.reserve(m_idToPointerMap.size());
144
145 for (auto& i : m_idToPointerMap)
146 {
147 result.push_back(i.second);
148 }
149
150 return result;
151 }
152
153 void clear() noexcept
154 {
155 m_idToPointerMap.clear();
156 m_nameToIdMap.clear();
157 }
158
159 private:
160 static SB_ID createNewID();
161
162 private:
163 std::unordered_map<SB_ID, std::shared_ptr<DatabaseObject>> m_idToPointerMap;
164 std::unordered_map<std::string, SB_ID> m_nameToIdMap;
165 };
166} // namespace SB::Core
Base object type for any object that can exist in the editor/database. Holds an ID and name.
Definition database_object.h:22
Runtime lookup of objects, using their ID or name.
Definition database.h:11
std::shared_ptr< DatabaseObject > removeUnsafe(DatabaseObject *object)
Removes the entry and gives ownership to the caller.
Definition database.h:79