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  }