avoid to from bytes conversion for some string operations: such conversion is expensive in Backends which has different representation for string and bytes
parent
21a8eab0b7
commit
8fef6b380d
|
@ -68,9 +68,11 @@ let concat sep = function
|
||||||
0 sep seplen l
|
0 sep seplen l
|
||||||
|
|
||||||
let iter f s =
|
let iter f s =
|
||||||
B.iter f (bos s)
|
for i = 0 to length s - 1 do f (unsafe_get s i) done
|
||||||
|
|
||||||
let iteri f s =
|
let iteri f s =
|
||||||
B.iteri f (bos s)
|
for i = 0 to length s - 1 do f i (unsafe_get s i) done
|
||||||
|
|
||||||
let map f s =
|
let map f s =
|
||||||
B.map f (bos s) |> bts
|
B.map f (bos s) |> bts
|
||||||
let mapi f s =
|
let mapi f s =
|
||||||
|
@ -103,28 +105,55 @@ let escaped s =
|
||||||
else
|
else
|
||||||
s
|
s
|
||||||
|
|
||||||
let index s c =
|
let rec index_rec s lim i c =
|
||||||
B.index (bos s) c
|
if i >= lim then raise Not_found else
|
||||||
|
if unsafe_get s i = c then i else index_rec s lim (i + 1) c
|
||||||
|
|
||||||
|
let index s c = index_rec s (length s) 0 c
|
||||||
|
|
||||||
let index_opt s c =
|
let index_opt s c =
|
||||||
B.index_opt (bos s) c
|
B.index_opt (bos s) c
|
||||||
let rindex s c =
|
|
||||||
B.rindex (bos s) c
|
let rec rindex_rec s i c =
|
||||||
|
if i < 0 then raise Not_found else
|
||||||
|
if unsafe_get s i = c then i else rindex_rec s (i - 1) c
|
||||||
|
|
||||||
|
let rindex s c = rindex_rec s (length s - 1) c
|
||||||
|
|
||||||
let rindex_opt s c =
|
let rindex_opt s c =
|
||||||
B.rindex_opt (bos s) c
|
B.rindex_opt (bos s) c
|
||||||
let index_from s i c=
|
|
||||||
B.index_from (bos s) i c
|
let index_from s i c =
|
||||||
|
let l = length s in
|
||||||
|
if i < 0 || i > l then invalid_arg "String.index_from / Bytes.index_from" else
|
||||||
|
index_rec s l i c
|
||||||
|
|
||||||
let index_from_opt s i c=
|
let index_from_opt s i c=
|
||||||
B.index_from_opt (bos s) i c
|
B.index_from_opt (bos s) i c
|
||||||
|
|
||||||
let rindex_from s i c =
|
let rindex_from s i c =
|
||||||
B.rindex_from (bos s) i c
|
if i < -1 || i >= length s then
|
||||||
|
invalid_arg "String.rindex_from / Bytes.rindex_from"
|
||||||
|
else
|
||||||
|
rindex_rec s i c
|
||||||
|
|
||||||
let rindex_from_opt s i c =
|
let rindex_from_opt s i c =
|
||||||
B.rindex_from_opt (bos s) i c
|
B.rindex_from_opt (bos s) i c
|
||||||
let contains s c =
|
|
||||||
B.contains (bos s) c
|
|
||||||
let contains_from s i c =
|
let contains_from s i c =
|
||||||
B.contains_from (bos s) i c
|
let l = length s in
|
||||||
|
if i < 0 || i > l then
|
||||||
|
invalid_arg "String.contains_from / Bytes.contains_from"
|
||||||
|
else
|
||||||
|
try ignore (index_rec s l i c); true with Not_found -> false
|
||||||
|
|
||||||
|
let contains s c = contains_from s 0 c
|
||||||
|
|
||||||
let rcontains_from s i c =
|
let rcontains_from s i c =
|
||||||
B.rcontains_from (bos s) i c
|
if i < 0 || i >= length s then
|
||||||
|
invalid_arg "String.rcontains_from / Bytes.rcontains_from"
|
||||||
|
else
|
||||||
|
try ignore (rindex_rec s i c); true with Not_found -> false
|
||||||
|
|
||||||
let uppercase_ascii s =
|
let uppercase_ascii s =
|
||||||
B.uppercase_ascii (bos s) |> bts
|
B.uppercase_ascii (bos s) |> bts
|
||||||
|
|
Loading…
Reference in New Issue