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 }