Skip to content

Commit

Permalink
std: add containsAtLeastScalar to mem (#22826)
Browse files Browse the repository at this point in the history
  • Loading branch information
LmanTW authored Feb 15, 2025
1 parent 8a3aeba commit 13ad984
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions lib/std/mem.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1611,6 +1611,8 @@ test count {
/// Returns true if the haystack contains expected_count or more needles
/// needle.len must be > 0
/// does not count overlapping needles
//
/// See also: `containsAtLeastScalar`
pub fn containsAtLeast(comptime T: type, haystack: []const T, expected_count: usize, needle: []const T) bool {
assert(needle.len > 0);
if (expected_count == 0) return true;
Expand Down Expand Up @@ -1642,6 +1644,34 @@ test containsAtLeast {
try testing.expect(!containsAtLeast(u8, " radar radar ", 3, "radar"));
}

/// Returns true if the haystack contains expected_count or more needles
//
/// See also: `containsAtLeast`
pub fn containsAtLeastScalar(comptime T: type, haystack: []const T, expected_count: usize, needle: T) bool {
if (expected_count == 0) return true;

var found: usize = 0;

for (haystack) |item| {
if (item == needle) {
found += 1;
if (found == expected_count) return true;
}
}

return false;
}

test containsAtLeastScalar {
try testing.expect(containsAtLeastScalar(u8, "aa", 0, 'a'));
try testing.expect(containsAtLeastScalar(u8, "aa", 1, 'a'));
try testing.expect(containsAtLeastScalar(u8, "aa", 2, 'a'));
try testing.expect(!containsAtLeastScalar(u8, "aa", 3, 'a'));

try testing.expect(containsAtLeastScalar(u8, "adadda", 3, 'd'));
try testing.expect(!containsAtLeastScalar(u8, "adadda", 4, 'd'));
}

/// Reads an integer from memory with size equal to bytes.len.
/// T specifies the return type, which must be large enough to store
/// the result.
Expand Down

0 comments on commit 13ad984

Please sign in to comment.