make var string return var char w/ BackwardsIndex (#15461)
* make var string return var char w/ BackwardsIndex fixes #14497 * work around VM bug * properly workaround again
This commit is contained in:
parent
ef2677f5f3
commit
527e792827
3 changed files with 11 additions and 3 deletions
|
|
@ -69,7 +69,7 @@ proc addNormalizePath*(x: string; result: var string; state: var int;
|
||||||
while hasNext(it, x):
|
while hasNext(it, x):
|
||||||
let b = next(it, x)
|
let b = next(it, x)
|
||||||
if (state shr 1 == 0) and isSlash(x, b):
|
if (state shr 1 == 0) and isSlash(x, b):
|
||||||
if result.len == 0 or result[^1] notin {DirSep, AltSep}:
|
if result.len == 0 or result[result.len - 1] notin {DirSep, AltSep}:
|
||||||
result.add dirSep
|
result.add dirSep
|
||||||
state = state or 1
|
state = state or 1
|
||||||
elif isDotDot(x, b):
|
elif isDotDot(x, b):
|
||||||
|
|
@ -87,13 +87,13 @@ proc addNormalizePath*(x: string; result: var string; state: var int;
|
||||||
setLen(result, d-1)
|
setLen(result, d-1)
|
||||||
dec state, 2
|
dec state, 2
|
||||||
else:
|
else:
|
||||||
if result.len > 0 and result[^1] notin {DirSep, AltSep}:
|
if result.len > 0 and result[result.len - 1] notin {DirSep, AltSep}:
|
||||||
result.add dirSep
|
result.add dirSep
|
||||||
result.add substr(x, b[0], b[1])
|
result.add substr(x, b[0], b[1])
|
||||||
elif isDot(x, b):
|
elif isDot(x, b):
|
||||||
discard "discard the dot"
|
discard "discard the dot"
|
||||||
elif b[1] >= b[0]:
|
elif b[1] >= b[0]:
|
||||||
if result.len > 0 and result[^1] notin {DirSep, AltSep}:
|
if result.len > 0 and result[result.len - 1] notin {DirSep, AltSep}:
|
||||||
result.add dirSep
|
result.add dirSep
|
||||||
result.add substr(x, b[0], b[1])
|
result.add substr(x, b[0], b[1])
|
||||||
inc state, 2
|
inc state, 2
|
||||||
|
|
|
||||||
|
|
@ -2579,6 +2579,7 @@ proc `[]`*[T](s: var openArray[T]; i: BackwardsIndex): var T {.inline.} =
|
||||||
system.`[]`(s, s.len - int(i))
|
system.`[]`(s, s.len - int(i))
|
||||||
proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline.} =
|
proc `[]`*[Idx, T](a: var array[Idx, T]; i: BackwardsIndex): var T {.inline.} =
|
||||||
a[Idx(a.len - int(i) + int low(a))]
|
a[Idx(a.len - int(i) + int low(a))]
|
||||||
|
proc `[]`*(s: var string; i: BackwardsIndex): var char {.inline.} = s[s.len - int(i)]
|
||||||
|
|
||||||
proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline.} =
|
proc `[]=`*[T](s: var openArray[T]; i: BackwardsIndex; x: T) {.inline.} =
|
||||||
system.`[]=`(s, s.len - int(i), x)
|
system.`[]=`(s, s.len - int(i), x)
|
||||||
|
|
|
||||||
|
|
@ -91,3 +91,10 @@ proc tester[T](x: T) =
|
||||||
|
|
||||||
tester(1)
|
tester(1)
|
||||||
|
|
||||||
|
# #14497
|
||||||
|
func reverse*(a: string): string =
|
||||||
|
result = a
|
||||||
|
for i in 0 ..< a.len div 2:
|
||||||
|
swap(result[i], result[^(i + 1)])
|
||||||
|
|
||||||
|
doAssert reverse("hello") == "olleh"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue