summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-format/buffer.go
blob: 393f2fcd39ae7b8d3847bac64d97af6091ed2aa7 (plain)
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
package format

import (
	"io"
	"unicode/utf8"
	"unsafe"
)

// ensure we conform to io.Writer.
var _ io.Writer = (*Buffer)(nil)

// Buffer is a simple wrapper around a byte slice.
type Buffer struct {
	B []byte
}

// Write will append given byte slice to buffer, fulfilling io.Writer.
func (buf *Buffer) Write(b []byte) (int, error) {
	buf.B = append(buf.B, b...)
	return len(b), nil
}

// AppendByte appends given byte to the buffer.
func (buf *Buffer) AppendByte(b byte) {
	buf.B = append(buf.B, b)
}

// AppendRune appends given rune to the buffer.
func (buf *Buffer) AppendRune(r rune) {
	if r < utf8.RuneSelf {
		buf.B = append(buf.B, byte(r))
		return
	}

	l := buf.Len()
	for i := 0; i < utf8.UTFMax; i++ {
		buf.B = append(buf.B, 0)
	}
	n := utf8.EncodeRune(buf.B[l:buf.Len()], r)
	buf.B = buf.B[:l+n]
}

// Append will append given byte slice to the buffer.
func (buf *Buffer) Append(b []byte) {
	buf.B = append(buf.B, b...)
}

// AppendString appends given string to the buffer.
func (buf *Buffer) AppendString(s string) {
	buf.B = append(buf.B, s...)
}

// Len returns the length of the buffer's underlying byte slice.
func (buf *Buffer) Len() int {
	return len(buf.B)
}

// Cap returns the capacity of the buffer's underlying byte slice.
func (buf *Buffer) Cap() int {
	return cap(buf.B)
}

// Truncate will reduce the length of the buffer by 'n'.
func (buf *Buffer) Truncate(n int) {
	if n > len(buf.B) {
		n = len(buf.B)
	}
	buf.B = buf.B[:buf.Len()-n]
}

// Reset will reset the buffer length to 0 (retains capacity).
func (buf *Buffer) Reset() {
	buf.B = buf.B[:0]
}

// String returns the underlying byte slice as a string. Please note
// this value is tied directly to the underlying byte slice, if you
// write to the buffer then returned string values will also change.
func (buf *Buffer) String() string {
	return *(*string)(unsafe.Pointer(&buf.B))
}