| ... | ... | @@ -654,10 +654,14 @@ const eqlBytes_allowed = switch (builtin.zig_backend) { |
| 654 | 654 | else => !builtin.fuzz, |
| 655 | 655 | }; |
| 656 | 656 | |
| 657 | | /// Compares two slices and returns whether they are equal. |
| 657 | /// Returns true if and only if the slices have the same length and all elements |
| 658 | /// compare true using equality operator. |
| 658 | 659 | pub fn eql(comptime T: type, a: []const T, b: []const T) bool { |
| 659 | | if (@sizeOf(T) == 0) return true; |
| 660 | | if (!@inComptime() and std.meta.hasUniqueRepresentation(T) and eqlBytes_allowed) return eqlBytes(sliceAsBytes(a), sliceAsBytes(b)); |
| 660 | if (!@inComptime() and @sizeOf(T) != 0 and std.meta.hasUniqueRepresentation(T) and |
| 661 | eqlBytes_allowed) |
| 662 | { |
| 663 | return eqlBytes(sliceAsBytes(a), sliceAsBytes(b)); |
| 664 | } |
| 661 | 665 | |
| 662 | 666 | if (a.len != b.len) return false; |
| 663 | 667 | if (a.len == 0 or a.ptr == b.ptr) return true; |
| ... | ... | @@ -668,6 +672,25 @@ pub fn eql(comptime T: type, a: []const T, b: []const T) bool { |
| 668 | 672 | return true; |
| 669 | 673 | } |
| 670 | 674 | |
| 675 | test eql { |
| 676 | try testing.expect(eql(u8, "abcd", "abcd")); |
| 677 | try testing.expect(!eql(u8, "abcdef", "abZdef")); |
| 678 | try testing.expect(!eql(u8, "abcdefg", "abcdef")); |
| 679 | |
| 680 | comptime { |
| 681 | try testing.expect(eql(type, &.{ bool, f32 }, &.{ bool, f32 })); |
| 682 | try testing.expect(!eql(type, &.{ bool, f32 }, &.{ f32, bool })); |
| 683 | try testing.expect(!eql(type, &.{ bool, f32 }, &.{bool})); |
| 684 | |
| 685 | try testing.expect(eql(comptime_int, &.{ 1, 2, 3 }, &.{ 1, 2, 3 })); |
| 686 | try testing.expect(!eql(comptime_int, &.{ 1, 2, 3 }, &.{ 3, 2, 1 })); |
| 687 | try testing.expect(!eql(comptime_int, &.{1}, &.{ 1, 2 })); |
| 688 | } |
| 689 | |
| 690 | try testing.expect(eql(void, &.{ {}, {} }, &.{ {}, {} })); |
| 691 | try testing.expect(!eql(void, &.{{}}, &.{ {}, {} })); |
| 692 | } |
| 693 | |
| 671 | 694 | /// std.mem.eql heavily optimized for slices of bytes. |
| 672 | 695 | fn eqlBytes(a: []const u8, b: []const u8) bool { |
| 673 | 696 | comptime assert(eqlBytes_allowed); |
| ... | ... | @@ -3292,12 +3315,6 @@ test concat { |
| 3292 | 3315 | } |
| 3293 | 3316 | } |
| 3294 | 3317 | |
| 3295 | | test eql { |
| 3296 | | try testing.expect(eql(u8, "abcd", "abcd")); |
| 3297 | | try testing.expect(!eql(u8, "abcdef", "abZdef")); |
| 3298 | | try testing.expect(!eql(u8, "abcdefg", "abcdef")); |
| 3299 | | } |
| 3300 | | |
| 3301 | 3318 | fn moreReadIntTests() !void { |
| 3302 | 3319 | { |
| 3303 | 3320 | const bytes = [_]u8{ |