blob: 6c28f25aea2745c462e447e82997adcbe9706999 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
const std = @import("std");
const simd = std.simd;
const testing = std.testing;
/// Returns true if `str` only contains ASCII bytes. Uses SIMD if possible.
pub fn isAsciiOnly(str: []const u8) bool {
const vec_len = simd.suggestVectorLength(u8) orelse return for (str) |b| {
if (b > 127) break false;
} else true;
const Vec = @Vector(vec_len, u8);
var remaining = str;
while (true) {
if (remaining.len < vec_len) return for (remaining) |b| {
if (b > 127) break false;
} else true;
const v1 = remaining[0..vec_len].*;
const v2: Vec = @splat(127);
if (@reduce(.Or, v1 > v2)) return false;
remaining = remaining[vec_len..];
}
return true;
}
test "isAsciiOnly" {
const ascii_only = "Hello, World! 0123456789 !@#$%^&*()_-=+";
try testing.expect(isAsciiOnly(ascii_only));
const not_ascii_only = "Héllo, World! 0123456789 !@#$%^&*()_-=+";
try testing.expect(!isAsciiOnly(not_ascii_only));
}
|