Phasor 3.3.0
Stack VM based Programming Language
Loading...
Searching...
No Matches
handle.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <unordered_map>
4#include <cstdint>
6namespace HandleSystem
7{
8using HandleId = uint32_t;
9
11{
12 static HandleId id = 1;
13 return id;
14}
15
16template <typename T> struct Table
17{
18 static std::unordered_map<HandleId, T> &idToHandle()
19 {
20 static std::unordered_map<HandleId, T> map;
21 return map;
22 }
23
24 static std::unordered_map<T, HandleId> &handleToId()
25 {
26 static std::unordered_map<T, HandleId> map;
27 return map;
28 }
29};
30
31template <typename T> inline HandleId store(T handle)
32{
33 if (!handle)
34 {
35 return 0;
36 }
37
38 auto &h2i = Table<T>::handleToId();
39 auto &i2h = Table<T>::idToHandle();
40
41 auto it = h2i.find(handle);
42 if (it != h2i.end())
43 {
44 return it->second;
45 }
46
47 HandleId id = nextId()++;
48 h2i[handle] = id;
49 i2h[id] = handle;
50 return id;
51}
52
53template <typename T> inline T resolve(HandleId id)
54{
55 if (id == 0)
56 {
57 return T{};
58 }
59
60 auto &i2h = Table<T>::idToHandle();
61 auto it = i2h.find(id);
62 if (it == i2h.end())
63 {
64 return T{};
65 }
66
67 return it->second;
68}
69
70template <typename T> inline void remove(HandleId id)
71{
72 auto &i2h = Table<T>::idToHandle();
73 auto &h2i = Table<T>::handleToId();
74
75 auto it = i2h.find(id);
76 if (it == i2h.end())
77 {
78 return;
79 }
80
81 h2i.erase(it->second);
82 i2h.erase(it);
83}
84} // namespace HandleSystem
Handle system for managed win32 resources.
Definition handle.hpp:7
HandleId store(T handle)
Definition handle.hpp:31
T resolve(HandleId id)
Definition handle.hpp:53
void remove(HandleId id)
Definition handle.hpp:70
uint32_t HandleId
Definition handle.hpp:8
HandleId & nextId()
Definition handle.hpp:10
static std::unordered_map< HandleId, T > & idToHandle()
Definition handle.hpp:18
static std::unordered_map< T, HandleId > & handleToId()
Definition handle.hpp:24