distribution/vendor/github.com/ajwerner/btree/internal/abstract/low_level.go

82 lines
2.4 KiB
Go

package abstract
// LowLevelIterator is exposed to developers within this module for use
// implemented augmented search functionality.
type LowLevelIterator[K, V, A any] Iterator[K, V, A]
// LowLevel converts an iterator to a LowLevelIterator. Given this package
// is internal, callers outside of this module cannot construct a
// LowLevelIterator.
func LowLevel[K, V, A any](
it *Iterator[K, V, A],
) *LowLevelIterator[K, V, A] {
return it.lowLevel()
}
// Config returns the Map's config.
func (i *LowLevelIterator[K, V, A]) Config() *Config[K, V, A] {
return &i.r.cfg.Config
}
// IncrementPos increments the iterator's position within the current node.
func (i *LowLevelIterator[K, V, A]) IncrementPos() {
i.SetPos(i.pos + 1)
}
// SetPos sets the iterator's position within the current node.
func (i *LowLevelIterator[K, V, A]) SetPos(pos int16) {
i.pos = pos
}
// Node returns the current Node.
func (i *LowLevelIterator[K, V, A]) Node() *Node[K, V, A] {
return i.node
}
// IsLeaf returns true if the current node is a leaf.
func (i *LowLevelIterator[K, V, A]) IsLeaf() bool {
return i.node.IsLeaf()
}
// Pos returns the current position within the current node.
func (i *LowLevelIterator[K, V, A]) Pos() int16 {
return i.pos
}
// Depth returns the number of nodes above the current node in the stack.
// It is illegal to call Ascend if this function returns 0.
func (i *LowLevelIterator[K, V, A]) Depth() int {
return i.s.len()
}
// Child returns the augmentation of the child node at the current position.
// It is illegal to call if this is a leaf node or there is no child
// node at the current position.
func (i *LowLevelIterator[K, V, A]) Child() *A {
return &i.node.children[i.pos].aug
}
// Descend pushes the current position into the iterators stack and
// descends into the child node currently pointed to by the iterator.
// It is illegal to call if there is no such child. The position in the
// new node will be 0.
func (i *LowLevelIterator[K, V, A]) Descend() {
i.s.push(i.iterFrame)
i.iterFrame = i.makeFrame(i.node.children[i.pos], 0)
}
// Ascend ascends up to the current node's parent and resets the position
// to the one previously set for this parent node.
func (i *LowLevelIterator[K, V, A]) Ascend() {
i.iterFrame = i.s.pop()
}
func (i *LowLevelIterator[K, V, A]) makeFrame(
n *Node[K, V, A], pos int16,
) iterFrame[K, V, A] {
return iterFrame[K, V, A]{
node: n,
pos: pos,
}
}