authorgravatar for 604700341@qq.comhadroncfy <604700341@qq.com> 2021-06-18 13:52:30+08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-06-20 16:26:01-07:00
logcf6e2d318a6e4b2d8921c3fd1989c693874ab942
treea14bbe430646f16ed787c8f79b0a1f92984b0fc3
parent1fe0142d1f40a0051c6a41c12640db443f635ec8

HashMap.getOrPutAssumeCapacityAdapted should set key to undefined (#9138)

* std.hash_map.HashMap: getOrPutAssumeCapacityAdapted should set key to undefined * add test for std.hash_map.HashMap.getOrPutAdapted

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

lib/std/hash_map.zig+47-1
......@@ -1236,7 +1236,7 @@ pub fn HashMapUnmanaged(
12361236 metadata[0].fill(fingerprint);
12371237 const new_key = &self.keys()[idx];
12381238 const new_value = &self.values()[idx];
1239 new_key.* = key;
1239 new_key.* = undefined;
12401240 new_value.* = undefined;
12411241 self.size += 1;
12421242
......@@ -1884,6 +1884,52 @@ test "std.hash_map clone" {
18841884 }
18851885}
18861886
1887test "std.hash_map getOrPutAdapted" {
1888 const AdaptedContext = struct {
1889 fn eql(self: @This(), adapted_key: []const u8, test_key: u64) bool {
1890 return std.fmt.parseInt(u64, adapted_key, 10) catch unreachable == test_key;
1891 }
1892 fn hash(self: @This(), adapted_key: []const u8) u64 {
1893 const key = std.fmt.parseInt(u64, adapted_key, 10) catch unreachable;
1894 return (AutoContext(u64){}).hash(key);
1895 }
1896 };
1897 var map = AutoHashMap(u64, u64).init(testing.allocator);
1898 defer map.deinit();
1899
1900 const keys = [_][]const u8{
1901 "1231",
1902 "4564",
1903 "7894",
1904 "1132",
1905 "65235",
1906 "95462",
1907 "0112305",
1908 "00658",
1909 "0",
1910 "2",
1911 };
1912
1913 var real_keys: [keys.len]u64 = undefined;
1914
1915 inline for (keys) |key_str, i| {
1916 const result = try map.getOrPutAdapted(key_str, AdaptedContext{});
1917 try testing.expect(!result.found_existing);
1918 real_keys[i] = std.fmt.parseInt(u64, key_str, 10) catch unreachable;
1919 result.key_ptr.* = real_keys[i];
1920 result.value_ptr.* = i * 2;
1921 }
1922
1923 try testing.expectEqual(map.count(), keys.len);
1924
1925 inline for (keys) |key_str, i| {
1926 const result = try map.getOrPutAdapted(key_str, AdaptedContext{});
1927 try testing.expect(result.found_existing);
1928 try testing.expectEqual(real_keys[i], result.key_ptr.*);
1929 try testing.expectEqual(@as(u64, i) * 2, result.value_ptr.*);
1930 }
1931}
1932
18871933test "compile everything" {
18881934 std.testing.refAllDecls(AutoHashMap(i32, i32));
18891935 std.testing.refAllDecls(StringHashMap([]const u8));