github.com/qiniu/go-sdk/v7@v7.27.0/internal/io/go1.19.go (about)

     1  //go:build !1.20
     2  // +build !1.20
     3  
     4  package io
     5  
     6  import (
     7  	"errors"
     8  	"io"
     9  )
    10  
    11  var (
    12  	errWhence = errors.New("Seek: invalid whence")
    13  	errOffset = errors.New("Seek: invalid offset")
    14  )
    15  
    16  // An OffsetWriter maps writes at offset base to offset base+off in the underlying writer.
    17  type OffsetWriter struct {
    18  	w    io.WriterAt
    19  	base int64 // the original offset
    20  	off  int64 // the current offset
    21  }
    22  
    23  // NewOffsetWriter returns an [OffsetWriter] that writes to w
    24  // starting at offset off.
    25  func NewOffsetWriter(w io.WriterAt, off int64) *OffsetWriter {
    26  	return &OffsetWriter{w, off, off}
    27  }
    28  
    29  func (o *OffsetWriter) Write(p []byte) (n int, err error) {
    30  	n, err = o.w.WriteAt(p, o.off)
    31  	o.off += int64(n)
    32  	return
    33  }
    34  
    35  func (o *OffsetWriter) WriteAt(p []byte, off int64) (n int, err error) {
    36  	if off < 0 {
    37  		return 0, errOffset
    38  	}
    39  
    40  	off += o.base
    41  	return o.w.WriteAt(p, off)
    42  }
    43  
    44  func (o *OffsetWriter) Seek(offset int64, whence int) (int64, error) {
    45  	switch whence {
    46  	default:
    47  		return 0, errWhence
    48  	case io.SeekStart:
    49  		offset += o.base
    50  	case io.SeekCurrent:
    51  		offset += o.off
    52  	}
    53  	if offset < o.base {
    54  		return 0, errOffset
    55  	}
    56  	o.off = offset
    57  	return offset - o.base, nil
    58  }