Support caching bools; make caching values infallible

master
LeRoyce Pearson 2020-03-05 23:22:55 -07:00 committed by Andrew Kelley
parent de341b8fb8
commit ce5b2286f1
1 changed files with 16 additions and 10 deletions

View File

@ -61,13 +61,14 @@ pub const CacheHash = struct {
};
}
pub fn cache_buf(self: *@This(), val: []const u8) !void {
pub fn cache_buf(self: *@This(), val: []const u8) void {
debug.assert(self.manifest_file_path == null);
self.blake3.update(val);
self.blake3.update(&[_]u8{0});
}
pub fn cache(self: *@This(), val: var) !void {
pub fn cache(self: *@This(), val: var) void {
debug.assert(self.manifest_file_path == null);
const val_type = @TypeOf(val);
@ -76,14 +77,17 @@ pub const CacheHash = struct {
const buf_len = @divExact(int_info.bits, 8);
var buf: [buf_len]u8 = undefined;
mem.writeIntNative(val_type, &buf, val);
self.blake3.update(&buf);
self.cache_buf(&buf);
} else {
@compileError("Unsupported integer size. Please use a multiple of 8, manually convert to a u8 slice.");
},
.Bool => {
var buf: [1]u8 = undefined;
buf[0] = if (val) 1 else 0;
self.blake3.update(&buf);
},
else => @compileError("Unsupported type"),
}
self.blake3.update(&[_]u8{0});
}
pub fn cache_file(self: *@This(), file_path: []const u8) !void {
@ -92,7 +96,7 @@ pub const CacheHash = struct {
var cache_hash_file = try self.files.addOne();
cache_hash_file.path = try fs.path.resolve(self.alloc, &[_][]const u8{file_path});
try self.cache_buf(cache_hash_file.path.?);
self.cache_buf(cache_hash_file.path.?);
}
pub fn hit(self: *@This(), out_digest: *ArrayList(u8)) !bool {
@ -321,8 +325,9 @@ test "cache file and the recall it" {
var ch = try CacheHash.init(testing.allocator, temp_manifest_dir);
defer ch.release();
try ch.cache(@as(u16, 1234));
try ch.cache_buf("1234");
ch.cache(true);
ch.cache(@as(u16, 1234));
ch.cache_buf("1234");
try ch.cache_file("test.txt");
// There should be nothing in the cache
@ -334,8 +339,9 @@ test "cache file and the recall it" {
var ch = try CacheHash.init(testing.allocator, temp_manifest_dir);
defer ch.release();
try ch.cache(@as(u16, 1234));
try ch.cache_buf("1234");
ch.cache(true);
ch.cache(@as(u16, 1234));
ch.cache_buf("1234");
try ch.cache_file("test.txt");
// Cache hit! We just "built" the same file