Explorar el Código

refactor bytes reader

Darien Raymond hace 8 años
padre
commit
7e2246907b
Se han modificado 1 ficheros con 32 adiciones y 47 borrados
  1. 32 47
      common/buf/reader.go

+ 32 - 47
common/buf/reader.go

@@ -36,74 +36,59 @@ func (r *readerAdpater) Read() (MultiBuffer, error) {
 }
 
 type bufferToBytesReader struct {
-	stream  Reader
-	current MultiBuffer
-	err     error
-}
-
-// fill fills in the internal buffer.
-func (r *bufferToBytesReader) fill() {
-	b, err := r.stream.Read()
-	if err != nil {
-		r.err = err
-		return
-	}
-	r.current = b
+	stream   Reader
+	leftOver MultiBuffer
 }
 
 func (r *bufferToBytesReader) Read(b []byte) (int, error) {
-	if r.err != nil {
-		return 0, r.err
+	if r.leftOver != nil {
+		nBytes, err := r.leftOver.Read(b)
+		if r.leftOver.IsEmpty() {
+			r.leftOver.Release()
+			r.leftOver = nil
+		}
+		return nBytes, err
 	}
 
-	if r.current == nil {
-		r.fill()
-		if r.err != nil {
-			return 0, r.err
-		}
+	mb, err := r.stream.Read()
+	if err != nil {
+		return 0, err
 	}
-	nBytes, err := r.current.Read(b)
-	if r.current.IsEmpty() {
-		r.current.Release()
-		r.current = nil
+
+	nBytes, err := mb.Read(b)
+	if !mb.IsEmpty() {
+		r.leftOver = mb
 	}
 	return nBytes, err
 }
 
 func (r *bufferToBytesReader) ReadMultiBuffer() (MultiBuffer, error) {
-	if r.err != nil {
-		return nil, r.err
+	if r.leftOver != nil {
+		mb := r.leftOver
+		r.leftOver = nil
+		return mb, nil
 	}
-	if r.current == nil {
-		r.fill()
-		if r.err != nil {
-			return nil, r.err
-		}
-	}
-	b := r.current
-	r.current = nil
-	return b, nil
+
+	return r.stream.Read()
 }
 
 func (r *bufferToBytesReader) writeToInternal(writer io.Writer) (int64, error) {
-	if r.err != nil {
-		return 0, r.err
-	}
-
 	mbWriter := NewWriter(writer)
 	totalBytes := int64(0)
+	if r.leftOver != nil {
+		mbWriter.Write(r.leftOver)
+		totalBytes += int64(r.leftOver.Len())
+	}
+
 	for {
-		if r.current == nil {
-			r.fill()
-			if r.err != nil {
-				return totalBytes, r.err
-			}
+		mb, err := r.stream.Read()
+		if err != nil {
+			return totalBytes, err
 		}
-		totalBytes += int64(r.current.Len())
-		if err := mbWriter.Write(r.current); err != nil {
+		totalBytes += int64(mb.Len())
+		if err := mbWriter.Write(mb); err != nil {
 			return totalBytes, err
 		}
-		r.current = nil
 	}
 }