Skip to content
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

#132 allow users to optionally provide an output buffer when calling transcode #136

Merged
merged 26 commits into from
Apr 9, 2023
Merged
Show file tree
Hide file tree
Changes from 2 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: 4 additions & 3 deletions src/noop.jl
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,11 @@ function Base.transcode(::Type{Noop}, data::ByteData)
return transcode(Noop(), data)
end

function Base.transcode(::Noop, data::ByteData)
# Copy data because the caller may expect the return object is not the same
function Base.transcode(codec::Noop, input::Buffer, output::Buffer = Buffer(Vector{UInt8}()))
# copy data because the caller may expect the return object is not the same
# as from the input.
return Vector{UInt8}(data)
copydata!(output, bufferptr(input), length(input))
return output.data
end


Expand Down
28 changes: 21 additions & 7 deletions src/transcode.jl
baumgold marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# =========

"""
transcode(::Type{C}, data::Vector{UInt8})::Vector{UInt8} where C<:Codec
transcode(::Type{C}, data::ByteData)::ByteData where {C<:Codec}
baumgold marked this conversation as resolved.
Show resolved Hide resolved

Transcode `data` by applying a codec `C()`.

Expand All @@ -27,7 +27,7 @@ julia> String(decompressed)

```
"""
function Base.transcode(::Type{C}, data::ByteData) where C<:Codec
function Base.transcode(::Type{C}, data::ByteData) where {C<:Codec}
baumgold marked this conversation as resolved.
Show resolved Hide resolved
codec = C()
initialize(codec)
try
Expand All @@ -38,10 +38,12 @@ function Base.transcode(::Type{C}, data::ByteData) where C<:Codec
end

"""
transcode(codec::Codec, data::Vector{UInt8})::Vector{UInt8}
transcode(codec::Codec, data::Union{ByteData, Buffer}[, output::Union{ByteData, Buffer}])::ByteData
baumgold marked this conversation as resolved.
Show resolved Hide resolved

Transcode `data` by applying `codec`.

If `output` is unspecified, then this method will allocate it.

Note that this method does not initialize or finalize `codec`. This is
efficient when you transcode a number of pieces of data, but you need to call
[`TranscodingStreams.initialize`](@ref) and
Expand All @@ -59,7 +61,9 @@ julia> codec = ZlibCompressor();

julia> TranscodingStreams.initialize(codec)

julia> compressed = transcode(codec, data);
julia> compressed = Vector{UInt8}()

julia> transcode(codec, data, compressed);

julia> TranscodingStreams.finalize(codec)

Expand All @@ -76,9 +80,11 @@ julia> String(decompressed)

```
"""
baumgold marked this conversation as resolved.
Show resolved Hide resolved
function Base.transcode(codec::Codec, data::ByteData)
input = Buffer(data)
output = Buffer(initial_output_size(codec, buffermem(input)))
function Base.transcode(
baumgold marked this conversation as resolved.
Show resolved Hide resolved
codec::Codec,
input::Buffer,
output::Buffer = Buffer(initial_output_size(codec, buffermem(input))),
)
baumgold marked this conversation as resolved.
Show resolved Hide resolved
error = Error()
code = startproc(codec, :write, error)
if code === :error
Expand Down Expand Up @@ -121,6 +127,14 @@ function Base.transcode(codec::Codec, data::ByteData)
throw(error[])
end

Base.transcode(codec::Codec, data::ByteData, output::ByteData) =
transcode(codec, data, Buffer(output))

Base.transcode(codec::Codec, data::ByteData) = transcode(codec, Buffer(data))
baumgold marked this conversation as resolved.
Show resolved Hide resolved

Base.transcode(codec::Codec, data::ByteData, output::Buffer) =
baumgold marked this conversation as resolved.
Show resolved Hide resolved
transcode(codec, Buffer(data), output)
baumgold marked this conversation as resolved.
Show resolved Hide resolved

# Return the initial output buffer size.
function initial_output_size(codec::Codec, input::Memory)
return max(
Expand Down
17 changes: 17 additions & 0 deletions test/codecnoop.jl
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,26 @@
data = b""
@test transcode(Noop(), data) == data
@test transcode(Noop(), data) !== data
@test transcode(Noop(), data, Vector{UInt8}()) == data
@test transcode(Noop(), data, TranscodingStreams.Buffer(Vector{UInt8}())) == data
@test transcode(Noop(), data, Vector{UInt8}()) !== data
@test transcode(Noop(), data, TranscodingStreams.Buffer(Vector{UInt8}())) !== data
output = Vector{UInt8}()
@test transcode(Noop(), data, output) === output
output = TranscodingStreams.Buffer(Vector{UInt8}())
@test transcode(Noop(), data, output) === output.data

data = b"foo"
@test transcode(Noop(), data) == data
@test transcode(Noop(), data) !== data
@test transcode(Noop(), data, Vector{UInt8}()) == data
@test transcode(Noop(), data, TranscodingStreams.Buffer(Vector{UInt8}())) == data
@test transcode(Noop(), data, Vector{UInt8}()) !== data
@test transcode(Noop(), data, TranscodingStreams.Buffer(Vector{UInt8}())) !== data
output = Vector{UInt8}()
@test transcode(Noop(), data, output) === output
output = TranscodingStreams.Buffer(Vector{UInt8}())
@test transcode(Noop(), data, output) === output.data

TranscodingStreams.test_roundtrip_transcode(Noop, Noop)
TranscodingStreams.test_roundtrip_read(NoopStream, NoopStream)
Expand Down