Skip to content

Commit 8a36482

Browse files
committed
Add reverseind() for AbstractString, re-enable tests with GenericString
reverse() for GenericString/AbstractString returns a RevString, whose indexing behavior is very different from a reverse()'d String which is returned for String. Thus, calling reverseind() on the underlying String object is not correct for GenericString. Add a generic but O(n) method for AbstractString and use it for GenericString.
1 parent 42dd730 commit 8a36482

File tree

4 files changed

+28
-31
lines changed

4 files changed

+28
-31
lines changed

base/strings/string.jl

+1-3
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function first_utf8_byte(ch::Char)
105105
end
106106

107107
function reverseind(s::String, i::Integer)
108-
j = lastidx(s) + 1 - i
108+
j = length(s.data) + 1 - i
109109
d = s.data
110110
while is_valid_continuation(d[j])
111111
j -= 1
@@ -117,8 +117,6 @@ end
117117

118118
sizeof(s::String) = sizeof(s.data)
119119

120-
lastidx(s::String) = length(s.data)
121-
122120
isvalid(s::String, i::Integer) =
123121
(1 <= i <= endof(s.data)) && !is_valid_continuation(s.data[i])
124122

base/strings/types.jl

+3-4
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,11 @@ reverse(s::RevString) = s.string
118118

119119
## reverse an index i so that reverse(s)[i] == s[reverseind(s,i)]
120120

121+
reverseind(s::AbstractString, i) = chr2ind(s, length(s) + 1 - ind2chr(reverse(s), i))
121122
reverseind(s::Union{DirectIndexString,SubString{DirectIndexString}}, i::Integer) = length(s) + 1 - i
122123
reverseind(s::RevString, i::Integer) = endof(s) - i + 1
123-
lastidx(s::AbstractString) = nextind(s, endof(s)) - 1
124-
lastidx(s::DirectIndexString) = length(s)
125-
reverseind(s::SubString, i::Integer) =
126-
reverseind(s.string, lastidx(s.string)-s.offset-s.endof+i) - s.offset
124+
reverseind(s::SubString{String}, i::Integer) =
125+
reverseind(s.string, nextind(s.string, endof(s.string))-s.offset-s.endof+i-1) - s.offset
127126

128127
## efficient representation of repeated strings ##
129128

base/test.jl

-1
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,5 @@ end
10111011
Base.convert(::Type{GenericString}, s::AbstractString) = GenericString(s)
10121012
Base.endof(s::GenericString) = endof(s.string)
10131013
Base.next(s::GenericString, i::Int) = next(s.string, i)
1014-
Base.reverseind(s::GenericString, i::Integer) = reverseind(s.string, i)
10151014

10161015
end # module

test/strings/types.jl

+24-23
Original file line numberDiff line numberDiff line change
@@ -163,29 +163,30 @@ rs = RevString("foobar")
163163
@test rsplit(RevString("ailuj"),'l') == ["ju","ia"]
164164
@test parse(Float64,RevString("64")) === 46.0
165165

166-
# # reverseind
167-
# for T in (String, GenericString)
168-
# for prefix in ("", "abcd", "\U0001d6a4\U0001d4c1", "\U0001d6a4\U0001d4c1c", " \U0001d6a4\U0001d4c1")
169-
# for suffix in ("", "abcde", "\U0001d4c1β\U0001d6a4", "\U0001d4c1β\U0001d6a4c", " \U0001d4c1β\U0001d6a4")
170-
# for c in ('X', 'δ', '\U0001d6a5')
171-
# @show (T,prefix,suffix,c)
172-
# s = convert(T, string(prefix, c, suffix))
173-
# r = convert(T, String(reverse(s)))
174-
# ri = search(r, c)
175-
# @test r == RevString(s)
176-
# @test c == s[reverseind(s, ri)] == r[ri]
177-
# s = RevString(s)
178-
# ri = search(r, c)
179-
# @test c == s[reverseind(s, ri)] == r[ri]
180-
# s = convert(T, string(prefix, prefix, c, suffix, suffix))
181-
# pre = convert(T, prefix)
182-
# sb = SubString(s, nextind(pre, endof(pre)), endof(convert(T, string(prefix, prefix, c, suffix))))
183-
# ri = search(reverse(sb), c)
184-
# @test c == sb[reverseind(sb, ri)] == reverse(sb)[ri]
185-
# end
186-
# end
187-
# end
188-
# end
166+
# reverseind
167+
for T in (String, GenericString)
168+
for prefix in ("", "abcd", "\U0001d6a4\U0001d4c1", "\U0001d6a4\U0001d4c1c", " \U0001d6a4\U0001d4c1")
169+
for suffix in ("", "abcde", "\U0001d4c1β\U0001d6a4", "\U0001d4c1β\U0001d6a4c", " \U0001d4c1β\U0001d6a4")
170+
for c in ('X', 'δ', '\U0001d6a5')
171+
s = convert(T, string(prefix, c, suffix))
172+
r = reverse(s)
173+
ri = search(r, c)
174+
@test r == RevString(s)
175+
@test c == s[reverseind(s, ri)] == r[ri]
176+
s = RevString(s)
177+
r = reverse(s)
178+
ri = search(r, c)
179+
@test c == s[reverseind(s, ri)] == r[ri]
180+
s = convert(T, string(prefix, prefix, c, suffix, suffix))
181+
pre = convert(T, prefix)
182+
sb = SubString(s, nextind(pre, endof(pre)), endof(convert(T, string(prefix, prefix, c, suffix))))
183+
r = reverse(sb)
184+
ri = search(r, c)
185+
@test c == sb[reverseind(sb, ri)] == r[ri]
186+
end
187+
end
188+
end
189+
end
189190

190191
## Repeat strings ##
191192

0 commit comments

Comments
 (0)