#pragma once #include #include #include #include #include #include "opengl/resource_management/reference_counter.hpp" namespace zgl { template class resource_manager : public reference_counter { public: using gl_id_type = GLuint; using size_type = std::uint64_t; using resource_entry_type = std::pair; friend class resource_handle; bool has_resource(StoreID store_id); std::optional> get_resource(StoreID store_id); void collect_garbage(); void add_resource(StoreID store_id, gl_id_type gl_id, MetaData meta); [[nodiscard]] size_type count_garbage(); void extract_garbage(std::vector& dst); void add_reference(gl_id_type id) override; void remove_reference(gl_id_type id) override; private: static constexpr size_type unused_resource_flag = size_type{ 1 } << (sizeof(size_type) * 8 - 1); size_type max_unused_collection_cycle_count; std::shared_mutex m_lock; std::unordered_map m_resource_lookup; std::unordered_map m_reference_counters; std::unordered_set m_unused_handles; }; } #define INCLUDE_RESOURCE_MANAGER_IMPLEMENTATION #include "opengl/resource_management/resource_manager.ipp" #undef INCLUDE_RESOURCE_MANAGER_IMPLEMENTATION