-
Notifications
You must be signed in to change notification settings - Fork 10
/
__str_methods.rs
76 lines (62 loc) · 1.89 KB
/
__str_methods.rs
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
mod str_replace;
pub use self::str_replace::{ReplaceInput, ReplaceInputConv};
mod str_repeat;
pub use str_repeat::StrRepeatArgs;
mod str_splice;
pub use str_splice::{DecomposedString, SplicedStr, StrSplceArgsConv, StrSpliceArgs};
mod str_indexing;
pub use str_indexing::{IndexValidity, StrIndexArgs, StrIndexArgsConv};
#[cfg(feature = "rust_1_64")]
mod str_split;
#[cfg(feature = "rust_1_64")]
pub use str_split::{SplitInput, SplitInputConv};
mod pattern;
use pattern::{Pattern, PatternCtor, PatternNorm};
mod ascii_byte {
#[derive(Copy, Clone)]
pub struct AsciiByte(u8);
impl AsciiByte {
#[inline(always)]
pub const fn new(byte: u8) -> Self {
if byte > 127 {
let byte = byte as usize;
let _: () = [/* byte isn't valid ascii */][byte];
loop {}
}
Self(byte)
}
#[inline(always)]
pub const fn get(self) -> u8 {
self.0
}
}
}
pub use ascii_byte::AsciiByte;
// copied from the konst crate, if that implementation is wrong, this needs to be fixed
const fn bytes_find(left: &[u8], right: &[u8], from: usize) -> Option<usize> {
let mut matching = right;
__for_range! {i in from..left.len() =>
match matching {
[mb, m_rem @ ..] => {
let b = left[i];
matching = if b == *mb {
m_rem
} else {
match right {
// For when the string is "lawlawn" and we are trying to find "lawn"
[mb2, m_rem2 @ ..] if b == *mb2 => m_rem2,
_ => right,
}
};
}
[] => {
return Some(i - right.len())
}
}
}
if matching.is_empty() {
Some(left.len() - right.len())
} else {
None
}
}