github.com/Tyktechnologies/tyk@v2.9.5+incompatible/regexp/keybuilder.go (about) 1 package regexp 2 3 import ( 4 "fmt" 5 "strconv" 6 "sync" 7 "unsafe" 8 ) 9 10 var keyBuilderPool = sync.Pool{ 11 New: func() interface{} { return new(keyBuilder) }, 12 } 13 14 // Combine logic of strings.Builder and bytes.Buffer. 15 // Allow to reuse builder with 0 allocs, as bytes.Buffer 16 // and also allow to get 0 alloc string representation 17 // as strings.Builder 18 type keyBuilder struct { 19 buf []byte 20 } 21 22 // Reset resets the keyBuilder to be empty. 23 func (kb *keyBuilder) Reset() *keyBuilder { 24 kb.buf = kb.buf[:0] 25 return kb 26 } 27 28 // Returns content of internal buffer, converted to string. 29 // Safe for using as key for storing item, immutable 30 func (kb *keyBuilder) Key() string { 31 return string(kb.buf) 32 } 33 34 // Returns string representation of internal buffer. 35 // Mutable, sequential writes to keyBuilder will 36 // also mutate returned representation. 37 // Safe for lookups by key. 38 // Should not be used as key for storing items. 39 func (kb *keyBuilder) UnsafeKey() string { 40 return *(*string)(unsafe.Pointer(&kb.buf)) 41 } 42 43 func (kb *keyBuilder) Write(p []byte) (int, error) { 44 kb.buf = append(kb.buf, p...) 45 return len(p), nil 46 } 47 48 func (kb *keyBuilder) AppendString(s string) *keyBuilder { 49 kb.buf = append(kb.buf, s...) 50 return kb 51 } 52 53 func (kb *keyBuilder) AppendBytes(b []byte) *keyBuilder { 54 kb.buf = append(kb.buf, b...) 55 return kb 56 } 57 58 func (kb *keyBuilder) Appendf(format string, a ...interface{}) *keyBuilder { 59 fmt.Fprintf(kb, format, a...) 60 return kb 61 } 62 63 func (kb *keyBuilder) AppendInt(n int) *keyBuilder { 64 kb.buf = strconv.AppendInt(kb.buf, int64(n), 10) 65 return kb 66 }