Skip to content

Commit b4f7df5

Browse files
authored
Add RevString from Base (#22)
1 parent 652bab9 commit b4f7df5

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

src/LegacyStrings.jl

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export
99
ByteString,
1010
ASCIIString,
1111
RepString,
12+
RevString,
1213
UTF8String,
1314
UTF16String,
1415
UTF32String,
@@ -104,4 +105,10 @@ using Compat
104105
else
105106
include("rep.jl")
106107
end
108+
109+
if isdefined(Base, :RevString)
110+
using Base: RevString
111+
else
112+
include("rev.jl")
113+
end
107114
end # module

src/rev.jl

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# This file includes code that was formerly a part of Julia. License is MIT: https://julialang.org/license
2+
3+
## reversed strings without data movement ##
4+
5+
immutable RevString{T<:AbstractString} <: AbstractString
6+
string::T
7+
end
8+
9+
endof(s::RevString) = endof(s.string)
10+
length(s::RevString) = length(s.string)
11+
sizeof(s::RevString) = sizeof(s.string)
12+
13+
function next(s::RevString, i::Int)
14+
n = endof(s); j = n-i+1
15+
(s.string[j], n-prevind(s.string,j)+1)
16+
end
17+
18+
reverse(s::RevString) = s.string
19+
reverseind(s::RevString, i::Integer) = endof(s) - i + 1

test/runtests.jl

+28
Original file line numberDiff line numberDiff line change
@@ -550,3 +550,31 @@ let
550550
@test srep[7] == 'β'
551551
@test_throws BoundsError srep[8]
552552
end
553+
554+
555+
## Reverse strings ##
556+
557+
let
558+
rs = RevString("foobar")
559+
@test length(rs) == 6
560+
@test sizeof(rs) == 6
561+
@test isascii(rs)
562+
563+
# Base issue #4586
564+
@test rsplit(RevString("ailuj"),'l') == ["ju","ia"]
565+
@test parse(Float64,RevString("64")) === 46.0
566+
567+
# reverseind
568+
for prefix in ("", "abcd", "\U0001d6a4\U0001d4c1", "\U0001d6a4\U0001d4c1c", " \U0001d6a4\U0001d4c1")
569+
for suffix in ("", "abcde", "\U0001d4c1β\U0001d6a4", "\U0001d4c1β\U0001d6a4c", " \U0001d4c1β\U0001d6a4")
570+
for c in ('X', 'δ', '\U0001d6a5')
571+
s = convert(String, string(prefix, c, suffix))
572+
rs = RevString(s)
573+
r = reverse(s)
574+
@test r == rs
575+
ri = search(r, c)
576+
@test c == s[reverseind(s, ri)] == r[ri]
577+
end
578+
end
579+
end
580+
end

0 commit comments

Comments
 (0)