forked from dgryski/go-bitstream
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuffer.go
134 lines (118 loc) · 2.47 KB
/
buffer.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package bit
import (
"bufio"
"bytes"
"fmt"
"io"
)
// buffered bit reader/writer
type BufReader struct {
br *bufio.Reader
*BitReader
}
func NewBufReader(r io.Reader) *BufReader {
br := bufio.NewReader(r)
return &BufReader{
br: br,
BitReader: NewReader(br),
}
}
type BufWriter struct {
bw *bufio.Writer
*BitWriter
}
func NewBufWriter(r io.Writer) *BufWriter {
bw := bufio.NewWriter(r)
return &BufWriter{
bw: bw,
BitWriter: NewWriter(bw),
}
}
func (w *BufWriter) Flush() error {
err := w.BitWriter.Flush()
if err != nil {
return err
}
return w.bw.Flush()
}
type BufReadWriter struct {
*BufReader
*BufWriter
}
func NewBufReadWriter(r *BufReader, w *BufWriter) *BufReadWriter {
return &BufReadWriter{r, w}
}
// bit buffer
type Buffer struct {
*BitReadWriter
buf *bytes.Buffer
}
func NewBuffer() *Buffer {
buf := new(bytes.Buffer)
return &Buffer{
BitReadWriter: NewReadWriter(NewReader(buf), NewWriter(buf)),
buf: buf,
}
}
func (b *Buffer) Copy() *Buffer {
data := make([]byte, len(b.buf.Bytes()), b.buf.Cap())
copy(data, b.buf.Bytes())
buf := bytes.NewBuffer(data)
return &Buffer{
BitReadWriter: NewReadWriter(NewReader(buf), NewWriter(buf)),
buf: buf,
}
}
func (b *Buffer) Reset() {
b.Flush()
b.buf.Reset()
b.BitReader.Reset()
}
func (b *Buffer) ReadFrom(r Reader, nbits int) error {
for nbits >= 8 {
v, err := r.ReadByte()
if err != nil {
return fmt.Errorf("bit buffer error: read from bit reader: %w", err)
}
err = b.WriteByte(v)
if err != nil {
return fmt.Errorf("bit buffer error: write to bit buffer: %w", err)
}
nbits -= 8
}
if nbits > 0 {
v, err := r.ReadBits(nbits)
if err != nil {
return fmt.Errorf("bit buffer error: read from bit reader: %w", err)
}
err = b.WriteBits(v, nbits)
if err != nil {
return fmt.Errorf("bit buffer error: write to bit buffer: %w", err)
}
}
return nil
}
func (b *Buffer) WriteTo(w Writer, nbits int) error {
for nbits >= 8 {
v, err := b.ReadByte()
if err != nil {
return fmt.Errorf("bit buffer error: read from bit buffer: %w", err)
}
err = w.WriteByte(v)
if err != nil {
return fmt.Errorf("bit buffer error: write to bit writer: %w", err)
}
nbits -= 8
}
if nbits > 0 {
v, err := b.ReadBits(nbits)
if err != nil {
return fmt.Errorf("bit buffer error: read from bit buffer: %w", err)
}
err = w.WriteBits(v, nbits)
if err != nil {
return fmt.Errorf("bit buffer error: write to bit writer: %w", err)
}
}
return nil
}