-
Notifications
You must be signed in to change notification settings - Fork 510
/
appender.go
61 lines (50 loc) · 1.14 KB
/
appender.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package encoding
import (
"bytes"
"io"
"sort"
)
type Appender interface {
Append(ID, []byte) error
Complete()
Records() []*Record
Length() int
}
type appender struct {
writer io.Writer
records []*Record
currentOffset int
}
func NewAppender(writer io.Writer) Appender {
return &appender{
writer: writer,
}
}
// Append appends the id/object to the writer. Note that the caller is giving up ownership of the two byte arrays backing the slices.
// Copies should be made and passed in if this is a problem
func (a *appender) Append(id ID, b []byte) error {
length, err := marshalObjectToWriter(id, b, a.writer)
if err != nil {
return err
}
i := sort.Search(len(a.records), func(idx int) bool {
return bytes.Compare(a.records[idx].ID, id) == 1
})
a.records = append(a.records, nil)
copy(a.records[i+1:], a.records[i:])
a.records[i] = &Record{
ID: id,
Start: uint64(a.currentOffset),
Length: uint32(length),
}
a.currentOffset += length
return nil
}
func (a *appender) Records() []*Record {
return a.records
}
func (a *appender) Length() int {
return len(a.records)
}
func (a *appender) Complete() {
}