Skip to content

Commit

Permalink
Rename AbstractIOBuffer to IOBufferBase
Browse files Browse the repository at this point in the history
ref discussion at #11554 (comment)
it might be better to rename this to IOBuffer but I'm not sure how to make that work
  • Loading branch information
tkelman committed Jul 12, 2016
1 parent 0e834c5 commit ebff12b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 49 deletions.
4 changes: 3 additions & 1 deletion base/deprecated.jl
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ end

@deprecate bytestring(s::Cstring) unsafe_string(s)
@deprecate bytestring(v::Vector{UInt8}) String(copy(v))
@deprecate bytestring(io::Base.AbstractIOBuffer) String(io)
@deprecate bytestring(io::Base.IOBufferBase) String(io)
@deprecate bytestring(p::Union{Ptr{Int8},Ptr{UInt8}}) unsafe_string(p)
@deprecate bytestring(p::Union{Ptr{Int8},Ptr{UInt8}}, len::Integer) unsafe_string(p,len)
@deprecate bytestring(s::AbstractString...) string(s...)
Expand Down Expand Up @@ -793,6 +793,8 @@ function transpose(x)
return x
end

@deprecate_binding AbstractIOBuffer IOBufferBase

# During the 0.5 development cycle, do not add any deprecations below this line
# To be deprecated in 0.6

Expand Down
90 changes: 45 additions & 45 deletions base/iobuffer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## work with AbstractVector{UInt8} via I/O primitives ##

# Stateful string
type AbstractIOBuffer{T<:AbstractVector{UInt8}} <: IO
type IOBufferBase{T<:AbstractVector{UInt8}} <: IO
data::T # T should support: getindex, setindex!, length, copy!, resize!, and T()
readable::Bool
writable::Bool
Expand All @@ -14,35 +14,35 @@ type AbstractIOBuffer{T<:AbstractVector{UInt8}} <: IO
ptr::Int # read (and maybe write) pointer
mark::Int # reset mark location for ptr (or <0 for no mark)

AbstractIOBuffer(data::T,readable::Bool,writable::Bool,seekable::Bool,append::Bool,maxsize::Int) =
IOBufferBase(data::T,readable::Bool,writable::Bool,seekable::Bool,append::Bool,maxsize::Int) =
new(data,readable,writable,seekable,append,length(data),maxsize,1,-1)
end
typealias IOBuffer AbstractIOBuffer{Vector{UInt8}}
typealias IOBuffer IOBufferBase{Vector{UInt8}}

AbstractIOBuffer{T<:AbstractVector{UInt8}}(data::T, readable::Bool, writable::Bool, seekable::Bool, append::Bool, maxsize::Int) =
AbstractIOBuffer{T}(data, readable, writable, seekable, append, maxsize)
IOBufferBase{T<:AbstractVector{UInt8}}(data::T, readable::Bool, writable::Bool, seekable::Bool, append::Bool, maxsize::Int) =
IOBufferBase{T}(data, readable, writable, seekable, append, maxsize)

# IOBuffers behave like Files. They are typically readable and writable. They are seekable. (They can be appendable).
IOBuffer(data::AbstractVector{UInt8}, readable::Bool=true, writable::Bool=false, maxsize::Int=typemax(Int)) =
AbstractIOBuffer(data, readable, writable, true, false, maxsize)
IOBufferBase(data, readable, writable, true, false, maxsize)
IOBuffer(readable::Bool, writable::Bool) = IOBuffer(UInt8[], readable, writable)
IOBuffer() = IOBuffer(true, true)
IOBuffer(maxsize::Int) = (x=IOBuffer(Array{UInt8}(maxsize), true, true, maxsize); x.size=0; x)

# PipeBuffers behave like Unix Pipes. They are typically readable and writable, they act appendable, and are not seekable.
PipeBuffer(data::Vector{UInt8}=UInt8[], maxsize::Int=typemax(Int)) =
AbstractIOBuffer(data,true,true,false,true,maxsize)
IOBufferBase(data,true,true,false,true,maxsize)
PipeBuffer(maxsize::Int) = (x = PipeBuffer(Array{UInt8}(maxsize),maxsize); x.size=0; x)

