[#53] object/util: Add seek range function to range traverser
Add SetSeekRange method to RangeTraverser that switches traverser to work with provided object payload range. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
8791c4f0a5
commit
834a8597c5
1 changed files with 30 additions and 0 deletions
|
@ -104,3 +104,33 @@ func (c *RangeTraverser) PushSuccessSize(sz uint64) {
|
|||
c.chain = c.chain.next
|
||||
}
|
||||
}
|
||||
|
||||
// SetSeekRange moves the chain to the specified range.
|
||||
// The range is expected to be within the filled chain.
|
||||
func (c *RangeTraverser) SetSeekRange(r *objectSDK.Range) {
|
||||
ln, off := r.GetLength(), r.GetOffset()
|
||||
|
||||
for {
|
||||
if off < c.chain.bounds.left {
|
||||
if c.chain.prev == nil {
|
||||
break
|
||||
}
|
||||
|
||||
c.chain = c.chain.prev
|
||||
} else if off >= c.chain.bounds.left && off < c.chain.bounds.right {
|
||||
break
|
||||
} else if off >= c.chain.bounds.right {
|
||||
if c.chain.next == nil {
|
||||
break
|
||||
}
|
||||
|
||||
c.chain = c.chain.next
|
||||
}
|
||||
}
|
||||
|
||||
if c.seekBounds == nil {
|
||||
c.seekBounds = new(rangeBounds)
|
||||
}
|
||||
|
||||
c.seekBounds.left, c.seekBounds.right = off, off+ln
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue