...
Source file
src/strings/builder.go
Documentation: strings
1
2
3
4
5 package strings
6
7 import (
8 "unicode/utf8"
9 "unsafe"
10 )
11
12
13
14
15 type Builder struct {
16 addr *Builder
17 buf []byte
18 }
19
20
21
22
23
24
25
26
27 func noescape(p unsafe.Pointer) unsafe.Pointer {
28 x := uintptr(p)
29 return unsafe.Pointer(x ^ 0)
30 }
31
32 func (b *Builder) copyCheck() {
33 if b.addr == nil {
34
35
36
37
38
39 b.addr = (*Builder)(noescape(unsafe.Pointer(b)))
40 } else if b.addr != b {
41 panic("strings: illegal use of non-zero Builder copied by value")
42 }
43 }
44
45
46 func (b *Builder) String() string {
47 return *(*string)(unsafe.Pointer(&b.buf))
48 }
49
50
51 func (b *Builder) Len() int { return len(b.buf) }
52
53
54 func (b *Builder) Reset() {
55 b.addr = nil
56 b.buf = nil
57 }
58
59
60
61 func (b *Builder) grow(n int) {
62 buf := make([]byte, len(b.buf), 2*cap(b.buf)+n)
63 copy(buf, b.buf)
64 b.buf = buf
65 }
66
67
68
69
70 func (b *Builder) Grow(n int) {
71 b.copyCheck()
72 if n < 0 {
73 panic("strings.Builder.Grow: negative count")
74 }
75 if cap(b.buf)-len(b.buf) < n {
76 b.grow(n)
77 }
78 }
79
80
81
82 func (b *Builder) Write(p []byte) (int, error) {
83 b.copyCheck()
84 b.buf = append(b.buf, p...)
85 return len(p), nil
86 }
87
88
89
90 func (b *Builder) WriteByte(c byte) error {
91 b.copyCheck()
92 b.buf = append(b.buf, c)
93 return nil
94 }
95
96
97
98 func (b *Builder) WriteRune(r rune) (int, error) {
99 b.copyCheck()
100 if r < utf8.RuneSelf {
101 b.buf = append(b.buf, byte(r))
102 return 1, nil
103 }
104 l := len(b.buf)
105 if cap(b.buf)-l < utf8.UTFMax {
106 b.grow(utf8.UTFMax)
107 }
108 n := utf8.EncodeRune(b.buf[l:l+utf8.UTFMax], r)
109 b.buf = b.buf[:l+n]
110 return n, nil
111 }
112
113
114
115 func (b *Builder) WriteString(s string) (int, error) {
116 b.copyCheck()
117 b.buf = append(b.buf, s...)
118 return len(s), nil
119 }
120
View as plain text