1const std = @import("std");
2const string = []const u8;
3const extras = @import("./lib.zig");
4const lessThanSlice = extras.lessThanSlice;
5
6pub fn sortBySlice(comptime T: type, items: []T, comptime field: std.meta.FieldEnum(T)) void {
7 std.mem.sort(T, items, {}, struct {
8 fn f(_: void, lhs: T, rhs: T) bool {
9 return lessThanSlice(@FieldType(T, @tagName(field)))({}, @field(lhs, @tagName(field)), @field(rhs, @tagName(field)));
10 }
11 }.f);
12}
13
14test {
15 const Block = struct {
16 from: u21,
17 to: u21,
18 name: []const u8,
19 };
20 var data = [_]Block{
21 .{ .from = 0x0000, .to = 0x007F, .name = "Basic Latin" },
22 .{ .from = 0x0080, .to = 0x00FF, .name = "Latin-1 Supplement" },
23 .{ .from = 0x0180, .to = 0x024F, .name = "Latin Extended-B" },
24 .{ .from = 0x0100, .to = 0x017F, .name = "Latin Extended-A" },
25 .{ .from = 0x0250, .to = 0x02AF, .name = "IPA Extensions" },
26 };
27 sortBySlice(Block, &data, .name);
28 try std.testing.expect(std.mem.eql(u8, data[0].name, "Basic Latin"));
29 try std.testing.expect(std.mem.eql(u8, data[1].name, "IPA Extensions"));
30 try std.testing.expect(std.mem.eql(u8, data[2].name, "Latin Extended-A"));
31 try std.testing.expect(std.mem.eql(u8, data[3].name, "Latin Extended-B"));
32 try std.testing.expect(std.mem.eql(u8, data[4].name, "Latin-1 Supplement"));
33}