From 0a5c14d8aefb1e8edaf7b2dad66ecde468c6741e Mon Sep 17 00:00:00 2001 From: Alexey Stukalov Date: Tue, 11 Jul 2023 11:24:16 -0700 Subject: [PATCH] add unsafe_read/unsafe_write() --- src/StringEncodings.jl | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/StringEncodings.jl b/src/StringEncodings.jl index 7f49011..824c7c1 100644 --- a/src/StringEncodings.jl +++ b/src/StringEncodings.jl @@ -255,6 +255,22 @@ function write(s::StringEncoder, x::UInt8) 1 end +# Optimized IO implementation +function Base.unsafe_write(s::StringEncoder, p::Ptr{UInt8}, n::UInt) + bytes = unsafe_wrap(Array, p, n) + written = 0 + while n > 0 + if s.inbytesleft[] >= length(s.inbuf) + flush(s) + end + chunksize = min(n, length(s.inbuf) - s.inbytesleft[]) + copyto!(s.inbuf, s.inbytesleft[]+1, bytes, written+1, chunksize) + s.inbytesleft[] += chunksize + written += chunksize + n -= chunksize + end + return written +end ## StringDecoder @@ -428,6 +444,12 @@ function readbytes!(s::StringDecoder, b::AbstractArray{UInt8}, nb=length(b)) return nr end +# Optimized IO implementation +function Base.unsafe_read(s::StringDecoder, p::Ptr{UInt8}, n::UInt) + readbytes!(s, unsafe_wrap(Array, p, n)) + nothing +end + """ read(stream::IO, [nb::Integer,] enc::Encoding) read(filename::AbstractString, [nb::Integer,] enc::Encoding)