summaryrefslogtreecommitdiffstats
path: root/core/resource/resource.hh
diff options
context:
space:
mode:
authoruntodesu <kirill@untode.su>2025-09-11 14:13:39 +0500
committeruntodesu <kirill@untode.su>2025-09-11 14:13:39 +0500
commit8784cbfebcb8a0220fb947a6070032e20b80fc2f (patch)
tree2e03a2c013ed7b19a5dafaba1ddfb05c1878449a /core/resource/resource.hh
parentf0cc06c7388acb32b86301965c5b2547e4e3b919 (diff)
downloadvoxelius-8784cbfebcb8a0220fb947a6070032e20b80fc2f.tar.bz2
voxelius-8784cbfebcb8a0220fb947a6070032e20b80fc2f.zip
Another qfengine graft: resource management
DECOPYPASTA DECOPYPASTA DECOPYPASTA DECOPYPASTA
Diffstat (limited to 'core/resource/resource.hh')
-rw-r--r--core/resource/resource.hh43
1 files changed, 41 insertions, 2 deletions
diff --git a/core/resource/resource.hh b/core/resource/resource.hh
index 5b6b2ac..ad8d944 100644
--- a/core/resource/resource.hh
+++ b/core/resource/resource.hh
@@ -5,14 +5,53 @@
template<typename T>
using resource_ptr = std::shared_ptr<const T>;
+constexpr std::uint32_t RESOURCE_CACHE = 0x00000001U; ///< Cache the resource after loading
+constexpr std::uint32_t RESOURCE_USER = 0xFFFFFF00U; ///< User-defined flags for custom behavior
+
+using ResourceLoadFunc = const void* (*)(const char* name, std::uint32_t flags);
+using ResourceFreeFunc = void (*)(const void* resource);
+
+namespace resource::detail
+{
+void register_loader(const std::type_info& type, ResourceLoadFunc load_func, ResourceFreeFunc free_func);
+resource_ptr<void> load_resource(const std::type_info& type, std::string_view name, std::uint32_t flags);
+resource_ptr<void> find_resource(const std::type_info& type, std::string_view name);
+} // namespace resource::detail
+
namespace resource
{
template<typename T>
-resource_ptr<T> load(std::string_view name, unsigned int flags = 0U);
+void register_loader(ResourceLoadFunc load_func, ResourceFreeFunc free_func);
template<typename T>
-void hard_cleanup(void);
+resource_ptr<T> load(std::string_view name, std::uint32_t flags = 0U);
template<typename T>
+resource_ptr<T> find(std::string_view name);
+} // namespace resource
+
+namespace resource
+{
+void hard_cleanup(void);
void soft_cleanup(void);
} // namespace resource
+template<typename T>
+void resource::register_loader(ResourceLoadFunc load_func, ResourceFreeFunc free_func)
+{
+ resource::detail::register_loader(typeid(T), load_func, free_func);
+}
+
+template<typename T>
+resource_ptr<T> resource::load(std::string_view name, std::uint32_t flags)
+{
+ auto result = resource::detail::load_resource(typeid(T), name, flags);
+ return std::reinterpret_pointer_cast<const T>(result);
+}
+
+template<typename T>
+resource_ptr<T> resource::find(std::string_view name)
+{
+ auto result = resource::detail::find_resource(typeid(T), name);
+ return std::reinterpret_pointer_cast<const T>(result);
+}
+
#endif // CORE_RESOURCE_RESOURCE_HH