From 73204b7ab0161058d7b0927fb82019793dd4dd8a Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Sun, 26 Nov 2017 01:00:41 +0100 Subject: [PATCH] add readfloatorNA!(io, vec::AbstractVector) allows to fix the result of readcomplex() from ReinterpretArray to Vector on 0.7 --- src/io/ASCIIIO.jl | 15 ++++++++------- src/io/XDRIO.jl | 5 +++++ src/readers.jl | 5 +++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/io/ASCIIIO.jl b/src/io/ASCIIIO.jl index 15b72ad..a9f9453 100644 --- a/src/io/ASCIIIO.jl +++ b/src/io/ASCIIIO.jl @@ -24,20 +24,21 @@ readintorNA(io::ASCIIIO, n::RVecLength) = Int32[readintorNA(io) for i in 1:n] # str == R_NA_STRING ? R_NA_FLOAT64 : parse(Float64, str) #end -function readfloatorNA(io::ASCIIIO, n::RVecLength) - res = Vector{Float64}(n) - res_uint = reinterpret(UInt64, res) # alias of res for setting NA - @inbounds for i in 1:n +function readfloatorNA!(io::ASCIIIO, v::AbstractVector{Float64}) + v_uint = reinterpret(UInt64, v) # alias of res for setting NA + @inbounds for i in eachindex(v) str = chomp(readline(io.sub)) if str != R_NA_STRING - res[i] = parse(Float64, str) + v[i] = parse(Float64, str) else - res_uint[i] = R_NA_FLOAT64 # see JuliaStats/RData.jl#5 + v_uint[i] = R_NA_FLOAT64 # see JuliaStats/RData.jl#5 end end - res + v end +readfloatorNA(io::ASCIIIO, n::RVecLength) = readfloatorNA!(io, Vector{Float64}(n)) + readuint8(io::ASCIIIO, n::RVecLength) = UInt8[hex2bytes(chomp(readline(io.sub)))[1] for i in 1:n] # FIXME optimize for speed function readnchars(io::ASCIIIO, n::Int32) # reads N bytes-sized string diff --git a/src/io/XDRIO.jl b/src/io/XDRIO.jl index 3885a00..f8c2dc3 100644 --- a/src/io/XDRIO.jl +++ b/src/io/XDRIO.jl @@ -26,6 +26,11 @@ function readfloatorNA(io::XDRIO, n::RVecLength) map!(ntoh, v, v) end +function readfloatorNA!(io::XDRIO, v::AbstractVector{Float64}) + readbytes!(io.sub, reinterpret(UInt8, v)) + map!(ntoh, v, v) +end + readuint8(io::XDRIO, n::RVecLength) = read(io.sub, UInt8, n) function readnchars(io::XDRIO, n::Int32) # a single character string diff --git a/src/readers.jl b/src/readers.jl index d0e030e..feeea06 100644 --- a/src/readers.jl +++ b/src/readers.jl @@ -38,8 +38,9 @@ end function readcomplex(ctx::RDAContext, fl::RDATag) @assert sxtype(fl) == CPLXSXP n = readlength(ctx.io) - RComplexVector(reinterpret(Complex128, readfloatorNA(ctx.io, 2n)), - readattrs(ctx, fl)) + v = Vector{Complex128}(n) + readfloatorNA!(ctx.io, reinterpret(Float64, v)) + RComplexVector(v, readattrs(ctx, fl)) end function readstring(ctx::RDAContext, fl::RDATag)