Skip to content

Commit 8d8801c

Browse files
authored
Merge pull request #19968 from wooster0/eql
std.mem.eql: make comparisons for zero-sized and non-sized types work
2 parents 5e1a83a + 4e380b8 commit 8d8801c

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

lib/std/mem.zig

+26-9
Original file line numberDiff line numberDiff line change
@@ -654,10 +654,14 @@ const eqlBytes_allowed = switch (builtin.zig_backend) {
654654
else => !builtin.fuzz,
655655
};
656656

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.
658659
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+
}
661665

662666
if (a.len != b.len) return false;
663667
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 {
668672
return true;
669673
}
670674

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+
671694
/// std.mem.eql heavily optimized for slices of bytes.
672695
fn eqlBytes(a: []const u8, b: []const u8) bool {
673696
comptime assert(eqlBytes_allowed);
@@ -3292,12 +3315,6 @@ test concat {
32923315
}
32933316
}
32943317

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-
33013318
fn moreReadIntTests() !void {
33023319
{
33033320
const bytes = [_]u8{

0 commit comments

Comments
 (0)