10 #ifndef TurtleBrains_ResourceCache_hpp
11 #define TurtleBrains_ResourceCache_hpp
13 #include <turtle_brains/core/tb_noncopyable.hpp>
14 #include <turtle_brains/core/tb_string.hpp>
15 #include <turtle_brains/core/tb_types.hpp>
16 #include <turtle_brains/core/tb_defines.hpp>
20 #include <unordered_map>
105 ResourceType
GetResource(
const HandleType& handle)
const;
114 void SetResource(
const HandleType& handle,
const ResourceType& resource);
172 size_t ForEachValidResource(std::function<
void(ResourceType&, HandleType)> callbackFunction)
175 size_t validResourceCount = 0;
176 for (
auto& resourcePair : mResources)
178 if (resourcePair.first > 0)
180 callbackFunction(resourcePair.second, currentIndex);
181 ++validResourceCount;
186 return validResourceCount;
190 std::unordered_map<String, HandleType> mResourceCache;
191 std::vector<std::pair<int, ResourceType>> mResources;
202 template<
typename ResourceType,
typename HandleType> HandleType
210 template<
typename ResourceType,
typename HandleType> HandleType
214 const auto& resourceIterator = mResourceCache.find(resourceName);
215 if (resourceIterator == mResourceCache.end())
218 for (; searchedHandle < mResources.size(); ++searchedHandle)
220 if (0 == mResources[searchedHandle].first)
222 mResources[searchedHandle].first = 1;
223 mResources[searchedHandle].second = resource;
228 if (searchedHandle == mResources.size())
230 mResources.emplace_back(1, resource);
233 if (
false == resourceName.empty())
235 tb_error_if(mResourceCache.end() != mResourceCache.find(resourceName),
"tbInternalError: Resource name already found in cache!");
237 mResourceCache.emplace(resourceName, searchedHandle);
240 return searchedHandle;
246 tb_error(
"This probably should never happen...");
247 IncrementReferenceOf(resourceIterator->second);
248 return resourceIterator->second;
253 template<
typename ResourceType,
typename HandleType>
void
256 tb_error_if(InvalidResource() == handle,
"tbExternalError: Attempting to destroy a resource with an invalid handle.");
257 tb_error_if(handle.mValue >= mResources.size(),
"tbExternalError: Attempting to destroy a resource with an out-of-bounds handle.");
259 mResources[handle.mValue].first = 0;
261 for (
auto cacheIter = mResourceCache.begin(), cacheEnd = mResourceCache.end(); cacheIter != cacheEnd; )
263 if (cacheIter->second == handle)
265 cacheIter = mResourceCache.erase(cacheIter);
276 template<
typename ResourceType,
typename HandleType>
void
280 mResourceCache.clear();
285 template<
typename ResourceType,
typename HandleType>
void
288 tb_error_if(mResources[handle.mValue].first == 0,
"tbExternalError: Attempting to increment reference count of object with 0 references.");
289 ++mResources[handle.mValue].first;
294 template<
typename ResourceType,
typename HandleType>
bool
297 tb_error_if(mResources[handle.mValue].first == 0,
"tbInternalError: Attempting to decrement reference count of object with 0 references.");
298 --mResources[handle.mValue].first;
299 return 0 == mResources[handle.mValue].first;
304 template<
typename ResourceType,
typename HandleType> ResourceType
308 tb_error_if(InvalidResource() == handle,
"tbExternalError: Attempting to access a resource with an invalid handle.");
309 tb_error_if(handle.mValue >= mResources.size(),
"tbInternalError: Invalid handle, access out of range.");
310 return mResources[handle.mValue].second;
315 template<
typename ResourceType,
typename HandleType>
void
318 tb_error_if(InvalidResource() == handle,
"tbExternalError: Attempting to access a resource with an invalid handle.");
319 tb_error_if(handle.mValue >= mResources.size(),
"tbInternalError: Invalid handle, access out of range.");
320 mResources[handle.mValue].second = resource;
325 template<
typename ResourceType,
typename HandleType>
const ResourceType&
329 tb_error_if(InvalidResource() == handle,
"tbExternalError: Attempting to access a resource with an invalid handle.");
330 tb_error_if(handle.mValue >= mResources.size(),
"tbInternalError: Invalid handle, access out of range.");
331 return mResources[handle.mValue].second;
336 template<
typename ResourceType,
typename HandleType> ResourceType&
340 tb_error_if(InvalidResource() == handle,
"tbExternalError: Attempting to access a resource with an invalid handle.");
341 tb_error_if(handle.mValue >= mResources.size(),
"tbInternalError: Invalid handle, access out of range.");
342 return mResources[handle.mValue].second;
347 template<
typename ResourceType,
typename HandleType> HandleType
350 const auto& resourceIterator = mResourceCache.find(resourceName);
351 if (mResourceCache.end() != resourceIterator)
353 return resourceIterator->second;
361 template<
typename ResourceType,
typename HandleType>
bool
363 const HandleType& handle)
const
365 if (handle.mValue < mResources.size() && mResources[handle.mValue].first > 0)
Definition: tb_noncopyable.hpp:21
Definition: tb_resource_cache.hpp:31
HandleType CreateResource(const ResourceType &resource, const String &resourceName="")
Definition: tb_resource_cache.hpp:211
ResourceType GetResource(const HandleType &handle) const
Definition: tb_resource_cache.hpp:305
bool DecrementReferenceOf(const HandleType &handle)
Definition: tb_resource_cache.hpp:295
const ResourceType & GetResourceReference(const HandleType &handle) const
Definition: tb_resource_cache.hpp:326
void IncrementReferenceOf(const HandleType &handle)
Definition: tb_resource_cache.hpp:286
HandleType GetResourceHandle(const String &resourceName) const
Definition: tb_resource_cache.hpp:348
void DestroyResource(const HandleType &handle)
Definition: tb_resource_cache.hpp:254
void SetResource(const HandleType &handle, const ResourceType &resource)
Definition: tb_resource_cache.hpp:316
bool IsValidHandle(const HandleType &handle) const
Definition: tb_resource_cache.hpp:362
void ClearCache(void)
Definition: tb_resource_cache.hpp:277
static HandleType InvalidResource(void)
Definition: tb_resource_cache.hpp:203
#define tb_error(message,...)
Definition: tb_error.hpp:23
#define tb_error_if(errorTest, message,...)
Definition: tb_error.hpp:42
Contains core functionality for each component of the API.
Definition: tb_debug_logger.hpp:125
std::string String
Definition: tb_string.hpp:302
std::uint32_t uint32
Unsigned integer with a size of 32 bits. Supports values from 0 to 4294967295, (2^32 - 1).
Definition: tb_types.hpp:27