Created
August 23, 2021 11:59
-
-
Save Jarred-Sumner/85ddfd0224fd5c2cc3d37ee9ca9ea442 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pub fn eqlComptime(self: string, comptime alt: anytype) bool { | |
switch (comptime alt.len) { | |
0 => { | |
@compileError("Invalid size passed to eqlComptime"); | |
}, | |
2 => { | |
const check = comptime std.mem.readIntNative(u16, alt[0..alt.len]); | |
return self.len == alt.len and std.mem.readIntNative(u16, self[0..2]) == check; | |
}, | |
1, 3 => { | |
if (alt.len != self.len) { | |
return false; | |
} | |
inline for (alt) |c, i| { | |
if (self[i] != c) return false; | |
} | |
return true; | |
}, | |
4 => { | |
const check = comptime std.mem.readIntNative(u32, alt[0..alt.len]); | |
return self.len == alt.len and std.mem.readIntNative(u32, self[0..4]) == check; | |
}, | |
6 => { | |
const first = std.mem.readIntNative(u32, alt[0..4]); | |
const second = std.mem.readIntNative(u16, alt[4..6]); | |
return self.len == alt.len and first == std.mem.readIntNative(u32, self[0..4]) and | |
second == std.mem.readIntNative(u16, self[4..6]); | |
}, | |
5, 7 => { | |
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 => { | |
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 => { | |
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; | |
}, | |
12 => { | |
const first = std.mem.readIntNative(u64, alt[0..8]); | |
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]); | |
}, | |
13...15 => { | |
const first = std.mem.readIntNative(u64, alt[0..8]); | |
const second = std.mem.readIntNative(u32, alt[8..12]); | |
if (self.len != alt.len or first != std.mem.readIntNative(u64, self[0..8]) or second != std.mem.readIntNative(u32, self[8..12])) { | |
return false; | |
} | |
inline for (alt[13..]) |c, i| { | |
if (self[i + 13] != c) return false; | |
} | |
return true; | |
}, | |
16 => { | |
const first = std.mem.readIntNative(u64, alt[0..8]); | |
const second = std.mem.readIntNative(u64, alt[8..15]); | |
return (self.len == alt.len) and first == std.mem.readIntNative(u64, self[0..8]) and second == std.mem.readIntNative(u64, self[8..16]); | |
}, | |
else => { | |
@compileError(alt ++ " is too long."); | |
}, | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment