From 8784cbfebcb8a0220fb947a6070032e20b80fc2f Mon Sep 17 00:00:00 2001 From: untodesu Date: Thu, 11 Sep 2025 14:13:39 +0500 Subject: Another qfengine graft: resource management DECOPYPASTA DECOPYPASTA DECOPYPASTA DECOPYPASTA --- core/resource/resource.hh | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'core/resource/resource.hh') 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 using resource_ptr = std::shared_ptr; +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 load_resource(const std::type_info& type, std::string_view name, std::uint32_t flags); +resource_ptr find_resource(const std::type_info& type, std::string_view name); +} // namespace resource::detail + namespace resource { template -resource_ptr load(std::string_view name, unsigned int flags = 0U); +void register_loader(ResourceLoadFunc load_func, ResourceFreeFunc free_func); template -void hard_cleanup(void); +resource_ptr load(std::string_view name, std::uint32_t flags = 0U); template +resource_ptr find(std::string_view name); +} // namespace resource + +namespace resource +{ +void hard_cleanup(void); void soft_cleanup(void); } // namespace resource +template +void resource::register_loader(ResourceLoadFunc load_func, ResourceFreeFunc free_func) +{ + resource::detail::register_loader(typeid(T), load_func, free_func); +} + +template +resource_ptr 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(result); +} + +template +resource_ptr resource::find(std::string_view name) +{ + auto result = resource::detail::find_resource(typeid(T), name); + return std::reinterpret_pointer_cast(result); +} + #endif // CORE_RESOURCE_RESOURCE_HH -- cgit