1
0
Fork 0
mirror of https://github.com/MillironX/XAM.jl.git synced 2024-11-15 06:43:10 +00:00

Empty records during iteration

This commit is contained in:
Ciarán O'Mara 2020-04-17 15:52:40 +10:00
parent 300158dbef
commit f00547177f
4 changed files with 37 additions and 7 deletions

View file

@ -72,12 +72,11 @@ function Base.seekstart(reader::Reader)
seek(reader.stream, reader.start_offset) seek(reader.stream, reader.start_offset)
end end
function Base.iterate(reader::Reader, rec=Record()) function Base.iterate(reader::Reader, nextone = Record())
if eof(reader) if BioGenerics.IO.tryread!(reader, nextone) === nothing
return nothing return nothing
end end
read!(reader, rec) return copy(nextone), empty!(nextone)
return copy(rec), rec
end end
# Initialize a BAM reader by reading the header section. # Initialize a BAM reader by reading the header section.

View file

@ -76,6 +76,22 @@ function Base.copy(record::Record)
return copy return copy
end end
function Base.empty!(record::Record)
record.block_size = 0
record.refid = 0
record.pos = 0
record.bin_mq_nl = 0
record.flag_nc = 0
record.l_seq = 0
record.next_refid = 0
record.next_pos = 0
record.tlen = 0
#Note: data will be overwritten and indexed using data_size.
return record
end
function Base.show(io::IO, record::Record) function Base.show(io::IO, record::Record)
print(io, summary(record), ':') print(io, summary(record), ':')
if isfilled(record) if isfilled(record)

View file

@ -81,9 +81,20 @@ function index!(record::Record)
return record return record
end end
function Base.read!(rdr::Reader, rec::Record) function Base.iterate(reader::Reader, nextone::Record = Record())
if BioGenerics.IO.tryread!(reader, nextone) === nothing
return nothing
end
return copy(nextone), empty!(nextone)
end
empty!(rec.fields) #Note: data is pushed to the fields field, and other field data is overwritten. #TODO: distinguish for inplace reading pattern. """
read!(rdr::Reader, rec::Record)
Read a `Record` into `rec`; overwriting or adding to existing field values.
It is assumed that `rec` is already initialized or empty.
"""
function Base.read!(rdr::Reader, rec::Record)
cs, ln, f = readrecord!(rdr.state.stream, rec, (rdr.state.state, rdr.state.linenum)) cs, ln, f = readrecord!(rdr.state.stream, rec, (rdr.state.state, rdr.state.linenum))

View file

@ -571,7 +571,7 @@ end
# Helper Functions # Helper Functions
# ---------------- # ----------------
function initialize!(record::Record) function Base.empty!(record::Record)
record.filled = 1:0 record.filled = 1:0
record.qname = 1:0 record.qname = 1:0
record.flag = 1:0 record.flag = 1:0
@ -588,6 +588,10 @@ function initialize!(record::Record)
return record return record
end end
function initialize!(record::Record) #TODO: deprecate.
return empty!(record)
end
function checkfilled(record::Record) function checkfilled(record::Record)
if !isfilled(record) if !isfilled(record)
throw(ArgumentError("unfilled SAM record")) throw(ArgumentError("unfilled SAM record"))