aboutsummaryrefslogtreecommitdiff
path: root/src/string_immutable.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/string_immutable.zig')
-rw-r--r--src/string_immutable.zig60
1 files changed, 44 insertions, 16 deletions
diff --git a/src/string_immutable.zig b/src/string_immutable.zig
index ab19f4dc9..ec233905f 100644
--- a/src/string_immutable.zig
+++ b/src/string_immutable.zig
@@ -97,33 +97,61 @@ pub fn eql(self: string, other: anytype) bool {
}
// I have not actually verified that this makes it faster
// It's probably like 0.0001ms faster
-pub fn eqlComptime(self: string, comptime alt: string) bool {
- comptime var matcher_size: usize = 0;
-
+pub fn eqlComptime(self: string, comptime alt: anytype) bool {
switch (comptime alt.len) {
0 => {
@compileError("Invalid size passed to eqlComptime");
},
- 1...4 => {
- matcher_size = 4;
+ 1...3 => {
+ if (alt.len != self.len) {
+ return false;
+ }
+
+ inline for (alt) |c, i| {
+ if (self[i] != c) return false;
+ }
+ return true;
+ },
+ 4 => {
+ comptime const check = std.mem.readIntNative(u32, alt[0..alt.len]);
+ return self.len == alt.len and std.mem.readIntNative(u32, self[0..4]) == check;
},
- 5...8 => {
- matcher_size = 8;
+ 5...7 => {
+ comptime const check = std.mem.readIntNative(u32, alt[0..4]);
+ if (self.len != alt.len or std.mem.readIntNative(u32, self[0..4]) != check) {
+ return false;
+ }
+ const remainder = self[4..];
+ inline for (alt[4..]) |c, i| {
+ if (remainder[i] != c) return false;
+ }
+ return true;
+ },
+ 8 => {
+ comptime const check = std.mem.readIntNative(u64, alt[0..alt.len]);
+ return self.len == alt.len and std.mem.readIntNative(u64, self[0..8]) == check;
+ },
+ 9...11 => {
+ comptime const first = std.mem.readIntNative(u64, alt[0..8]);
+
+ if (self.len != alt.len or first != std.mem.readIntNative(u64, self[0..8])) {
+ return false;
+ }
+
+ inline for (alt[8..]) |c, i| {
+ if (self[i + 8] != c) return false;
+ }
+ return true;
},
- 8...12 => {
- comptime const FirstMatcher = ExactSizeMatcher(8);
- comptime const SecondMatcher = ExactSizeMatcher(4);
- comptime const first = FirstMatcher.case(alt[0..8]);
- comptime const second = SecondMatcher.case(alt[8..alt.len]);
- return (self.len == alt.len) and first == FirstMatcher.hashUnsafe(self[0..8]) and second == SecondMatcher.match(self[8..self.len]);
+ 12 => {
+ comptime const first = std.mem.readIntNative(u64, alt[0..8]);
+ comptime const second = std.mem.readIntNative(u32, alt[8..12]);
+ return (self.len == alt.len) and first == std.mem.readIntNative(u64, self[0..8]) and second == std.mem.readIntNative(u32, self[8..12]);
},
else => {
@compileError(alt ++ " is too long.");
},
}
- comptime const Matcher = ExactSizeMatcher(matcher_size);
- comptime const alt_hash = Matcher.case(alt);
- return Matcher.match(self) == alt_hash;
}
pub fn append(allocator: *std.mem.Allocator, self: string, other: string) !string {