Documentation ¶
Overview ¶
Package b implements the B+tree flavor of a BTree.
Changelog ¶
2014-06-26: Lower GC presure by recycling things.
2014-04-18: Added new method Put.
Generic types ¶
Keys and their associated values are interface{} typed, similar to all of the containers in the standard library.
Semiautomatic production of a type specific variant of this package is supported via
$ make generic
This command will write to stdout a version of the btree.go file where every key type occurrence is replaced by the word 'KEY' and every value type occurrence is replaced by the word 'VALUE'. Then you have to replace these tokens with your desired type(s), using any technique you're comfortable with.
This is how, for example, 'example/int.go' was created:
$ mkdir example $ make generic | sed -e 's/KEY/int/g' -e 's/VALUE/int/g' > example/int.go
No other changes to int.go are necessary, it compiles just fine.
Running the benchmarks for 1000 keys on a machine with Intel i5-4670 CPU @ 3.4GHz, Go release 1.4.2.
$ go test -bench 1e3 example/all_test.go example/int.go PASS BenchmarkSetSeq1e3 10000 151620 ns/op BenchmarkGetSeq1e3 10000 115354 ns/op BenchmarkSetRnd1e3 5000 255865 ns/op BenchmarkGetRnd1e3 10000 140466 ns/op BenchmarkDelSeq1e3 10000 143860 ns/op BenchmarkDelRnd1e3 10000 188228 ns/op BenchmarkSeekSeq1e3 10000 156448 ns/op BenchmarkSeekRnd1e3 10000 190587 ns/op BenchmarkNext1e3 200000 9407 ns/op BenchmarkPrev1e3 200000 9306 ns/op ok command-line-arguments 26.369s $
Index ¶
- type Cmp
- type Enumerator
- type Tree
- func (t *Tree) Clear()
- func (t *Tree) Close()
- func (t *Tree) Delete(k interface{}) (ok bool)
- func (t *Tree) First() (k interface{}, v interface{})
- func (t *Tree) Get(k interface{}) (v interface{}, ok bool)
- func (t *Tree) Last() (k interface{}, v interface{})
- func (t *Tree) Len() int
- func (t *Tree) Put(k interface{}, ...) (oldV interface{}, written bool)
- func (t *Tree) Seek(k interface{}) (e *Enumerator, ok bool)
- func (t *Tree) SeekFirst() (e *Enumerator, err error)
- func (t *Tree) SeekLast() (e *Enumerator, err error)
- func (t *Tree) Set(k interface{}, v interface{})
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Cmp ¶
type Cmp func(a, b interface{}) int
Cmp compares a and b. Return value is:
< 0 if a < b 0 if a == b > 0 if a > b
type Enumerator ¶
type Enumerator struct {
// contains filtered or unexported fields
}
Enumerator captures the state of enumerating a tree. It is returned from the Seek* methods. The enumerator is aware of any mutations made to the tree in the process of enumerating it and automatically resumes the enumeration at the proper key, if possible.
However, once an Enumerator returns io.EOF to signal "no more items", it does no more attempt to "resync" on tree mutation(s). In other words, io.EOF from an Enumaretor is "sticky" (idempotent).
func (*Enumerator) Close ¶
func (e *Enumerator) Close()
Close recycles e to a pool for possible later reuse. No references to e should exist or such references must not be used afterwards.
func (*Enumerator) Next ¶
func (e *Enumerator) Next() (k interface{}, v interface{}, err error)
Next returns the currently enumerated item, if it exists and moves to the next item in the key collation order. If there is no item to return, err == io.EOF is returned.
func (*Enumerator) Prev ¶
func (e *Enumerator) Prev() (k interface{}, v interface{}, err error)
Prev returns the currently enumerated item, if it exists and moves to the previous item in the key collation order. If there is no item to return, err == io.EOF is returned.
type Tree ¶
type Tree struct {
// contains filtered or unexported fields
}
Tree is a B+tree.
func TreeNew ¶
TreeNew returns a newly created, empty Tree. The compare function is used for key collation.
func (*Tree) Close ¶
func (t *Tree) Close()
Close performs Clear and recycles t to a pool for possible later reuse. No references to t should exist or such references must not be used afterwards.
func (*Tree) Delete ¶
Delete removes the k's KV pair, if it exists, in which case Delete returns true.
func (*Tree) First ¶
func (t *Tree) First() (k interface{}, v interface{})
First returns the first item of the tree in the key collating order, or (zero-value, zero-value) if the tree is empty.
func (*Tree) Get ¶
Get returns the value associated with k and true if it exists. Otherwise Get returns (zero-value, false).
func (*Tree) Last ¶
func (t *Tree) Last() (k interface{}, v interface{})
Last returns the last item of the tree in the key collating order, or (zero-value, zero-value) if the tree is empty.
func (*Tree) Put ¶
func (t *Tree) Put(k interface{}, upd func(oldV interface{}, exists bool) (newV interface{}, write bool)) (oldV interface{}, written bool)
Put combines Get and Set in a more efficient way where the tree is walked only once. The upd(ater) receives (old-value, true) if a KV pair for k exists or (zero-value, false) otherwise. It can then return a (new-value, true) to create or overwrite the existing value in the KV pair, or (whatever, false) if it decides not to create or not to update the value of the KV pair.
tree.Set(k, v) call conceptually equals calling tree.Put(k, func(interface{} /*K*/, bool){ return v, true })
modulo the differing return values.
func (*Tree) Seek ¶
func (t *Tree) Seek(k interface{}) (e *Enumerator, ok bool)
Seek returns an Enumerator positioned on a an item such that k >= item's key. ok reports if k == item.key The Enumerator's position is possibly after the last item in the tree.
func (*Tree) SeekFirst ¶
func (t *Tree) SeekFirst() (e *Enumerator, err error)
SeekFirst returns an enumerator positioned on the first KV pair in the tree, if any. For an empty tree, err == io.EOF is returned and e will be nil.
func (*Tree) SeekLast ¶
func (t *Tree) SeekLast() (e *Enumerator, err error)
SeekLast returns an enumerator positioned on the last KV pair in the tree, if any. For an empty tree, err == io.EOF is returned and e will be nil.