authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-11-27 14:13:12-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-11-27 14:35:01-08:00
loge374483d67592907522141546450e89e4d2f5d1e
treea6691d9735d9e99378e909e2b29828bc5901a1a5
parent20215a376c56edfe460b1e5e35a2377af769eac5

std.ArrayHashMap: update to the "gpa"/"arena" convention

for Allocator names

1 files changed, 71 insertions(+), 71 deletions(-)

lib/std/array_hash_map.zig+71-71
......@@ -616,44 +616,44 @@ pub fn ArrayHashMapUnmanaged(
616616
617617 /// Convert from an unmanaged map to a managed map. After calling this,
618618 /// the promoted map should no longer be used.
619 pub fn promote(self: Self, allocator: Allocator) Managed {
619 pub fn promote(self: Self, gpa: Allocator) Managed {
620620 if (@sizeOf(Context) != 0)
621621 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call promoteContext instead.");
622 return self.promoteContext(allocator, undefined);
622 return self.promoteContext(gpa, undefined);
623623 }
624 pub fn promoteContext(self: Self, allocator: Allocator, ctx: Context) Managed {
624 pub fn promoteContext(self: Self, gpa: Allocator, ctx: Context) Managed {
625625 return .{
626626 .unmanaged = self,
627 .allocator = allocator,
627 .allocator = gpa,
628628 .ctx = ctx,
629629 };
630630 }
631631
632 pub fn init(allocator: Allocator, key_list: []const K, value_list: []const V) Oom!Self {
632 pub fn init(gpa: Allocator, key_list: []const K, value_list: []const V) Oom!Self {
633633 var self: Self = .{};
634 errdefer self.deinit(allocator);
635 try self.reinit(allocator, key_list, value_list);
634 errdefer self.deinit(gpa);
635 try self.reinit(gpa, key_list, value_list);
636636 return self;
637637 }
638638
639 pub fn reinit(self: *Self, allocator: Allocator, key_list: []const K, value_list: []const V) Oom!void {
640 try self.entries.resize(allocator, key_list.len);
639 pub fn reinit(self: *Self, gpa: Allocator, key_list: []const K, value_list: []const V) Oom!void {
640 try self.entries.resize(gpa, key_list.len);
641641 @memcpy(self.keys(), key_list);
642642 if (@sizeOf(V) != 0) {
643643 assert(key_list.len == value_list.len);
644644 @memcpy(self.values(), value_list);
645645 }
646 try self.reIndex(allocator);
646 try self.reIndex(gpa);
647647 }
648648
649649 /// Frees the backing allocation and leaves the map in an undefined state.
650650 /// Note that this does not free keys or values. You must take care of that
651651 /// before calling this function, if it is needed.
652 pub fn deinit(self: *Self, allocator: Allocator) void {
652 pub fn deinit(self: *Self, gpa: Allocator) void {
653653 self.pointer_stability.assertUnlocked();
654 self.entries.deinit(allocator);
654 self.entries.deinit(gpa);
655655 if (self.index_header) |header| {
656 header.free(allocator);
656 header.free(gpa);
657657 }
658658 self.* = undefined;
659659 }
......@@ -691,13 +691,13 @@ pub fn ArrayHashMapUnmanaged(
691691 }
692692
693693 /// Clears the map and releases the backing allocation
694 pub fn clearAndFree(self: *Self, allocator: Allocator) void {
694 pub fn clearAndFree(self: *Self, gpa: Allocator) void {
695695 self.pointer_stability.lock();
696696 defer self.pointer_stability.unlock();
697697
698 self.entries.shrinkAndFree(allocator, 0);
698 self.entries.shrinkAndFree(gpa, 0);
699699 if (self.index_header) |header| {
700 header.free(allocator);
700 header.free(gpa);
701701 self.index_header = null;
702702 }
703703 }
......@@ -760,25 +760,25 @@ pub fn ArrayHashMapUnmanaged(
760760 /// Otherwise, puts a new item with undefined value, and
761761 /// the `Entry` pointer points to it. Caller should then initialize
762762 /// the value (but not the key).
763 pub fn getOrPut(self: *Self, allocator: Allocator, key: K) Oom!GetOrPutResult {
763 pub fn getOrPut(self: *Self, gpa: Allocator, key: K) Oom!GetOrPutResult {
764764 if (@sizeOf(Context) != 0)
765765 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getOrPutContext instead.");
766 return self.getOrPutContext(allocator, key, undefined);
766 return self.getOrPutContext(gpa, key, undefined);
767767 }
768 pub fn getOrPutContext(self: *Self, allocator: Allocator, key: K, ctx: Context) Oom!GetOrPutResult {
769 const gop = try self.getOrPutContextAdapted(allocator, key, ctx, ctx);
768 pub fn getOrPutContext(self: *Self, gpa: Allocator, key: K, ctx: Context) Oom!GetOrPutResult {
769 const gop = try self.getOrPutContextAdapted(gpa, key, ctx, ctx);
770770 if (!gop.found_existing) {
771771 gop.key_ptr.* = key;
772772 }
773773 return gop;
774774 }
775 pub fn getOrPutAdapted(self: *Self, allocator: Allocator, key: anytype, key_ctx: anytype) Oom!GetOrPutResult {
775 pub fn getOrPutAdapted(self: *Self, gpa: Allocator, key: anytype, key_ctx: anytype) Oom!GetOrPutResult {
776776 if (@sizeOf(Context) != 0)
777777 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getOrPutContextAdapted instead.");
778 return self.getOrPutContextAdapted(allocator, key, key_ctx, undefined);
778 return self.getOrPutContextAdapted(gpa, key, key_ctx, undefined);
779779 }
780 pub fn getOrPutContextAdapted(self: *Self, allocator: Allocator, key: anytype, key_ctx: anytype, ctx: Context) Oom!GetOrPutResult {
781 self.ensureTotalCapacityContext(allocator, self.entries.len + 1, ctx) catch |err| {
780 pub fn getOrPutContextAdapted(self: *Self, gpa: Allocator, key: anytype, key_ctx: anytype, ctx: Context) Oom!GetOrPutResult {
781 self.ensureTotalCapacityContext(gpa, self.entries.len + 1, ctx) catch |err| {
782782 // "If key exists this function cannot fail."
783783 const index = self.getIndexAdapted(key, key_ctx) orelse return err;
784784 const slice = self.entries.slice();
......@@ -858,13 +858,13 @@ pub fn ArrayHashMapUnmanaged(
858858 }
859859 }
860860
861 pub fn getOrPutValue(self: *Self, allocator: Allocator, key: K, value: V) Oom!GetOrPutResult {
861 pub fn getOrPutValue(self: *Self, gpa: Allocator, key: K, value: V) Oom!GetOrPutResult {
862862 if (@sizeOf(Context) != 0)
863863 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call getOrPutValueContext instead.");
864 return self.getOrPutValueContext(allocator, key, value, undefined);
864 return self.getOrPutValueContext(gpa, key, value, undefined);
865865 }
866 pub fn getOrPutValueContext(self: *Self, allocator: Allocator, key: K, value: V, ctx: Context) Oom!GetOrPutResult {
867 const res = try self.getOrPutContextAdapted(allocator, key, ctx, ctx);
866 pub fn getOrPutValueContext(self: *Self, gpa: Allocator, key: K, value: V, ctx: Context) Oom!GetOrPutResult {
867 const res = try self.getOrPutContextAdapted(gpa, key, ctx, ctx);
868868 if (!res.found_existing) {
869869 res.key_ptr.* = key;
870870 res.value_ptr.* = value;
......@@ -874,32 +874,32 @@ pub fn ArrayHashMapUnmanaged(
874874
875875 /// Increases capacity, guaranteeing that insertions up until the
876876 /// `expected_count` will not cause an allocation, and therefore cannot fail.
877 pub fn ensureTotalCapacity(self: *Self, allocator: Allocator, new_capacity: usize) Oom!void {
877 pub fn ensureTotalCapacity(self: *Self, gpa: Allocator, new_capacity: usize) Oom!void {
878878 if (@sizeOf(ByIndexContext) != 0)
879879 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call ensureTotalCapacityContext instead.");
880 return self.ensureTotalCapacityContext(allocator, new_capacity, undefined);
880 return self.ensureTotalCapacityContext(gpa, new_capacity, undefined);
881881 }
882 pub fn ensureTotalCapacityContext(self: *Self, allocator: Allocator, new_capacity: usize, ctx: Context) Oom!void {
882 pub fn ensureTotalCapacityContext(self: *Self, gpa: Allocator, new_capacity: usize, ctx: Context) Oom!void {
883883 self.pointer_stability.lock();
884884 defer self.pointer_stability.unlock();
885885
886886 if (new_capacity <= linear_scan_max) {
887 try self.entries.ensureTotalCapacity(allocator, new_capacity);
887 try self.entries.ensureTotalCapacity(gpa, new_capacity);
888888 return;
889889 }
890890
891891 if (self.index_header) |header| {
892892 if (new_capacity <= header.capacity()) {
893 try self.entries.ensureTotalCapacity(allocator, new_capacity);
893 try self.entries.ensureTotalCapacity(gpa, new_capacity);
894894 return;
895895 }
896896 }
897897
898 try self.entries.ensureTotalCapacity(allocator, new_capacity);
898 try self.entries.ensureTotalCapacity(gpa, new_capacity);
899899 const new_bit_index = try IndexHeader.findBitIndex(new_capacity);
900 const new_header = try IndexHeader.alloc(allocator, new_bit_index);
900 const new_header = try IndexHeader.alloc(gpa, new_bit_index);
901901
902 if (self.index_header) |old_header| old_header.free(allocator);
902 if (self.index_header) |old_header| old_header.free(gpa);
903903 self.insertAllEntriesIntoNewHeader(if (store_hash) {} else ctx, new_header);
904904 self.index_header = new_header;
905905 }
......@@ -909,20 +909,20 @@ pub fn ArrayHashMapUnmanaged(
909909 /// therefore cannot fail.
910910 pub fn ensureUnusedCapacity(
911911 self: *Self,
912 allocator: Allocator,
912 gpa: Allocator,
913913 additional_capacity: usize,
914914 ) Oom!void {
915915 if (@sizeOf(Context) != 0)
916916 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call ensureTotalCapacityContext instead.");
917 return self.ensureUnusedCapacityContext(allocator, additional_capacity, undefined);
917 return self.ensureUnusedCapacityContext(gpa, additional_capacity, undefined);
918918 }
919919 pub fn ensureUnusedCapacityContext(
920920 self: *Self,
921 allocator: Allocator,
921 gpa: Allocator,
922922 additional_capacity: usize,
923923 ctx: Context,
924924 ) Oom!void {
925 return self.ensureTotalCapacityContext(allocator, self.count() + additional_capacity, ctx);
925 return self.ensureTotalCapacityContext(gpa, self.count() + additional_capacity, ctx);
926926 }
927927
928928 /// Returns the number of total elements which may be present before it is
......@@ -936,25 +936,25 @@ pub fn ArrayHashMapUnmanaged(
936936
937937 /// Clobbers any existing data. To detect if a put would clobber
938938 /// existing data, see `getOrPut`.
939 pub fn put(self: *Self, allocator: Allocator, key: K, value: V) Oom!void {
939 pub fn put(self: *Self, gpa: Allocator, key: K, value: V) Oom!void {
940940 if (@sizeOf(Context) != 0)
941941 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call putContext instead.");
942 return self.putContext(allocator, key, value, undefined);
942 return self.putContext(gpa, key, value, undefined);
943943 }
944 pub fn putContext(self: *Self, allocator: Allocator, key: K, value: V, ctx: Context) Oom!void {
945 const result = try self.getOrPutContext(allocator, key, ctx);
944 pub fn putContext(self: *Self, gpa: Allocator, key: K, value: V, ctx: Context) Oom!void {
945 const result = try self.getOrPutContext(gpa, key, ctx);
946946 result.value_ptr.* = value;
947947 }
948948
949949 /// Inserts a key-value pair into the hash map, asserting that no previous
950950 /// entry with the same key is already present
951 pub fn putNoClobber(self: *Self, allocator: Allocator, key: K, value: V) Oom!void {
951 pub fn putNoClobber(self: *Self, gpa: Allocator, key: K, value: V) Oom!void {
952952 if (@sizeOf(Context) != 0)
953953 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call putNoClobberContext instead.");
954 return self.putNoClobberContext(allocator, key, value, undefined);
954 return self.putNoClobberContext(gpa, key, value, undefined);
955955 }
956 pub fn putNoClobberContext(self: *Self, allocator: Allocator, key: K, value: V, ctx: Context) Oom!void {
957 const result = try self.getOrPutContext(allocator, key, ctx);
956 pub fn putNoClobberContext(self: *Self, gpa: Allocator, key: K, value: V, ctx: Context) Oom!void {
957 const result = try self.getOrPutContext(gpa, key, ctx);
958958 assert(!result.found_existing);
959959 result.value_ptr.* = value;
960960 }
......@@ -987,13 +987,13 @@ pub fn ArrayHashMapUnmanaged(
987987 }
988988
989989 /// Inserts a new `Entry` into the hash map, returning the previous one, if any.
990 pub fn fetchPut(self: *Self, allocator: Allocator, key: K, value: V) Oom!?KV {
990 pub fn fetchPut(self: *Self, gpa: Allocator, key: K, value: V) Oom!?KV {
991991 if (@sizeOf(Context) != 0)
992992 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call fetchPutContext instead.");
993 return self.fetchPutContext(allocator, key, value, undefined);
993 return self.fetchPutContext(gpa, key, value, undefined);
994994 }
995 pub fn fetchPutContext(self: *Self, allocator: Allocator, key: K, value: V, ctx: Context) Oom!?KV {
996 const gop = try self.getOrPutContext(allocator, key, ctx);
995 pub fn fetchPutContext(self: *Self, gpa: Allocator, key: K, value: V, ctx: Context) Oom!?KV {
996 const gop = try self.getOrPutContext(gpa, key, ctx);
997997 var result: ?KV = null;
998998 if (gop.found_existing) {
999999 result = KV{
......@@ -1279,20 +1279,20 @@ pub fn ArrayHashMapUnmanaged(
12791279 /// Create a copy of the hash map which can be modified separately.
12801280 /// The copy uses the same context as this instance, but is allocated
12811281 /// with the provided allocator.
1282 pub fn clone(self: Self, allocator: Allocator) Oom!Self {
1282 pub fn clone(self: Self, gpa: Allocator) Oom!Self {
12831283 if (@sizeOf(ByIndexContext) != 0)
12841284 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call cloneContext instead.");
1285 return self.cloneContext(allocator, undefined);
1285 return self.cloneContext(gpa, undefined);
12861286 }
1287 pub fn cloneContext(self: Self, allocator: Allocator, ctx: Context) Oom!Self {
1287 pub fn cloneContext(self: Self, gpa: Allocator, ctx: Context) Oom!Self {
12881288 var other: Self = .{};
1289 other.entries = try self.entries.clone(allocator);
1290 errdefer other.entries.deinit(allocator);
1289 other.entries = try self.entries.clone(gpa);
1290 errdefer other.entries.deinit(gpa);
12911291
12921292 if (self.index_header) |header| {
12931293 // TODO: I'm pretty sure this could be memcpy'd instead of
12941294 // doing all this work.
1295 const new_header = try IndexHeader.alloc(allocator, header.bit_index);
1295 const new_header = try IndexHeader.alloc(gpa, header.bit_index);
12961296 other.insertAllEntriesIntoNewHeader(if (store_hash) {} else ctx, new_header);
12971297 other.index_header = new_header;
12981298 }
......@@ -1318,13 +1318,13 @@ pub fn ArrayHashMapUnmanaged(
13181318 /// directly without going through the methods of this map.
13191319 ///
13201320 /// The time complexity of this operation is O(n).
1321 pub fn reIndex(self: *Self, allocator: Allocator) Oom!void {
1321 pub fn reIndex(self: *Self, gpa: Allocator) Oom!void {
13221322 if (@sizeOf(ByIndexContext) != 0)
13231323 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call reIndexContext instead.");
1324 return self.reIndexContext(allocator, undefined);
1324 return self.reIndexContext(gpa, undefined);
13251325 }
13261326
1327 pub fn reIndexContext(self: *Self, allocator: Allocator, ctx: Context) Oom!void {
1327 pub fn reIndexContext(self: *Self, gpa: Allocator, ctx: Context) Oom!void {
13281328 // Recompute all hashes.
13291329 if (store_hash) {
13301330 for (self.keys(), self.entries.items(.hash)) |key, *hash| {
......@@ -1337,8 +1337,8 @@ pub fn ArrayHashMapUnmanaged(
13371337 // We're going to rebuild the index header and replace the existing one (if any). The
13381338 // indexes should sized such that they will be at most 60% full.
13391339 const bit_index = try IndexHeader.findBitIndex(self.entries.capacity);
1340 const new_header = try IndexHeader.alloc(allocator, bit_index);
1341 if (self.index_header) |header| header.free(allocator);
1340 const new_header = try IndexHeader.alloc(gpa, bit_index);
1341 if (self.index_header) |header| header.free(gpa);
13421342 self.insertAllEntriesIntoNewHeader(if (store_hash) {} else ctx, new_header);
13431343 self.index_header = new_header;
13441344 }
......@@ -1430,10 +1430,10 @@ pub fn ArrayHashMapUnmanaged(
14301430 /// performing hash and equality checks. It is a bug to call this
14311431 /// function if the discarded entries require deinitialization. For
14321432 /// that use case, `shrinkRetainingCapacity` can be used instead.
1433 pub fn shrinkAndFree(self: *Self, allocator: Allocator, new_len: usize) void {
1433 pub fn shrinkAndFree(self: *Self, gpa: Allocator, new_len: usize) void {
14341434 if (@sizeOf(ByIndexContext) != 0)
14351435 @compileError("Cannot infer context " ++ @typeName(Context) ++ ", call shrinkAndFreeContext instead.");
1436 return self.shrinkAndFreeContext(allocator, new_len, undefined);
1436 return self.shrinkAndFreeContext(gpa, new_len, undefined);
14371437 }
14381438
14391439 /// Shrinks the underlying `Entry` array to `new_len` elements and
......@@ -1444,7 +1444,7 @@ pub fn ArrayHashMapUnmanaged(
14441444 /// function if the discarded entries require deinitialization. For
14451445 /// that use case, `shrinkRetainingCapacityContext` can be used
14461446 /// instead.
1447 pub fn shrinkAndFreeContext(self: *Self, allocator: Allocator, new_len: usize, ctx: Context) void {
1447 pub fn shrinkAndFreeContext(self: *Self, gpa: Allocator, new_len: usize, ctx: Context) void {
14481448 self.pointer_stability.lock();
14491449 defer self.pointer_stability.unlock();
14501450
......@@ -1456,7 +1456,7 @@ pub fn ArrayHashMapUnmanaged(
14561456 while (i < self.entries.len) : (i += 1)
14571457 self.removeFromIndexByIndex(i, if (store_hash) {} else ctx, header);
14581458 }
1459 self.entries.shrinkAndFree(allocator, new_len);
1459 self.entries.shrinkAndFree(gpa, new_len);
14601460 }
14611461
14621462 /// Removes the last inserted `Entry` in the hash map and returns it.
......@@ -2111,11 +2111,11 @@ const IndexHeader = struct {
21112111
21122112 /// Allocates an index header, and fills the entryIndexes array with empty.
21132113 /// The distance array contents are undefined.
2114 fn alloc(allocator: Allocator, new_bit_index: u8) Allocator.Error!*IndexHeader {
2114 fn alloc(gpa: Allocator, new_bit_index: u8) Allocator.Error!*IndexHeader {
21152115 const len = @as(usize, 1) << @as(math.Log2Int(usize), @intCast(new_bit_index));
21162116 const index_size = hash_map.capacityIndexSize(new_bit_index);
21172117 const nbytes = @sizeOf(IndexHeader) + index_size * len;
2118 const bytes = try allocator.alignedAlloc(u8, @alignOf(IndexHeader), nbytes);
2118 const bytes = try gpa.alignedAlloc(u8, @alignOf(IndexHeader), nbytes);
21192119 @memset(bytes[@sizeOf(IndexHeader)..], 0xff);
21202120 const result: *IndexHeader = @alignCast(@ptrCast(bytes.ptr));
21212121 result.* = .{
......@@ -2125,11 +2125,11 @@ const IndexHeader = struct {
21252125 }
21262126
21272127 /// Releases the memory for a header and its associated arrays.
2128 fn free(header: *IndexHeader, allocator: Allocator) void {
2128 fn free(header: *IndexHeader, gpa: Allocator) void {
21292129 const index_size = hash_map.capacityIndexSize(header.bit_index);
21302130 const ptr: [*]align(@alignOf(IndexHeader)) u8 = @ptrCast(header);
21312131 const slice = ptr[0 .. @sizeOf(IndexHeader) + header.length() * index_size];
2132 allocator.free(slice);
2132 gpa.free(slice);
21332133 }
21342134
21352135 /// Puts an IndexHeader into the state that it would be in after being freshly allocated.