difftreelog
perf implement std.findSubstr in native
in: master
4 files changed
Cargo.tomldiffbeforeafterboth8opt-level = 38opt-level = 39lto = "fat"9lto = "fat"10codegen-units = 110codegen-units = 111# debug = 011debug = 012panic = "abort"12panic = "abort"13# strip = true13strip = true1414crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth206 pub fn new_eager() -> Self {206 pub fn new_eager() -> Self {207 Self::Eager(Cc::new(Vec::new()))207 Self::Eager(Cc::new(Vec::new()))208 }208 }209 pub fn empty() -> Self {210 Self::new_range(0, 0)211 }209212210 /// # Panics213 /// # Panics211 /// If a > b214 /// If a > b215 #[inline]212 pub fn new_range(a: i32, b: i32) -> Self {216 pub fn new_range(a: i32, b: i32) -> Self {213 assert!(a <= b);217 assert!(a <= b);214 Self::Range(a, b)218 Self::Range(a, b)crates/jrsonnet-stdlib/src/lib.rsdiffbeforeafterboth128 ("splitLimit".into(), builtin_splitlimit::INST),128 ("splitLimit".into(), builtin_splitlimit::INST),129 ("asciiUpper".into(), builtin_ascii_upper::INST),129 ("asciiUpper".into(), builtin_ascii_upper::INST),130 ("asciiLower".into(), builtin_ascii_lower::INST),130 ("asciiLower".into(), builtin_ascii_lower::INST),131 ("findSubstr".into(), builtin_find_substr::INST),131 ]132 ]132 .iter()133 .iter()133 .cloned()134 .cloned()421 Ok(str.to_ascii_lowercase())422 Ok(str.to_ascii_lowercase())422}423}424425#[builtin]426fn builtin_find_substr(pat: IStr, str: IStr) -> Result<ArrValue> {427 if pat.is_empty() || str.is_empty() || pat.len() > str.len() {428 return Ok(ArrValue::empty());429 }430431 let str = str.as_str();432 let pat = pat.as_bytes();433 let strb = str.as_bytes();434435 let max_pos = str.len() - pat.len();436437 let mut out: Vec<Val> = Vec::new();438 for (ch_idx, (i, _)) in str439 .char_indices()440 .take_while(|(i, _)| i <= &max_pos)441 .enumerate()442 {443 if &strb[i..i + pat.len()] == pat {444 out.push(Val::Num(ch_idx as f64))445 }446 }447 Ok(out.into())448}423449crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth477 } else477 } else478 a,478 a,479479480 findSubstr(pat, str)::481 if !std.isString(pat) then482 error 'findSubstr first parameter should be a string, got ' + std.type(pat)483 else if !std.isString(str) then484 error 'findSubstr second parameter should be a string, got ' + std.type(str)485 else486 local pat_len = std.length(pat);487 local str_len = std.length(str);488 if pat_len == 0 || str_len == 0 || pat_len > str_len then489 []490 else491 std.filter(function(i) str[i:i + pat_len] == pat, std.range(0, str_len - pat_len)),492493 find(value, arr)::480 find(value, arr)::494 if !std.isArray(arr) then481 if !std.isArray(arr) then495 error 'find second parameter should be an array, got ' + std.type(arr)482 error 'find second parameter should be an array, got ' + std.type(arr)