This repository has been archived by the owner on Nov 14, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
encoding.go
87 lines (76 loc) · 1.88 KB
/
encoding.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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package types
import (
"encoding/binary"
"io"
)
// An encHelper provides convenience methods and reduces allocations during
// encoding. All of its methods become no-ops after the encHelper encounters a
// Write error.
type encHelper struct {
w io.Writer
buf []byte
err error
}
// reset reslices e's internal buffer to have a length of 0.
func (e *encHelper) reset() {
e.buf = e.buf[:0]
}
// append appends a byte to e's internal buffer.
func (e *encHelper) append(b byte) {
if e.err != nil {
return
}
e.buf = append(e.buf, b)
}
// flush writes e's internal buffer to the underlying io.Writer.
func (e *encHelper) flush() (int, error) {
if e.err != nil {
return 0, e.err
}
n, err := e.w.Write(e.buf)
if e.err == nil {
e.err = err
}
return n, e.err
}
// Write implements the io.Writer interface.
func (e *encHelper) Write(p []byte) (int, error) {
if e.err != nil {
return 0, e.err
}
e.buf = append(e.buf[:0], p...)
return e.flush()
}
// WriteUint64 writes a uint64 value to the underlying io.Writer.
func (e *encHelper) WriteUint64(u uint64) {
if e.err != nil {
return
}
e.buf = e.buf[:8]
binary.LittleEndian.PutUint64(e.buf, u)
e.flush()
}
// WriteUint64 writes an int value to the underlying io.Writer.
func (e *encHelper) WriteInt(i int) {
e.WriteUint64(uint64(i))
}
// WriteUint64 writes p to the underlying io.Writer, prefixed by its length.
func (e *encHelper) WritePrefix(p []byte) {
e.WriteInt(len(p))
e.Write(p)
}
// Err returns the first non-nil error encountered by e.
func (e *encHelper) Err() error {
return e.err
}
// encoder converts w to an encHelper. If w's underlying type is already
// *encHelper, it is returned; otherwise, a new encHelper is allocated.
func encoder(w io.Writer) *encHelper {
if e, ok := w.(*encHelper); ok {
return e
}
return &encHelper{
w: w,
buf: make([]byte, 64), // large enough for everything but ArbitraryData
}
}