...
Source file src/pkg/strings/builder.go
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
55
56 func (b *Builder) Cap() int { return cap(b.buf) }
57
58
59 func (b *Builder) Reset() {
60 b.addr = nil
61 b.buf = nil
62 }
63
64
65
66 func (b *Builder) grow(n int) {
67 buf := make([]byte, len(b.buf), 2*cap(b.buf)+n)
68 copy(buf, b.buf)
69 b.buf = buf
70 }
71
72
73
74
75 func (b *Builder) Grow(n int) {
76 b.copyCheck()
77 if n < 0 {
78 panic("strings.Builder.Grow: negative count")
79 }
80 if cap(b.buf)-len(b.buf) < n {
81 b.grow(n)
82 }
83 }
84
85
86
87 func (b *Builder) Write(p []byte) (int, error) {
88 b.copyCheck()
89 b.buf = append(b.buf, p...)
90 return len(p), nil
91 }
92
93
94
95 func (b *Builder) WriteByte(c byte) error {
96 b.copyCheck()
97 b.buf = append(b.buf, c)
98 return nil
99 }
100
101
102
103 func (b *Builder) WriteRune(r rune) (int, error) {
104 b.copyCheck()
105 if r < utf8.RuneSelf {
106 b.buf = append(b.buf, byte(r))
107 return 1, nil
108 }
109 l := len(b.buf)
110 if cap(b.buf)-l < utf8.UTFMax {
111 b.grow(utf8.UTFMax)
112 }
113 n := utf8.EncodeRune(b.buf[l:l+utf8.UTFMax], r)
114 b.buf = b.buf[:l+n]
115 return n, nil
116 }
117
118
119
120 func (b *Builder) WriteString(s string) (int, error) {
121 b.copyCheck()
122 b.buf = append(b.buf, s...)
123 return len(s), nil
124 }
125
View as plain text