gotosocial/vendor/codeberg.org/gruf/go-mangler/init.go
kim 51c156cca1
pull in latest go-kv, go-cache (#1530)
Signed-off-by: kim <grufwub@gmail.com>
2023-02-19 10:36:38 +01:00

120 lines
3.0 KiB
Go

package mangler
import (
"net"
"net/netip"
"net/url"
"reflect"
"time"
_ "unsafe"
)
func init() {
// Register standard library performant manglers.
Register(reflect.TypeOf(net.IPAddr{}), mangle_ipaddr)
Register(reflect.TypeOf(&net.IPAddr{}), mangle_ipaddr_ptr)
Register(reflect.TypeOf(netip.Addr{}), mangle_addr)
Register(reflect.TypeOf(&netip.Addr{}), mangle_addr_ptr)
Register(reflect.TypeOf(netip.AddrPort{}), mangle_addrport)
Register(reflect.TypeOf(&netip.AddrPort{}), mangle_addrport_ptr)
Register(reflect.TypeOf(time.Time{}), mangle_time)
Register(reflect.TypeOf(&time.Time{}), mangle_time_ptr)
Register(reflect.TypeOf(url.URL{}), mangle_url)
Register(reflect.TypeOf(&url.URL{}), mangle_url_ptr)
}
//go:linkname time_sec time.(*Time).sec
func time_sec(*time.Time) int64
//go:linkname time_nsec time.(*Time).nsec
func time_nsec(*time.Time) int32
//go:linkname time_stripMono time.(*Time).stripMono
func time_stripMono(*time.Time)
func mangle_url(buf []byte, a any) []byte {
u := (*url.URL)(iface_value(a))
return append(buf, u.String()...)
}
func mangle_url_ptr(buf []byte, a any) []byte {
if ptr := (*url.URL)(iface_value(a)); ptr != nil {
s := ptr.String()
buf = append(buf, '1')
return append(buf, s...)
}
buf = append(buf, '0')
return buf
}
func mangle_time(buf []byte, a any) []byte {
t := *(*time.Time)(iface_value(a))
time_stripMono(&t) // force non-monotonic time value.
buf = append_uint64(buf, uint64(time_sec(&t)))
buf = append_uint32(buf, uint32(time_nsec(&t)))
return buf
}
func mangle_time_ptr(buf []byte, a any) []byte {
if ptr := (*time.Time)(iface_value(a)); ptr != nil {
t := *ptr
buf = append(buf, '1')
time_stripMono(&t) // force non-monotonic time value.
buf = append_uint64(buf, uint64(time_sec(&t)))
buf = append_uint32(buf, uint32(time_nsec(&t)))
return buf
}
buf = append(buf, '0')
return buf
}
func mangle_ipaddr(buf []byte, a any) []byte {
i := *(*net.IPAddr)(iface_value(a))
buf = append(buf, i.IP...)
buf = append(buf, i.Zone...)
return buf
}
func mangle_ipaddr_ptr(buf []byte, a any) []byte {
if ptr := (*net.IPAddr)(iface_value(a)); ptr != nil {
buf = append(buf, '1')
buf = append(buf, ptr.IP...)
buf = append(buf, ptr.Zone...)
return buf
}
buf = append(buf, '0')
return buf
}
func mangle_addr(buf []byte, a any) []byte {
i := (*netip.Addr)(iface_value(a))
b, _ := i.MarshalBinary()
return append(buf, b...)
}
func mangle_addr_ptr(buf []byte, a any) []byte {
if ptr := (*netip.Addr)(iface_value(a)); ptr != nil {
buf = append(buf, '1')
b, _ := ptr.MarshalBinary()
return append(buf, b...)
}
buf = append(buf, '0')
return buf
}
func mangle_addrport(buf []byte, a any) []byte {
i := (*netip.AddrPort)(iface_value(a))
b, _ := i.MarshalBinary()
return append(buf, b...)
}
func mangle_addrport_ptr(buf []byte, a any) []byte {
if ptr := (*netip.AddrPort)(iface_value(a)); ptr != nil {
buf = append(buf, '1')
b, _ := ptr.MarshalBinary()
return append(buf, b...)
}
buf = append(buf, '0')
return buf
}