function copy(b::AbstractIOBuffer)
function copy(b::IOBufferBase)
ret = typeof(b)(b.writable ? copy(b.data) : b.data,
b.readable, b.writable, b.seekable, b.append, b.maxsize)
ret.size = b.size
ret.ptr = b.ptr
return ret
end

show(io::IO, b::AbstractIOBuffer) = print(io, "IOBuffer(data=UInt8[...], ",
show(io::IO, b::IOBufferBase) = print(io, "IOBuffer(data=UInt8[...], ",
"readable=", b.readable, ", ",
"writable=", b.writable, ", ",
"seekable=", b.seekable, ", ",
Expand All @@ -52,7 +52,7 @@ show(io::IO, b::AbstractIOBuffer) = print(io, "IOBuffer(data=UInt8[...], ",
"ptr=", b.ptr, ", ",
"mark=", b.mark, ")")

function unsafe_read(from::AbstractIOBuffer, p::Ptr{UInt8}, nb::UInt)
function unsafe_read(from::IOBufferBase, p::Ptr{UInt8}, nb::UInt)
from.readable || throw(ArgumentError("read failed, IOBuffer is not readable"))
avail = nb_available(from)
adv = min(avail, nb)
Expand All @@ -64,7 +64,7 @@ function unsafe_read(from::AbstractIOBuffer, p::Ptr{UInt8}, nb::UInt)
nothing
end

function read_sub{T}(from::AbstractIOBuffer, a::AbstractArray{T}, offs, nel)
function read_sub{T}(from::IOBufferBase, a::AbstractArray{T}, offs, nel)
from.readable || throw(ArgumentError("read failed, IOBuffer is not readable"))
if offs+nel-1 > length(a) || offs < 1 || nel < 0
throw(BoundsError())
Expand All @@ -80,7 +80,7 @@ function read_sub{T}(from::AbstractIOBuffer, a::AbstractArray{T}, offs, nel)
return a
end

@inline function read(from::AbstractIOBuffer, ::Type{UInt8})
@inline function read(from::IOBufferBase, ::Type{UInt8})
from.readable || throw(ArgumentError("read failed, IOBuffer is not readable"))
ptr = from.ptr
size = from.size
Expand All @@ -92,51 +92,51 @@ end
return byte
end

function peek(from::AbstractIOBuffer)
function peek(from::IOBufferBase)
from.readable || throw(ArgumentError("read failed, IOBuffer is not readable"))
if from.ptr > from.size
throw(EOFError())
end
return from.data[from.ptr]
end

read{T}(from::AbstractIOBuffer, ::Type{Ptr{T}}) = convert(Ptr{T}, read(from, UInt))
read{T}(from::IOBufferBase, ::Type{Ptr{T}}) = convert(Ptr{T}, read(from, UInt))

isreadable(io::AbstractIOBuffer) = io.readable
iswritable(io::AbstractIOBuffer) = io.writable
isreadable(io::IOBufferBase) = io.readable
iswritable(io::IOBufferBase) = io.writable

# TODO: AbstractIOBuffer is not iterable, so doesn't really have a length.
# TODO: IOBufferBase is not iterable, so doesn't really have a length.
# This should maybe be sizeof() instead.
#length(io::AbstractIOBuffer) = (io.seekable ? io.size : nb_available(io))
nb_available(io::AbstractIOBuffer) = io.size - io.ptr + 1
position(io::AbstractIOBuffer) = io.ptr-1
#length(io::IOBufferBase) = (io.seekable ? io.size : nb_available(io))
nb_available(io::IOBufferBase) = io.size - io.ptr + 1
position(io::IOBufferBase) = io.ptr-1

function skip(io::AbstractIOBuffer, n::Integer)
function skip(io::IOBufferBase, n::Integer)
seekto = io.ptr + n
n < 0 && return seek(io, seekto-1) # Does error checking
io.ptr = min(seekto, io.size+1)
return io
end

function seek(io::AbstractIOBuffer, n::Integer)
function seek(io::IOBufferBase, n::Integer)
if !io.seekable
ismarked(io) || throw(ArgumentError("seek failed, IOBuffer is not seekable and is not marked"))
n == io.mark || throw(ArgumentError("seek failed, IOBuffer is not seekable and n != mark"))
end
# TODO: REPL.jl relies on the fact that this does not throw (by seeking past the beginning or end
# of an AbstractIOBuffer), so that would need to be fixed in order to throw an error here
# of an IOBufferBase), so that would need to be fixed in order to throw an error here
#(n < 0 || n > io.size) && throw(ArgumentError("Attempted to seek outside IOBuffer boundaries."))
#io.ptr = n+1
io.ptr = max(min(n+1, io.size+1), 1)
return io
end

function seekend(io::AbstractIOBuffer)
function seekend(io::IOBufferBase)
io.ptr = io.size+1
return io
end

function truncate(io::AbstractIOBuffer, n::Integer)
function truncate(io::IOBufferBase, n::Integer)
io.writable || throw(ArgumentError("truncate failed, IOBuffer is not writeable"))
io.seekable || throw(ArgumentError("truncate failed, IOBuffer is not seekable"))
n < 0 && throw(ArgumentError("truncate failed, n bytes must be ≥ 0, got $n"))
Expand All @@ -151,7 +151,7 @@ function truncate(io::AbstractIOBuffer, n::Integer)
return io
end

function compact(io::AbstractIOBuffer)
function compact(io::IOBufferBase)
io.writable || throw(ArgumentError("compact failed, IOBuffer is not writeable"))
io.seekable && throw(ArgumentError("compact failed, IOBuffer is seekable"))
local ptr::Int, bytes_to_move::Int
Expand All @@ -170,8 +170,8 @@ function compact(io::AbstractIOBuffer)
return io
end

@inline ensureroom(io::AbstractIOBuffer, nshort::Int) = ensureroom(io, UInt(nshort))
@inline function ensureroom(io::AbstractIOBuffer, nshort::UInt)
@inline ensureroom(io::IOBufferBase, nshort::Int) = ensureroom(io, UInt(nshort))
@inline function ensureroom(io::IOBufferBase, nshort::UInt)
io.writable || throw(ArgumentError("ensureroom failed, IOBuffer is not writeable"))
if !io.seekable
nshort >= 0 || throw(ArgumentError("ensureroom failed, requested number of bytes must be ≥ 0, got $nshort"))
Expand All @@ -196,9 +196,9 @@ end
return io
end

eof(io::AbstractIOBuffer) = (io.ptr-1 == io.size)
eof(io::IOBufferBase) = (io.ptr-1 == io.size)

@noinline function close{T}(io::AbstractIOBuffer{T})
@noinline function close{T}(io::IOBufferBase{T})
io.readable = false
io.writable = false
io.seekable = false
Expand All @@ -214,15 +214,15 @@ eof(io::AbstractIOBuffer) = (io.ptr-1 == io.size)
nothing
end

isopen(io::AbstractIOBuffer) = io.readable || io.writable || io.seekable || nb_available(io) > 0
isopen(io::IOBufferBase) = io.readable || io.writable || io.seekable || nb_available(io) > 0

function String(io::AbstractIOBuffer)
function String(io::IOBufferBase)
io.readable || throw(ArgumentError("IOBuffer is not readable"))
io.seekable || throw(ArgumentError("IOBuffer is not seekable"))
return String(copy!(Array{UInt8}(io.size), 1, io.data, 1, io.size))
end

function takebuf_array(io::AbstractIOBuffer)
function takebuf_array(io::IOBufferBase)
ismarked(io) && unmark(io)
if io.seekable
nbytes = io.size
Expand Down Expand Up @@ -259,9 +259,9 @@ function takebuf_array(io::IOBuffer)
end
return data
end
takebuf_string(io::AbstractIOBuffer) = String(takebuf_array(io))
takebuf_string(io::IOBufferBase) = String(takebuf_array(io))

function write(to::AbstractIOBuffer, from::AbstractIOBuffer)
function write(to::IOBufferBase, from::IOBufferBase)
if to === from
from.ptr = from.size + 1
return 0
Expand All @@ -271,7 +271,7 @@ function write(to::AbstractIOBuffer, from::AbstractIOBuffer)
return written
end

function unsafe_write(to::AbstractIOBuffer, p::Ptr{UInt8}, nb::UInt)
function unsafe_write(to::IOBufferBase, p::Ptr{UInt8}, nb::UInt)
ensureroom(to, nb)
ptr = (to.append ? to.size+1 : to.ptr)
written = min(nb, length(to.data) - ptr + 1)
Expand All @@ -290,7 +290,7 @@ function unsafe_write(to::AbstractIOBuffer, p::Ptr{UInt8}, nb::UInt)
return written
end

function write_sub{T}(to::AbstractIOBuffer, a::AbstractArray{T}, offs, nel)
function write_sub{T}(to::IOBufferBase, a::AbstractArray{T}, offs, nel)
if offs+nel-1 > length(a) || offs < 1 || nel < 0
throw(BoundsError())
end
Expand All @@ -308,7 +308,7 @@ function write_sub{T}(to::AbstractIOBuffer, a::AbstractArray{T}, offs, nel)
return written
end

@inline function write(to::AbstractIOBuffer, a::UInt8)
@inline function write(to::IOBufferBase, a::UInt8)
ensureroom(to, UInt(1))
ptr = (to.append ? to.size+1 : to.ptr)
if ptr > to.maxsize
Expand All @@ -323,18 +323,18 @@ end
return sizeof(UInt8)
end

readbytes!(io::AbstractIOBuffer, b::Array{UInt8}, nb=length(b)) = readbytes!(io, b, Int(nb))
function readbytes!(io::AbstractIOBuffer, b::Array{UInt8}, nb::Int)
readbytes!(io::IOBufferBase, b::Array{UInt8}, nb=length(b)) = readbytes!(io, b, Int(nb))
function readbytes!(io::IOBufferBase, b::Array{UInt8}, nb::Int)
nr = min(nb, nb_available(io))
if length(b) < nr
resize!(b, nr)
end
read_sub(io, b, 1, nr)
return nr
end
read(io::AbstractIOBuffer) = read!(io,Array{UInt8}(nb_available(io)))
readavailable(io::AbstractIOBuffer) = read(io)
read(io::AbstractIOBuffer, nb::Integer) = read!(io,Array{UInt8}(min(nb, nb_available(io))))
read(io::IOBufferBase) = read!(io,Array{UInt8}(nb_available(io)))
readavailable(io::IOBufferBase) = read(io)
read(io::IOBufferBase, nb::Integer) = read!(io,Array{UInt8}(min(nb, nb_available(io))))

function search(buf::IOBuffer, delim::UInt8)
p = pointer(buf.data, buf.ptr)
Expand All @@ -343,7 +343,7 @@ function search(buf::IOBuffer, delim::UInt8)
return nb
end

function search(buf::AbstractIOBuffer, delim::UInt8)
function search(buf::IOBufferBase, delim::UInt8)
data = buf.data
for i = buf.ptr : buf.size
@inbounds b = data[i]
Expand All @@ -354,7 +354,7 @@ function search(buf::AbstractIOBuffer, delim::UInt8)
return 0
end

function readuntil(io::AbstractIOBuffer, delim::UInt8)
function readuntil(io::IOBufferBase, delim::UInt8)
lb = 70
A = Array{UInt8}(lb)
n = 0
Expand Down
4 changes: 2 additions & 2 deletions base/stream.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ abstract LibuvServer <: IOServer
abstract LibuvStream <: IO

# IO
# +- AbstractIOBuffer{T<:AbstractArray{UInt8,1}} (not exported)
# +- IOBufferBase{T<:AbstractArray{UInt8,1}} (not exported)
# +- AbstractPipe (not exported)
# . +- Pipe
# . +- Process (not exported)
Expand All @@ -28,7 +28,7 @@ abstract LibuvStream <: IO
# . +- TCPSocket
# . +- TTY (not exported)
# . +- UDPSocket
# +- IOBuffer = Base.AbstractIOBuffer{Array{UInt8,1}}
# +- IOBuffer = Base.IOBufferBase{Array{UInt8,1}}
# +- IOStream

# IOServer
Expand Down
2 changes: 1 addition & 1 deletion base/strings/io.jl
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ print(io::IO, s::AbstractString) = (write(io, s); nothing)
write(io::IO, s::AbstractString) = (len = 0; for c in s; len += write(io, c); end; len)
show(io::IO, s::AbstractString) = print_quoted(io, s)

write(to::AbstractIOBuffer, s::SubString{String}) =
write(to::IOBufferBase, s::SubString{String}) =
s.endof==0 ? 0 : write_sub(to, s.string.data, s.offset + 1, nextind(s, s.endof) - 1)

## printing literal quoted string data ##
Expand Down

0 comments on commit ebff12b

Please sign in to comment.