improve fast returns of find and rfind (#18127)
This commit is contained in:
parent
18b4774311
commit
064fe18de6
2 changed files with 31 additions and 1 deletions
|
|
@ -1890,7 +1890,7 @@ func find*(s, sub: string, start: Natural = 0, last = 0): int {.rtl,
|
||||||
## See also:
|
## See also:
|
||||||
## * `rfind func<#rfind,string,string,Natural>`_
|
## * `rfind func<#rfind,string,string,Natural>`_
|
||||||
## * `replace func<#replace,string,string,string>`_
|
## * `replace func<#replace,string,string,string>`_
|
||||||
if sub.len > s.len: return -1
|
if sub.len > s.len - start: return -1
|
||||||
if sub.len == 1: return find(s, sub[0], start, last)
|
if sub.len == 1: return find(s, sub[0], start, last)
|
||||||
|
|
||||||
template useSkipTable {.dirty.} =
|
template useSkipTable {.dirty.} =
|
||||||
|
|
@ -1967,6 +1967,8 @@ func rfind*(s, sub: string, start: Natural = 0, last = -1): int {.rtl,
|
||||||
## * `find func<#find,string,string,Natural,int>`_
|
## * `find func<#find,string,string,Natural,int>`_
|
||||||
if sub.len == 0:
|
if sub.len == 0:
|
||||||
return -1
|
return -1
|
||||||
|
if sub.len > s.len - start:
|
||||||
|
return -1
|
||||||
let last = if last == -1: s.high else: last
|
let last = if last == -1: s.high else: last
|
||||||
result = 0
|
result = 0
|
||||||
for i in countdown(last - sub.len + 1, start):
|
for i in countdown(last - sub.len + 1, start):
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,34 @@ template main() =
|
||||||
doAssert "/1/2/3".rfind('/', last=1) == 0
|
doAssert "/1/2/3".rfind('/', last=1) == 0
|
||||||
doAssert "/1/2/3".rfind('0') == -1
|
doAssert "/1/2/3".rfind('0') == -1
|
||||||
|
|
||||||
|
block:
|
||||||
|
const haystack: string = "ABCABABABABCAB"
|
||||||
|
doAssert haystack.len == 14
|
||||||
|
doAssert haystack.rfind("ABC") == 9
|
||||||
|
doAssert haystack.rfind("ABC", last=13) == 9
|
||||||
|
doAssert haystack.rfind("ABC", last=12) == 9
|
||||||
|
doAssert haystack.rfind("ABC", last=11) == 9
|
||||||
|
doAssert haystack.rfind("ABC", last=10) == 0
|
||||||
|
|
||||||
|
doAssert haystack.rfind("ABC", start=0) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=1) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=2) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=9) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=10) == -1
|
||||||
|
doAssert haystack.rfind("ABC", start=11) == -1
|
||||||
|
doAssert haystack.rfind("ABC", start=12) == -1
|
||||||
|
|
||||||
|
doAssert haystack.rfind("ABC", start=0, last=13) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=0, last=12) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=0, last=11) == 9
|
||||||
|
doAssert haystack.rfind("ABC", start=0, last=10) == 0
|
||||||
|
doAssert haystack.rfind("ABC", start=1, last=10) == -1
|
||||||
|
|
||||||
|
doAssert "".rfind("/") == -1
|
||||||
|
doAssert "/".rfind("/") == 0
|
||||||
|
doAssert "/".rfind("//") == -1
|
||||||
|
doAssert "///".rfind("//", start=3) == -1
|
||||||
|
|
||||||
block: # trimZeros
|
block: # trimZeros
|
||||||
var x = "1200"
|
var x = "1200"
|
||||||
x.trimZeros()
|
x.trimZeros()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue