Skip to content

Add RevString from Base #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 5, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/LegacyStrings.jl
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@ export
ByteString,
ASCIIString,
RepString,
RevString,
UTF8String,
UTF16String,
UTF32String,
@@ -104,4 +105,10 @@ using Compat
else
include("rep.jl")
end

if isdefined(Base, :RevString)
using Base: RevString
else
include("rev.jl")
end
end # module
19 changes: 19 additions & 0 deletions src/rev.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# This file includes code that was formerly a part of Julia. License is MIT: https://julialang.org/license

## reversed strings without data movement ##

immutable RevString{T<:AbstractString} <: AbstractString
string::T
end

endof(s::RevString) = endof(s.string)
length(s::RevString) = length(s.string)
sizeof(s::RevString) = sizeof(s.string)

function next(s::RevString, i::Int)
n = endof(s); j = n-i+1
(s.string[j], n-prevind(s.string,j)+1)
end

reverse(s::RevString) = s.string
reverseind(s::RevString, i::Integer) = endof(s) - i + 1
28 changes: 28 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -550,3 +550,31 @@ let
@test srep[7] == 'β'
@test_throws BoundsError srep[8]
end


## Reverse strings ##

let
rs = RevString("foobar")
@test length(rs) == 6
@test sizeof(rs) == 6
@test isascii(rs)

# Base issue #4586
@test rsplit(RevString("ailuj"),'l') == ["ju","ia"]
@test parse(Float64,RevString("64")) === 46.0

# reverseind
for prefix in ("", "abcd", "\U0001d6a4\U0001d4c1", "\U0001d6a4\U0001d4c1c", " \U0001d6a4\U0001d4c1")
for suffix in ("", "abcde", "\U0001d4c1β\U0001d6a4", "\U0001d4c1β\U0001d6a4c", " \U0001d4c1β\U0001d6a4")
for c in ('X', 'δ', '\U0001d6a5')
s = convert(String, string(prefix, c, suffix))
rs = RevString(s)
r = reverse(s)
@test r == rs
ri = search(r, c)
@test c == s[reverseind(s, ri)] == r[ri]
end
end
end
end