mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-19 18:26:13 +03:00
terminal/new: hash map doesn't need available
This commit is contained in:
@ -68,14 +68,12 @@ pub fn OffsetHashMap(
|
|||||||
|
|
||||||
metadata: Offset(Unmanaged.Metadata) = .{},
|
metadata: Offset(Unmanaged.Metadata) = .{},
|
||||||
size: Unmanaged.Size = 0,
|
size: Unmanaged.Size = 0,
|
||||||
available: Unmanaged.Size = 0,
|
|
||||||
|
|
||||||
pub fn init(cap: Unmanaged.Size, buf: []u8) Self {
|
pub fn init(cap: Unmanaged.Size, buf: []u8) Self {
|
||||||
const m = Unmanaged.init(cap, buf);
|
const m = Unmanaged.init(cap, buf);
|
||||||
return .{
|
return .{
|
||||||
.metadata = .{ .offset = @intCast(@intFromPtr(m.metadata.?) - @intFromPtr(buf.ptr)) },
|
.metadata = .{ .offset = @intCast(@intFromPtr(m.metadata.?) - @intFromPtr(buf.ptr)) },
|
||||||
.size = m.size,
|
.size = m.size,
|
||||||
.available = m.available,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +81,6 @@ pub fn OffsetHashMap(
|
|||||||
return .{
|
return .{
|
||||||
.metadata = self.metadata.ptr(base),
|
.metadata = self.metadata.ptr(base),
|
||||||
.size = self.size,
|
.size = self.size,
|
||||||
.available = self.available,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -128,12 +125,6 @@ pub fn HashMapUnmanaged(
|
|||||||
/// Current number of elements in the hashmap.
|
/// Current number of elements in the hashmap.
|
||||||
size: Size = 0,
|
size: Size = 0,
|
||||||
|
|
||||||
// Having a countdown to grow reduces the number of instructions to
|
|
||||||
// execute when determining if the hashmap has enough capacity already.
|
|
||||||
/// Number of available slots before a grow is needed to satisfy the
|
|
||||||
/// `max_load_percentage`.
|
|
||||||
available: Size = 0,
|
|
||||||
|
|
||||||
// This is purely empirical and not a /very smart magic constant™/.
|
// This is purely empirical and not a /very smart magic constant™/.
|
||||||
/// Capacity of the first grow when bootstrapping the hashmap.
|
/// Capacity of the first grow when bootstrapping the hashmap.
|
||||||
const minimal_capacity = 8;
|
const minimal_capacity = 8;
|
||||||
@ -299,7 +290,6 @@ pub fn HashMapUnmanaged(
|
|||||||
if (@sizeOf([*]K) != 0) hdr.keys = .{ .offset = @intCast(layout.keys_start) };
|
if (@sizeOf([*]K) != 0) hdr.keys = .{ .offset = @intCast(layout.keys_start) };
|
||||||
if (@sizeOf([*]V) != 0) hdr.values = .{ .offset = @intCast(layout.vals_start) };
|
if (@sizeOf([*]V) != 0) hdr.values = .{ .offset = @intCast(layout.vals_start) };
|
||||||
map.initMetadatas();
|
map.initMetadatas();
|
||||||
map.available = new_capacity;
|
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
@ -320,7 +310,6 @@ pub fn HashMapUnmanaged(
|
|||||||
if (self.metadata) |_| {
|
if (self.metadata) |_| {
|
||||||
self.initMetadatas();
|
self.initMetadatas();
|
||||||
self.size = 0;
|
self.size = 0;
|
||||||
self.available = self.capacity();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -428,9 +417,6 @@ pub fn HashMapUnmanaged(
|
|||||||
metadata = self.metadata.? + idx;
|
metadata = self.metadata.? + idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(self.available > 0);
|
|
||||||
self.available -= 1;
|
|
||||||
|
|
||||||
const fingerprint = Metadata.takeFingerprint(hash);
|
const fingerprint = Metadata.takeFingerprint(hash);
|
||||||
metadata[0].fill(fingerprint);
|
metadata[0].fill(fingerprint);
|
||||||
self.keys()[idx] = key;
|
self.keys()[idx] = key;
|
||||||
@ -500,7 +486,6 @@ pub fn HashMapUnmanaged(
|
|||||||
old_key.* = undefined;
|
old_key.* = undefined;
|
||||||
old_val.* = undefined;
|
old_val.* = undefined;
|
||||||
self.size -= 1;
|
self.size -= 1;
|
||||||
self.available += 1;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -748,8 +733,6 @@ pub fn HashMapUnmanaged(
|
|||||||
idx = first_tombstone_idx;
|
idx = first_tombstone_idx;
|
||||||
metadata = self.metadata.? + idx;
|
metadata = self.metadata.? + idx;
|
||||||
}
|
}
|
||||||
// We're using a slot previously free or a tombstone.
|
|
||||||
self.available -= 1;
|
|
||||||
|
|
||||||
metadata[0].fill(fingerprint);
|
metadata[0].fill(fingerprint);
|
||||||
const new_key = &self.keys()[idx];
|
const new_key = &self.keys()[idx];
|
||||||
@ -797,7 +780,6 @@ pub fn HashMapUnmanaged(
|
|||||||
self.keys()[idx] = undefined;
|
self.keys()[idx] = undefined;
|
||||||
self.values()[idx] = undefined;
|
self.values()[idx] = undefined;
|
||||||
self.size -= 1;
|
self.size -= 1;
|
||||||
self.available += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If there is an `Entry` with a matching key, it is deleted from
|
/// If there is an `Entry` with a matching key, it is deleted from
|
||||||
@ -841,7 +823,8 @@ pub fn HashMapUnmanaged(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn growIfNeeded(self: *Self, new_count: Size) Allocator.Error!void {
|
fn growIfNeeded(self: *Self, new_count: Size) Allocator.Error!void {
|
||||||
if (new_count > self.available) return error.OutOfMemory;
|
const available = self.capacity() - self.size;
|
||||||
|
if (new_count > available) return error.OutOfMemory;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The memory layout for the underlying buffer for a given capacity.
|
/// The memory layout for the underlying buffer for a given capacity.
|
||||||
@ -1235,7 +1218,7 @@ test "HashMap repeat putAssumeCapacity/remove" {
|
|||||||
defer alloc.free(buf);
|
defer alloc.free(buf);
|
||||||
var map = Map.init(cap, buf);
|
var map = Map.init(cap, buf);
|
||||||
|
|
||||||
const limit = map.available;
|
const limit = cap;
|
||||||
|
|
||||||
var i: u32 = 0;
|
var i: u32 = 0;
|
||||||
while (i < limit) : (i += 1) {
|
while (i < limit) : (i += 1) {
|
||||||
@ -1258,7 +1241,6 @@ test "HashMap repeat putAssumeCapacity/remove" {
|
|||||||
while (i < 10 * limit) : (i += 1) {
|
while (i < 10 * limit) : (i += 1) {
|
||||||
try expectEqual(map.get(limit + i), i);
|
try expectEqual(map.get(limit + i), i);
|
||||||
}
|
}
|
||||||
try expectEqual(map.available, 0);
|
|
||||||
try expectEqual(map.count(), limit);
|
try expectEqual(map.count(), limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user