Commit adc06d1c authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent aa6b3e1c
...@@ -27,10 +27,10 @@ import ( ...@@ -27,10 +27,10 @@ import (
"lab.nexedi.com/kirr/neo/go/xcommon/xio" "lab.nexedi.com/kirr/neo/go/xcommon/xio"
) )
// Reader is a bufio.Reader + bell & whistles // Reader is a bufio.Reader that also reports current logical position in input stream.
type Reader struct { type Reader struct {
*bufio.Reader *bufio.Reader
cr *xio.CountReader cr *xio.CountedReader
} }
func NewReader(r io.Reader) *Reader { func NewReader(r io.Reader) *Reader {
...@@ -39,17 +39,16 @@ func NewReader(r io.Reader) *Reader { ...@@ -39,17 +39,16 @@ func NewReader(r io.Reader) *Reader {
return r return r
} }
// idempotent(xio.CountReader) // idempotent(xio.CountedReader)
cr, ok := r.(*xio.CountReader) cr, ok := r.(*xio.CountedReader)
if !ok { if !ok {
cr = &xio.CountReader{r, 0} cr = xio.CountReader(r)
} }
return &Reader{bufio.NewReader(cr), cr} return &Reader{bufio.NewReader(cr), cr}
} }
// InputOffset returns current position in input stream // InputOffset returns current logical position in input stream.
// XXX naming + define interface for getting current position
func (r *Reader) InputOffset() int64 { func (r *Reader) InputOffset() int64 {
return r.cr.Nread - int64(r.Reader.Buffered()) return r.cr.InputOffset() - int64(r.Reader.Buffered())
} }
// TODO copyright / license // Copyright (C) 2017 Nexedi SA and Contributors.
// Kirill Smelkov <kirr@nexedi.com>
//
// This program is free software: you can Use, Study, Modify and Redistribute
// it under the terms of the GNU General Public License version 3, or (at your
// option) any later version, as published by the Free Software Foundation.
//
// You can also Link and Combine this program with other software covered by
// the terms of any of the Free Software licenses or any of the Open Source
// Initiative approved licenses and Convey the resulting work. Corresponding
// source of such a combination shall include the source code for all other
// software used.
//
// This program is distributed WITHOUT ANY WARRANTY; without even the implied
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// See COPYING file for full licensing terms.
// See https://www.nexedi.com/licensing for rationale and options.
// Package xio provides addons to standard package io. // Package xio provides addons to standard package io.
package xio package xio
...@@ -11,23 +28,27 @@ import ( ...@@ -11,23 +28,27 @@ import (
"lab.nexedi.com/kirr/neo/go/xcommon/xcontext" "lab.nexedi.com/kirr/neo/go/xcommon/xcontext"
) )
// XXX interface for a Reader/Writer which can report position // CountedReader is an io.Reader that count total bytes read.
// -> Nread(), Nwrote() ? type CountedReader struct {
r io.Reader
// CountReader is an io.Reader that count total bytes read nread int64
type CountReader struct {
io.Reader
Nread int64
} }
func (r *CountReader) Read(p []byte) (int, error) { func (cr *CountedReader) Read(p []byte) (int, error) {
n, err := r.Reader.Read(p) n, err := cr.r.Read(p)
r.Nread += int64(n) cr.nread += int64(n)
return n, err return n, err
} }
// TODO func to get position (requiring io.Seeker to just Seek(0, SeekCurrent) is too much) // InputOffset returns the number of bytes read.
// XXX previously used InputOffset(), but generally e.g. for io.Writer "input" is not appropriate func (cr *CountedReader) InputOffset() int64 {
return cr.nread
}
// CountReader wraps r with CountedReader
func CountReader(r io.Reader) *CountedReader {
return &CountedReader{r, 0}
}
// CloseWhenDone arranges for c to be closed either when ctx is cancelled or // CloseWhenDone arranges for c to be closed either when ctx is cancelled or
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment