From b0a00c5581be2d1881d622d5a13571a1298e240a Mon Sep 17 00:00:00 2001 From: iddev5 Date: Mon, 20 Jun 2022 18:38:19 +0530 Subject: [PATCH] mach: ResourceManager: implement storage and unload of resources --- src/resource/ResourceManager.zig | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/resource/ResourceManager.zig b/src/resource/ResourceManager.zig index cc4e633e..502d0f49 100644 --- a/src/resource/ResourceManager.zig +++ b/src/resource/ResourceManager.zig @@ -6,7 +6,7 @@ const ResourceManager = @This(); allocator: std.mem.Allocator, paths: []const []const u8, resource_types: []const ResourceType, -resources: std.ArrayListUnmanaged(Resource) = .{}, +resources: std.StringHashMapUnmanaged(Resource) = .{}, cwd: std.fs.Dir, pub fn init(allocator: std.mem.Allocator, paths: []const []const u8, resource_types: []const ResourceType) !ResourceManager { @@ -28,6 +28,9 @@ pub const ResourceType = struct { }; pub fn getResource(self: *ResourceManager, uri: []const u8) !Resource { + if (self.resources.get(uri)) |res| + return res; + var file: ?std.fs.File = null; const uri_data = try uri_parser.parseUri(uri); @@ -44,15 +47,26 @@ pub fn getResource(self: *ResourceManager, uri: []const u8) !Resource { if (file) |f| { var data = try f.reader().readAllAlloc(self.allocator, std.math.maxInt(usize)); - errdefer data.deinit(); + errdefer self.allocator.free(data); - return Resource{ .resource = @ptrCast(*anyopaque, &data.ptr), .size = data.len }; + const res = Resource{ + .uri = try self.allocator.dupe(u8, uri), + .resource = @ptrCast(*anyopaque, &data.ptr), + .size = data.len, + }; + try self.resources.putNoClobber(self.allocator, uri, res); + return res; } return error.ResourceNotFound; } +pub fn unloadResource(self: *ResourceManager, res: Resource) void { + _ = self.resources.remove(res.uri); +} + pub const Resource = struct { + uri: []const u8, resource: *anyopaque, size: u64,