Cogs.Core
ResourceMap.h
1#pragma once
2
3#include "ResourcePolicies.h"
4
5namespace Cogs
6{
7 template<typename HandleType, typename ResourceType, typename StoragePolicy, typename LockingPolicy, typename VerificationPolicy>
9 {
10 public:
11 StoragePolicy resources;
12 LockingPolicy m;
13 using Lock = std::lock_guard<LockingPolicy>;
14
16 ResourceMapBase() = default;
17
19 ResourceMapBase(size_t capacity, size_t pageSize, Memory::Allocator * allocator) : resources(capacity, pageSize, allocator) {}
20
22 {
23 Lock lock(m);
24
25 resources.clear(true);
26 }
27
35 HandleType addResource(const ResourceType& resource, bool persistent = false)
36 {
37 Lock lock(m);
38
39 return resources.allocate(resource, persistent);
40 }
41
49 HandleType addResource(ResourceType&& resource, bool persistent = false)
50 {
51 Lock lock(m);
52
53 return resources.allocate(std::move(resource), persistent);
54 }
55
61 void removeResource(HandleType handle)
62 {
63 Lock lock(m);
64
65 VerificationPolicy::verify(handle, resources);
66
67 resources.deallocate(handle);
68 }
69
76 bool hasResource(HandleType handle)
77 {
78 Lock lock(m);
79
80 return resources.hasResource(handle);
81 }
82
88 size_t size() const
89 {
90 return this->resources.size();
91 }
92
94 typename StoragePolicy::iterator begin() { return resources.begin(); }
95
97 typename StoragePolicy::iterator end() { return resources.end(); }
98
102 void clear()
103 {
104 Lock lock(m);
105
106 resources.clear();
107 }
108
115 const ResourceType & operator[](const HandleType handle) const
116 {
117 if (StoragePolicy::SafeDereference()) {
118 VerificationPolicy::verify(handle, resources);
119
120 return resources[handle];
121 } else {
122 std::lock_guard<LockingPolicy> lock(m);
123
124 VerificationPolicy::verify(handle, resources);
125
126 return resources[handle];
127 }
128 }
129
136 ResourceType & operator[](const HandleType handle)
137 {
138 if (StoragePolicy::SafeDereference()) {
139 VerificationPolicy::verify(handle, resources);
140
141 return resources[handle];
142 } else {
143 std::lock_guard<LockingPolicy> lock(m);
144
145 VerificationPolicy::verify(handle, resources);
146
147 return resources[handle];
148 }
149 }
150
158 HandleType getHandle(const ResourceType & r) { return resources.getHandle(r); }
159
165 void pin(const HandleType handle)
166 {
167 VerificationPolicy::verify(handle, resources);
168
169 resources.pin(handle);
170 }
171
173 bool pinned(const HandleType & handle) const { return resources.pinned(handle); }
174 };
175
179 template<class HandleType, class ResourceType>
181
182 template<typename HandleType, typename ResourceType>
184}
Base allocator implementation.
Definition: Allocator.h:30
HandleType getHandle(const ResourceType &r)
Gets a handle to the resource given.
Definition: ResourceMap.h:158
StoragePolicy::iterator end()
Gets an iterator to the end of the resource map.
Definition: ResourceMap.h:97
ResourceType & operator[](const HandleType handle)
Get a reference to the resource with the given handle.
Definition: ResourceMap.h:136
size_t size() const
Get the number or resources in the resource map.
Definition: ResourceMap.h:88
void clear()
Clear out the resources in the map.
Definition: ResourceMap.h:102
ResourceMapBase(size_t capacity, size_t pageSize, Memory::Allocator *allocator)
Initialize the resource map with the given allocator.
Definition: ResourceMap.h:19
ResourceMapBase()=default
Initialize a new, empty resource map.
StoragePolicy::iterator begin()
Gets an iterator to the beginning of the resource map.
Definition: ResourceMap.h:94
void removeResource(HandleType handle)
Remove the resource with the given handle.
Definition: ResourceMap.h:61
bool hasResource(HandleType handle)
Check if the resource with the given handle exists in the map.
Definition: ResourceMap.h:76
void pin(const HandleType handle)
Pin the resource with the given handle, preventing it from being cleared from the resource map automa...
Definition: ResourceMap.h:165
const ResourceType & operator[](const HandleType handle) const
Get a const reference to the resource with the given handle.
Definition: ResourceMap.h:115
HandleType addResource(const ResourceType &resource, bool persistent=false)
Add a new resource to the map.
Definition: ResourceMap.h:35
bool pinned(const HandleType &handle) const
Gets if the given resource handle is pinned.
Definition: ResourceMap.h:173
HandleType addResource(ResourceType &&resource, bool persistent=false)
Add a new resource to the map.
Definition: ResourceMap.h:49
Contains all Cogs related functionality.
Definition: FieldSetter.h:23