| 1 | const std = @import("std"); |
| 2 | const string = []const u8; |
| 3 | const extras = @import("./lib.zig"); |
| 4 | const lessThanSlice = extras.lessThanSlice; |
| 5 | |
| 6 | pub 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 | |
| 14 | test { |
| 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 | } |