Skip to content

Commit ebabeb4

Browse files
committed
add total_in and total_out
1 parent 996d4b7 commit ebabeb4

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

src/buffer.jl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,21 @@
1717
# `markpos` ≤ `bufferpos` ≤ `marginpos` must hold whenever possible.
1818

1919
mutable struct Buffer
20+
# data and positions (see above)
2021
data::Vector{UInt8}
2122
markpos::Int
2223
bufferpos::Int
2324
marginpos::Int
2425

26+
# the number of total bytes passed through this buffer
27+
total::Int64
28+
2529
function Buffer(size::Integer)
26-
return new(Vector{UInt8}(size), 0, 1, 1)
30+
return new(Vector{UInt8}(size), 0, 1, 1, 0)
2731
end
2832

2933
function Buffer(data::Vector{UInt8})
30-
return new(data, 0, 1, length(data)+1)
34+
return new(data, 0, 1, length(data)+1, 0)
3135
end
3236
end
3337

@@ -82,6 +86,7 @@ end
8286
function writebyte!(buf::Buffer, b::UInt8)
8387
buf.data[buf.marginpos] = b
8488
buf.marginpos += 1
89+
buf.total += 1
8590
return 1
8691
end
8792

@@ -167,6 +172,7 @@ end
167172
function initbuffer!(buf::Buffer)
168173
buf.markpos = 0
169174
buf.bufferpos = buf.marginpos = 1
175+
buf.total = 0
170176
return buf
171177
end
172178

@@ -189,6 +195,7 @@ function readdata!(input::IO, output::Buffer)
189195
Base.unsafe_read(input, marginptr(output), n)
190196
output.marginpos += n
191197
nread += n
198+
output.total += nread
192199
return nread
193200
end
194201

src/stream.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ function Base.unsafe_write(stream::TranscodingStream, input::Ptr{UInt8}, nbytes:
251251
unsafe_copy!(marginptr(buffer1), p, m)
252252
p += m
253253
buffer1.marginpos += m
254+
buffer1.total += m
254255
end
255256
return Int(p - input)
256257
end
@@ -322,6 +323,32 @@ function Base.transcode(codec::Codec, data::Vector{UInt8})
322323
end
323324

324325

326+
# Utils
327+
# -----
328+
329+
function total_in(stream::TranscodingStream)::Int64
330+
state = stream.state
331+
if state.state == :read
332+
return state.buffer2.total
333+
elseif state.state == :write
334+
return state.buffer1.total
335+
else
336+
return zero(Int64)
337+
end
338+
end
339+
340+
function total_out(stream::TranscodingStream)::Int64
341+
state = stream.state
342+
if state.state == :read
343+
return state.buffer1.total
344+
elseif state.state == :write
345+
return state.buffer2.total
346+
else
347+
return zero(Int64)
348+
end
349+
end
350+
351+
325352
# Buffering
326353
# ---------
327354

@@ -347,6 +374,7 @@ function fillbuffer(stream::TranscodingStream)
347374
Δin, Δout, stream.state.code = process(stream.codec, buffermem(buffer2), marginmem(buffer1))
348375
buffer2.bufferpos += Δin
349376
buffer1.marginpos += Δout
377+
buffer1.total += Δout
350378
nfilled += Δout
351379
end
352380
return nfilled
@@ -395,6 +423,7 @@ function process_to_write(stream::TranscodingStream)
395423
Δin, Δout, stream.state.code = process(stream.codec, buffermem(buffer1), marginmem(buffer2))
396424
buffer1.bufferpos += Δin
397425
buffer2.marginpos += Δout
426+
buffer2.total += Δout
398427
makemargin!(buffer1, 0)
399428
return Δin
400429
end

test/runtests.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@ using Base.Test
121121
@test hash(read(stream)) == hash(data)
122122
@test hash(stream.state.buffer1.data[1:length(data)]) == hash(data)
123123

124+
stream = TranscodingStream(Identity(), IOBuffer(b"foobar"))
125+
@test TranscodingStreams.total_in(stream) === Int64(0)
126+
@test TranscodingStreams.total_out(stream) === Int64(0)
127+
read(stream)
128+
@test TranscodingStreams.total_in(stream) === Int64(6)
129+
@test TranscodingStreams.total_out(stream) === Int64(6)
130+
131+
stream = TranscodingStream(Identity(), IOBuffer())
132+
@test TranscodingStreams.total_in(stream) === Int64(0)
133+
@test TranscodingStreams.total_out(stream) === Int64(0)
134+
write(stream, b"foobar")
135+
flush(stream)
136+
@test TranscodingStreams.total_in(stream) === Int64(6)
137+
@test TranscodingStreams.total_out(stream) === Int64(6)
138+
124139
# transcode
125140
@test transcode(Identity(), b"") == b""
126141
@test transcode(Identity(), b"foo") == b"foo"

0 commit comments

Comments
 (0)