| author | |
| committer | |
| log | 6bd54793060191ffce2c7492a90a40a30f9e2a1d |
| tree | a330c7f4d0882653cb2840a5faa2d04d38fa8fd6 |
| parent | 88284c124a0d930541f02ae9727118c0724f93f9 |
6 files changed, 45 insertions(+), 21 deletions(-)
lib/std/c/tokenizer.zig-1| ... | ... | @@ -1,5 +1,4 @@ |
| 1 | 1 | const std = @import("std"); |
| 2 | const mem = std.mem; | |
| 3 | 2 | |
| 4 | 3 | pub const Token = struct { |
| 5 | 4 | id: Id, |
lib/std/comptime_string_map.zig+15-8| ... | ... | @@ -9,18 +9,12 @@ const mem = std.mem; |
| 9 | 9 | /// You can pass `struct { []const u8 }` (only keys) tuples if `V` is `void`. |
| 10 | 10 | pub fn ComptimeStringMap(comptime V: type, comptime kvs_list: anytype) type { |
| 11 | 11 | const precomputed = comptime blk: { |
| 12 | @setEvalBranchQuota(2000); | |
| 12 | @setEvalBranchQuota(1500); | |
| 13 | 13 | const KV = struct { |
| 14 | 14 | key: []const u8, |
| 15 | 15 | value: V, |
| 16 | 16 | }; |
| 17 | 17 | var sorted_kvs: [kvs_list.len]KV = undefined; |
| 18 | const lenAsc = (struct { | |
| 19 | fn lenAsc(context: void, a: KV, b: KV) bool { | |
| 20 | _ = context; | |
| 21 | return a.key.len < b.key.len; | |
| 22 | } | |
| 23 | }).lenAsc; | |
| 24 | 18 | for (kvs_list, 0..) |kv, i| { |
| 25 | 19 | if (V != void) { |
| 26 | 20 | sorted_kvs[i] = .{ .key = kv.@"0", .value = kv.@"1" }; |
| ... | ... | @@ -28,7 +22,20 @@ pub fn ComptimeStringMap(comptime V: type, comptime kvs_list: anytype) type { |
| 28 | 22 | sorted_kvs[i] = .{ .key = kv.@"0", .value = {} }; |
| 29 | 23 | } |
| 30 | 24 | } |
| 31 | mem.sort(KV, &sorted_kvs, {}, lenAsc); | |
| 25 | ||
| 26 | const SortContext = struct { | |
| 27 | kvs: []KV, | |
| 28 | ||
| 29 | pub fn lessThan(ctx: @This(), a: usize, b: usize) bool { | |
| 30 | return ctx.kvs[a].key.len < ctx.kvs[b].key.len; | |
| 31 | } | |
| 32 | ||
| 33 | pub fn swap(ctx: @This(), a: usize, b: usize) void { | |
| 34 | return std.mem.swap(KV, &ctx.kvs[a], &ctx.kvs[b]); | |
| 35 | } | |
| 36 | }; | |
| 37 | mem.sortUnstableContext(0, sorted_kvs.len, SortContext{ .kvs = &sorted_kvs }); | |
| 38 | ||
| 32 | 39 | const min_len = sorted_kvs[0].key.len; |
| 33 | 40 | const max_len = sorted_kvs[sorted_kvs.len - 1].key.len; |
| 34 | 41 | var len_indexes: [max_len + 1]usize = undefined; |
lib/std/enums.zig+18-9| ... | ... | @@ -1289,10 +1289,6 @@ test "std.enums.ensureIndexer" { |
| 1289 | 1289 | }); |
| 1290 | 1290 | } |
| 1291 | 1291 | |
| 1292 | fn ascByValue(ctx: void, comptime a: EnumField, comptime b: EnumField) bool { | |
| 1293 | _ = ctx; | |
| 1294 | return a.value < b.value; | |
| 1295 | } | |
| 1296 | 1292 | pub fn EnumIndexer(comptime E: type) type { |
| 1297 | 1293 | if (!@typeInfo(E).Enum.is_exhaustive) { |
| 1298 | 1294 | @compileError("Cannot create an enum indexer for a non-exhaustive enum."); |
| ... | ... | @@ -1300,7 +1296,10 @@ pub fn EnumIndexer(comptime E: type) type { |
| 1300 | 1296 | |
| 1301 | 1297 | const const_fields = std.meta.fields(E); |
| 1302 | 1298 | var fields = const_fields[0..const_fields.len].*; |
| 1303 | if (fields.len == 0) { | |
| 1299 | const min = fields[0].value; | |
| 1300 | const max = fields[fields.len - 1].value; | |
| 1301 | const fields_len = fields.len; | |
| 1302 | if (fields_len == 0) { | |
| 1304 | 1303 | return struct { |
| 1305 | 1304 | pub const Key = E; |
| 1306 | 1305 | pub const count: usize = 0; |
| ... | ... | @@ -1314,10 +1313,20 @@ pub fn EnumIndexer(comptime E: type) type { |
| 1314 | 1313 | } |
| 1315 | 1314 | }; |
| 1316 | 1315 | } |
| 1317 | std.mem.sort(EnumField, &fields, {}, ascByValue); | |
| 1318 | const min = fields[0].value; | |
| 1319 | const max = fields[fields.len - 1].value; | |
| 1320 | const fields_len = fields.len; | |
| 1316 | ||
| 1317 | const SortContext = struct { | |
| 1318 | fields: []EnumField, | |
| 1319 | ||
| 1320 | pub fn lessThan(comptime ctx: @This(), comptime a: usize, comptime b: usize) bool { | |
| 1321 | return ctx.fields[a].value < ctx.fields[b].value; | |
| 1322 | } | |
| 1323 | ||
| 1324 | pub fn swap(comptime ctx: @This(), comptime a: usize, comptime b: usize) void { | |
| 1325 | return std.mem.swap(EnumField, &ctx.fields[a], &ctx.fields[b]); | |
| 1326 | } | |
| 1327 | }; | |
| 1328 | std.sort.insertionContext(0, fields_len, SortContext{ .fields = &fields }); | |
| 1329 | ||
| 1321 | 1330 | if (max - min == fields.len - 1) { |
| 1322 | 1331 | return struct { |
| 1323 | 1332 | pub const Key = E; |
lib/std/sort.zig+1-1| ... | ... | @@ -366,7 +366,7 @@ test "sort with context in the middle of a slice" { |
| 366 | 366 | const slice = buf[0..case[0].len]; |
| 367 | 367 | @memcpy(slice, case[0]); |
| 368 | 368 | sortFn(range.start, range.end, Context{ .items = slice }); |
| 369 | try testing.expectEqualSlices(i32, slice[range.start..range.end], case[1][range.start..range.end]); | |
| 369 | try testing.expectEqualSlices(i32, case[1][range.start..range.end], slice[range.start..range.end]); | |
| 370 | 370 | } |
| 371 | 371 | } |
| 372 | 372 | } |
lib/std/sort/block.zig+10-1| ... | ... | @@ -1,3 +1,4 @@ |
| 1 | const builtin = @import("builtin"); | |
| 1 | 2 | const std = @import("../std.zig"); |
| 2 | 3 | const sort = std.sort; |
| 3 | 4 | const math = std.math; |
| ... | ... | @@ -100,8 +101,16 @@ pub fn block( |
| 100 | 101 | comptime T: type, |
| 101 | 102 | items: []T, |
| 102 | 103 | context: anytype, |
| 103 | comptime lessThan: fn (@TypeOf(context), lhs: T, rhs: T) bool, | |
| 104 | comptime lessThanFn: fn (@TypeOf(context), lhs: T, rhs: T) bool, | |
| 104 | 105 | ) void { |
| 106 | const lessThan = if (builtin.mode == .Debug) struct { | |
| 107 | fn lessThan(ctx: @TypeOf(context), lhs: T, rhs: T) bool { | |
| 108 | const lt = lessThanFn(ctx, lhs, rhs); | |
| 109 | const gt = lessThanFn(ctx, rhs, lhs); | |
| 110 | std.debug.assert(!(lt and gt)); | |
| 111 | return lt; | |
| 112 | } | |
| 113 | }.lessThan else lessThanFn; | |
| 105 | 114 | |
| 106 | 115 | // Implementation ported from https://github.com/BonzaiThePenguin/WikiSort/blob/master/WikiSort.c |
| 107 | 116 | var cache: [512]T = undefined; |
src/arch/x86_64/Encoding.zig+1-1| ... | ... | @@ -767,7 +767,7 @@ fn estimateInstructionLength(prefix: Prefix, encoding: Encoding, ops: []const Op |
| 767 | 767 | } |
| 768 | 768 | |
| 769 | 769 | const mnemonic_to_encodings_map = init: { |
| 770 | @setEvalBranchQuota(30_000); | |
| 770 | @setEvalBranchQuota(50_000); | |
| 771 | 771 | const encodings = @import("encodings.zig"); |
| 772 | 772 | var entries = encodings.table; |
| 773 | 773 | std.mem.sort(encodings.Entry, &entries, {}, struct { |