mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 14:48:47 +00:00
improve strings.index_multi
There's no point searching for substrings after lowest_index, so let's not. This significantly improves performance on long strings.
This commit is contained in:
@@ -1872,7 +1872,8 @@ index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) {
|
|||||||
lowest_index := len(s)
|
lowest_index := len(s)
|
||||||
found := false
|
found := false
|
||||||
for substr in substrs {
|
for substr in substrs {
|
||||||
if i := index(s, substr); i >= 0 {
|
haystack := s[:min(len(s), lowest_index + len(substr))]
|
||||||
|
if i := index(haystack, substr); i >= 0 {
|
||||||
if i < lowest_index {
|
if i < lowest_index {
|
||||||
lowest_index = i
|
lowest_index = i
|
||||||
width = len(substr)
|
width = len(substr)
|
||||||
|
|||||||
@@ -40,6 +40,25 @@ test_last_index_any_small_string_not_found :: proc(t: ^testing.T) {
|
|||||||
testing.expect(t, index == -1, "last_index_any should be -1")
|
testing.expect(t, index == -1, "last_index_any should be -1")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test
|
||||||
|
test_index_multi_overlapping_substrs :: proc(t: ^testing.T) {
|
||||||
|
index, width := strings.index_multi("some example text", {"ample", "exam"})
|
||||||
|
testing.expect_value(t, index, 5)
|
||||||
|
testing.expect_value(t, width, 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
@test
|
||||||
|
test_index_multi_not_found :: proc(t: ^testing.T) {
|
||||||
|
index, width := strings.index_multi("some example text", {"ey", "tey"})
|
||||||
|
testing.expect_value(t, index, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
@test
|
||||||
|
test_index_multi_with_empty_string :: proc(t: ^testing.T) {
|
||||||
|
index, width := strings.index_multi("some example text", {"ex", ""})
|
||||||
|
testing.expect_value(t, index, -1)
|
||||||
|
}
|
||||||
|
|
||||||
Cut_Test :: struct {
|
Cut_Test :: struct {
|
||||||
input: string,
|
input: string,
|
||||||
offset: int,
|
offset: int,
|
||||||
|
|||||||
Reference in New Issue
Block a user