mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 05:52:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			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)) | ||
|  | } |