From 354c89945c571655d389e6920f10c23abfe38803 Mon Sep 17 00:00:00 2001 From: Oliver Tonnhofer Date: Mon, 21 Jan 2013 20:19:37 +0100 Subject: [PATCH] use generator for BlockPositions --- parser.go | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/parser.go b/parser.go index 3db53bb..31a08fe 100644 --- a/parser.go +++ b/parser.go @@ -20,6 +20,12 @@ type PBF struct { offset int64 } +type BlockPosition struct { + filename string + offset int64 + size int32 +} + func Open(filename string) (f *PBF, err error) { file, err := os.Open(filename) if err != nil { @@ -43,6 +49,21 @@ func (pbf *PBF) NextDataPosition() (offset int64, size int32) { return } +func (pbf *PBF) BlockPositions() (positions chan BlockPosition) { + positions = make(chan BlockPosition) + go func() { + for { + offset, size := pbf.NextDataPosition() + if size == 0 { + close(positions) + return + } + positions <- BlockPosition{pbf.filename, offset, size} + } + }() + return +} + func (pbf *PBF) nextBlobHeaderSize() (size int32) { pbf.offset += 4 binary.Read(pbf.file, binary.BigEndian, &size) @@ -149,20 +170,19 @@ func ReadDenseNodes(dense *osmpbf.DenseNodes, block *osmpbf.PrimitiveBlock) (nod func blockPositions(filename string) { pbf, err := Open(filename) - - file, err := os.Open(filename) if err != nil { log.Fatal(err) } var nodesCounter, relationsCounter, waysCounter int - for { - offset, size := pbf.NextDataPosition() - if size == 0 { - break + for pos := range pbf.BlockPositions() { + file, err := os.Open(pos.filename) + if err != nil { + log.Fatal(err) } - block := ReadPrimitiveBlock(file, offset, size) + + block := ReadPrimitiveBlock(file, pos.offset, pos.size) for _, group := range block.Primitivegroup { dense := group.GetDense()