82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
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))
|
|
}
|