1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
const std = @import("std");
const Storage = @import("../root.zig");
pub const Image = @import("image.zig");
const Self = @This();
pub const empty: Self = .{};
items: std.ArrayList(Image) = .empty,
rw_lock: std.Thread.RwLock = .{},
pub const LockedImages = struct {
images: []Image,
rw_lock: *std.Thread.RwLock,
pub fn deinit(self: *const @This()) void {
self.rw_lock.unlockShared();
}
};
pub fn init(
self: *Self,
storage: *Storage,
) !void {
var dir = storage.dir.openDir("image", .{ .iterate = true }) catch blk: {
try storage.dir.makeDir("image");
break :blk try storage.dir.openDir("image", .{ .iterate = true });
};
defer dir.close();
var iterator = dir.iterate();
errdefer self.items.deinit(storage.allocator);
while (try iterator.next()) |entry| {
if (entry.kind == .file and std.mem.endsWith(u8, entry.name, ".jpg")) {
try self.items.append(
storage.allocator,
try .init(storage.allocator, entry.name[0..entry.name.len - 4])
);
}
}
}
pub fn add(
self: *Self,
storage: *Storage,
reader: *std.Io.Reader,
size: usize,
) !void {
self.rw_lock.lock();
defer self.rw_lock.unlock();
try self.items.append(
storage.allocator,
try Image.new(storage, reader, size),
);
}
pub fn list(self: *Self) LockedImages {
return .{
.images = self.items.items,
.rw_lock = &self.rw_lock,
};
}
|