/
buffer.go
67 lines (50 loc) · 1.07 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
package monolith
import "errors"
type Buffer struct {
value []byte
}
func NewEmptyBuffer() *Buffer {
value := make([]byte, 0)
return &Buffer{value: value}
}
func NewBuffer(value []byte) *Buffer {
return &Buffer{value: value}
}
func (buffer *Buffer) Empty() bool {
return len(buffer.value) == 0
}
func (buffer *Buffer) Pop() (byte, error) {
if buffer.Empty() {
return 0, errors.New("buffer is empty")
}
b := buffer.value[0]
buffer.value = buffer.value[1:]
return b, nil
}
func (buffer *Buffer) PopBytes(n int) ([]byte, error) {
if len(buffer.value) < n {
return []byte{}, errors.New("buffer is short")
}
bs := buffer.value[:n]
buffer.value = buffer.value[n:]
return bs, nil
}
func (buffer *Buffer) Push(bs []byte) {
if bs == nil {
return
}
if len(bs) == 0 {
return
}
buffer.value = append(buffer.value, bs...)
}
func (buffer *Buffer) PopString(n int) (string, error) {
bs, popError := buffer.PopBytes(n)
if popError != nil {
return "", popError
}
return string(bs), nil
}
func (buffer *Buffer) PushString(s string) {
buffer.Push([]byte(s))
}