Skip to content

Commit 96a431c

Browse files
committed
add ability to resuse vellum builders
Change-Id: I18e2645afb3cec81633b600b2940cb479c24fdd9 Reviewed-on: http://review.couchbase.org/90248 Reviewed-by: Steve Yen <[email protected]> Tested-by: Marty Schoch <[email protected]>
1 parent 335037e commit 96a431c

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

builder.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,19 @@ func newBuilder(w io.Writer, opts *BuilderOpts) (*Builder, error) {
6767
return rv, nil
6868
}
6969

70+
func (b *Builder) Reset(w io.Writer) error {
71+
b.unfinished.Reset()
72+
b.registry.Reset()
73+
b.lastAddr = noneAddr
74+
b.encoder.reset(w)
75+
76+
err := b.encoder.start()
77+
if err != nil {
78+
return err
79+
}
80+
return nil
81+
}
82+
7083
// Insert the provided value to the set being built.
7184
// NOTE: values must be inserted in lexicographical order.
7285
func (b *Builder) Insert(key []byte, val uint64) error {
@@ -165,6 +178,13 @@ type unfinishedNodes struct {
165178
cache []builderNodeUnfinished
166179
}
167180

181+
func (u *unfinishedNodes) Reset() {
182+
u.stack = u.stack[:0]
183+
for i := 0; i < len(u.cache); i++ {
184+
u.cache[i] = builderNodeUnfinished{}
185+
}
186+
}
187+
168188
func newUnfinishedNodes() *unfinishedNodes {
169189
rv := &unfinishedNodes{
170190
stack: make([]*builderNodeUnfinished, 0, 64),

encoder_v1.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func newEncoderV1(w io.Writer) *encoderV1 {
4242
}
4343
}
4444

45+
func (e *encoderV1) reset(w io.Writer) {
46+
e.bw.Reset(w)
47+
}
48+
4549
func (e *encoderV1) start() error {
4650
header := make([]byte, headerSize)
4751
binary.LittleEndian.PutUint64(header, versionV1)

encoding.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type encoder interface {
3232
start() error
3333
encodeState(s *builderNode, addr int) (int, error)
3434
finish(count, rootAddr int) error
35+
reset(w io.Writer)
3536
}
3637

3738
func loadEncoder(ver int, w io.Writer) (encoder, error) {

registry.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ func newRegistry(tableSize, mruSize int) *registry {
4242
return rv
4343
}
4444

45+
func (r *registry) Reset() {
46+
for i := 0; i < len(r.table); i++ {
47+
r.table[i] = registryCell{}
48+
}
49+
r.hasher.Reset()
50+
}
51+
4552
func (r *registry) entry(node *builderNode) (bool, int, *registryCell) {
4653
if len(r.table) == 0 {
4754
return false, 0, nil

writer.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ func newWriter(w io.Writer) *writer {
3232
}
3333
}
3434

35+
func (w *writer) Reset(newWriter io.Writer) {
36+
w.w.Reset(newWriter)
37+
w.counter = 0
38+
}
39+
3540
func (w *writer) WriteByte(c byte) error {
3641
err := w.w.WriteByte(c)
3742
if err != nil {

0 commit comments

Comments
 (0)