summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mangler/mangle.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mangler/mangle.go')
-rw-r--r--vendor/codeberg.org/gruf/go-mangler/mangle.go154
1 files changed, 0 insertions, 154 deletions
diff --git a/vendor/codeberg.org/gruf/go-mangler/mangle.go b/vendor/codeberg.org/gruf/go-mangler/mangle.go
deleted file mode 100644
index e12748e67..000000000
--- a/vendor/codeberg.org/gruf/go-mangler/mangle.go
+++ /dev/null
@@ -1,154 +0,0 @@
-package mangler
-
-import (
- "reflect"
- "sync"
- "unsafe"
-)
-
-// manglers is a map of runtime type ptrs => Mangler functions.
-var manglers sync.Map
-
-// Mangled is an interface that allows any type to implement a custom
-// Mangler function to improve performance when mangling this type.
-type Mangled interface {
- Mangle(buf []byte) []byte
-}
-
-// Mangler is a function that will take an input interface value of known
-// type, and append it in mangled serialized form to the given byte buffer.
-// While the value type is an interface, the Mangler functions are accessed
-// by the value's runtime type pointer, allowing the input value type to be known.
-type Mangler func(buf []byte, value any) []byte
-
-// rMangler is functionally the same as a Mangler function, but it
-// takes the value input in reflected form. By specifying these differences
-// in mangler function types, it allows us to cut back on new calls to
-// `reflect.ValueOf()` and instead pass by existing reflected values.
-type rMangler func(buf []byte, value reflect.Value) []byte
-
-// Get will fetch the Mangler function for given runtime type.
-// Note that the returned mangler will be a no-op in the case
-// that an incorrect type is passed as the value argument.
-func Get(t reflect.Type) Mangler {
- var mng Mangler
-
- // Get raw runtime type ptr
- uptr := uintptr(iface_value(t))
-
- // Look for a cached mangler
- v, ok := manglers.Load(uptr)
-
- if !ok {
- // Load mangler function
- mng = loadMangler(nil, t)
- } else {
- // cast cached value
- mng = v.(Mangler)
- }
-
- return func(buf []byte, value any) []byte {
- // Type check passed value against original arg type.
- if vt := reflect.TypeOf(value); vt != t {
- return buf
- }
-
- // First write the type ptr (this adds
- // a unique prefix for each runtime type).
- buf = mangle_platform_int(buf, uptr)
-
- // Finally, mangle value
- return mng(buf, value)
- }
-}
-
-// Register will register the given Mangler function for use with vars of given runtime type. This allows
-// registering performant manglers for existing types not implementing Mangled (e.g. std library types).
-// NOTE: panics if there already exists a Mangler function for given type. Register on init().
-func Register(t reflect.Type, m Mangler) {
- if t == nil {
- // Nil interface{} types cannot be searched by, do not accept
- panic("cannot register mangler for nil interface{} type")
- }
-
- // Get raw runtime type ptr
- uptr := uintptr(iface_value(t))
-
- // Ensure this is a unique encoder
- if _, ok := manglers.Load(uptr); ok {
- panic("already registered mangler for type: " + t.String())
- }
-
- // Cache this encoder func
- manglers.Store(uptr, m)
-}
-
-// Append will append the mangled form of input value 'a' to buffer 'b'.
-// See mangler.String() for more information on mangled output.
-func Append(b []byte, a any) []byte {
- var mng Mangler
-
- // Get reflect type of 'a'
- t := reflect.TypeOf(a)
-
- // Get raw runtime type ptr
- uptr := uintptr(iface_value(t))
-
- // Look for a cached mangler
- v, ok := manglers.Load(uptr)
-
- if !ok {
- // Load mangler into cache
- mng = loadMangler(nil, t)
- manglers.Store(uptr, mng)
- } else {
- // cast cached value
- mng = v.(Mangler)
- }
-
- // First write the type ptr (this adds
- // a unique prefix for each runtime type).
- b = mangle_platform_int(b, uptr)
-
- // Finally, mangle value
- return mng(b, a)
-}
-
-// String will return the mangled format of input value 'a'. This
-// mangled output will be unique for all default supported input types
-// during a single runtime instance. Uniqueness cannot be guaranteed
-// between separate runtime instances (whether running concurrently, or
-// the same application running at different times).
-//
-// The exact formatting of the output data should not be relied upon,
-// only that it is unique given the above constraints. Generally though,
-// the mangled output is the binary formatted text of given input data.
-//
-// Uniqueness is guaranteed for similar input data of differing types
-// (e.g. string("hello world") vs. []byte("hello world")) by prefixing
-// mangled output with the input data's runtime type pointer.
-//
-// Default supported types include:
-// - string
-// - bool
-// - int,int8,int16,int32,int64
-// - uint,uint8,uint16,uint32,uint64,uintptr
-// - float32,float64
-// - complex64,complex128
-// - all type aliases of above
-// - time.Time{}
-// - url.URL{}
-// - net.IPAddr{}
-// - netip.Addr{}, netip.AddrPort{}
-// - mangler.Mangled{}
-// - fmt.Stringer{}
-// - json.Marshaler{}
-// - encoding.BinaryMarshaler{}
-// - encoding.TextMarshaler{}
-// - all pointers to the above
-// - all slices / arrays of the above
-// - all map keys / values of the above
-func String(a any) string {
- b := Append(make([]byte, 0, 32), a)
- return *(*string)(unsafe.Pointer(&b))
-}