summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-kv/v2/format
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-kv/v2/format')
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/abi.go244
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/array.go66
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/cache.go60
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/format.go104
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/map.go60
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/methods.go115
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go28
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/slice.go36
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/struct.go34
-rw-r--r--vendor/codeberg.org/gruf/go-kv/v2/format/type.go83
10 files changed, 339 insertions, 491 deletions
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go b/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go
index b68d3cb73..16b9c8cb9 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/abi.go
@@ -5,88 +5,10 @@ package format
import (
"reflect"
"unsafe"
-)
-const (
- // see: go/src/internal/abi/type.go
- abi_KindDirectIface uint8 = 1 << 5
- abi_KindMask uint8 = (1 << 5) - 1
+ "codeberg.org/gruf/go-xunsafe"
)
-// abi_Type is a copy of the memory layout of abi.Type{}.
-//
-// see: go/src/internal/abi/type.go
-type abi_Type struct {
- _ uintptr
- PtrBytes uintptr
- _ uint32
- _ uint8
- _ uint8
- _ uint8
- Kind_ uint8
- _ func(unsafe.Pointer, unsafe.Pointer) bool
- _ *byte
- _ int32
- _ int32
-}
-
-// abi_EmptyInterface is a copy of the memory layout of abi.EmptyInterface{},
-// which is to say also the memory layout of any method-less interface.
-//
-// see: go/src/internal/abi/iface.go
-type abi_EmptyInterface struct {
- Type *abi_Type
- Data unsafe.Pointer
-}
-
-// abi_NonEmptyInterface is a copy of the memory layout of abi.NonEmptyInterface{},
-// which is to say also the memory layout of any interface containing method(s).
-//
-// see: go/src/internal/abi/iface.go on 1.25+
-// see: go/src/reflect/value.go on 1.24
-type abi_NonEmptyInterface struct {
- ITab uintptr
- Data unsafe.Pointer
-}
-
-// see: go/src/internal/abi/type.go Type.Kind()
-func abi_Type_Kind(t reflect.Type) uint8 {
- iface := (*abi_NonEmptyInterface)(unsafe.Pointer(&t))
- atype := (*abi_Type)(unsafe.Pointer(iface.Data))
- return atype.Kind_ & abi_KindMask
-}
-
-// see: go/src/internal/abi/type.go Type.IfaceIndir()
-func abi_Type_IfaceIndir(t reflect.Type) bool {
- iface := (*abi_NonEmptyInterface)(unsafe.Pointer(&t))
- atype := (*abi_Type)(unsafe.Pointer(iface.Data))
- return atype.Kind_&abi_KindDirectIface == 0
-}
-
-// pack_iface packs a new reflect.nonEmptyInterface{} using shielded
-// itab and data pointer, returning a pointer for caller casting.
-func pack_iface(itab uintptr, word unsafe.Pointer) unsafe.Pointer {
- return unsafe.Pointer(&abi_NonEmptyInterface{
- ITab: itab,
- Data: word,
- })
-}
-
-// get_iface_ITab generates a new value of given type,
-// casts it to the generic param interface type, and
-// returns the .itab portion of the reflect.nonEmptyInterface{}.
-// this is useful for later calls to pack_iface for known type.
-func get_iface_ITab[I any](t reflect.Type) uintptr {
- s := reflect.New(t).Elem().Interface().(I)
- i := (*abi_NonEmptyInterface)(unsafe.Pointer(&s))
- return i.ITab
-}
-
-// unpack_eface returns the .Data portion of an abi.EmptyInterface{}.
-func unpack_eface(a any) unsafe.Pointer {
- return (*abi_EmptyInterface)(unsafe.Pointer((&a))).Data
-}
-
// add returns the ptr addition of starting ptr and a delta.
func add(ptr unsafe.Pointer, delta uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(ptr) + delta)
@@ -97,167 +19,7 @@ func typeof[T any]() reflect.Type {
return reflect.TypeFor[T]()
}
-// see: go/src/reflect/value.go
-type reflect_flag uintptr
-
const (
- // see: go/src/reflect/value.go
- reflect_flagKindWidth = 5 // there are 27 kinds
- reflect_flagKindMask reflect_flag = 1<<reflect_flagKindWidth - 1
- reflect_flagStickyRO reflect_flag = 1 << 5
- reflect_flagEmbedRO reflect_flag = 1 << 6
- reflect_flagIndir reflect_flag = 1 << 7
- reflect_flagAddr reflect_flag = 1 << 8
- reflect_flagMethod reflect_flag = 1 << 9
- reflect_flagMethodShift = 10
- reflect_flagRO reflect_flag = reflect_flagStickyRO | reflect_flagEmbedRO
-
- // custom flag to indicate key types.
- flagKeyType = 1 << 10
+ // custom xunsafe.Reflect_flag to indicate key types.
+ flagKeyType xunsafe.Reflect_flag = 1 << 10
)
-
-// reflect_iface_elem_flags returns the reflect_flag expected of an unboxed interface element of type.
-//
-// see: go/src/reflect/value.go unpackElem()
-func reflect_iface_elem_flags(elemType reflect.Type) reflect_flag {
- if elemType == nil {
- return 0
- }
- flags := reflect_flag(abi_Type_Kind(elemType))
- if abi_Type_IfaceIndir(elemType) {
- flags |= reflect_flagIndir
- }
- return flags
-}
-
-// reflect_pointer_elem_flags returns the reflect_flag expected of a dereferenced pointer element of type.
-//
-// see: go/src/reflect/value.go Value.Elem()
-func reflect_pointer_elem_flags(ptrFlags reflect_flag, elemType reflect.Type) reflect_flag {
- return ptrFlags | reflect_flagIndir | reflect_flagAddr | reflect_flag(abi_Type_Kind(elemType))
-}
-
-// reflect_array_elem_flags returns the reflect_flag expected of an element of type in an array.
-//
-// see: go/src/reflect/value.go Value.Index()
-func reflect_array_elem_flags(arrayFlags reflect_flag, elemType reflect.Type) reflect_flag {
- return arrayFlags&(reflect_flagIndir|reflect_flagAddr) | reflect_flag(abi_Type_Kind(elemType))
-}
-
-// reflect_slice_elem_flags returns the reflect_flag expected of a slice element of type.
-//
-// see: go/src/reflect/value.go Value.Index()
-func reflect_slice_elem_flags(elemType reflect.Type) reflect_flag {
- return reflect_flagAddr | reflect_flagIndir | reflect_flag(abi_Type_Kind(elemType))
-}
-
-// reflect_struct_field_flags returns the reflect_flag expected of a struct field of type.
-//
-// see: go/src/reflect/value.go Value.Field()
-func reflect_struct_field_flags(structFlags reflect_flag, fieldType reflect.Type) reflect_flag {
- return structFlags&(reflect_flagIndir|reflect_flagAddr) | reflect_flag(abi_Type_Kind(fieldType))
-}
-
-// reflect_map_key_flags returns the reflect_flag expected of a map key of type (with our own key type mask set).
-//
-// see: go/src/reflect/map_swiss.go MapIter.Key()
-func reflect_map_key_flags(keyType reflect.Type) reflect_flag {
- return flagKeyType | reflect_flag(abi_Type_Kind(keyType))
-}
-
-// reflect_map_elem_flags returns the reflect_flag expected of a map element of type.
-//
-// see: go/src/reflect/map_swiss.go MapIter.Value()
-func reflect_map_elem_flags(elemType reflect.Type) reflect_flag {
- return reflect_flag(abi_Type_Kind(elemType))
-}
-
-// reflect_Value is a copy of the memory layout of reflect.Value{}.
-//
-// see: go/src/reflect/value.go
-type reflect_Value struct {
- typ_ unsafe.Pointer
- ptr unsafe.Pointer
- reflect_flag
-}
-
-func init() {
- if unsafe.Sizeof(reflect_Value{}) != unsafe.Sizeof(reflect.Value{}) {
- panic("reflect_Value{} not in sync with reflect.Value{}")
- }
-}
-
-// reflect_type_data returns the .word from the reflect.Type{} cast
-// as the reflect.nonEmptyInterface{}, which itself will be a pointer
-// to the actual abi.Type{} that this reflect.Type{} is wrapping.
-func reflect_type_data(t reflect.Type) unsafe.Pointer {
- return (*abi_NonEmptyInterface)(unsafe.Pointer(&t)).Data
-}
-
-// build_reflect_value manually builds a reflect.Value{} by setting the internal field members.
-func build_reflect_value(rtype reflect.Type, data unsafe.Pointer, flags reflect_flag) reflect.Value {
- return *(*reflect.Value)(unsafe.Pointer(&reflect_Value{reflect_type_data(rtype), data, flags}))
-}
-
-// maps_Iter is a copy of the memory layout of maps.Iter{}.
-//
-// see: go/src/internal/runtime/maps/table.go
-type maps_Iter struct {
- key unsafe.Pointer
- elem unsafe.Pointer
- _ uintptr
- _ uintptr
- _ uint64
- _ uint64
- _ uint64
- _ uint8
- _ int
- _ uintptr
- _ struct{ _ unsafe.Pointer }
- _ uint64
-}
-
-// reflect_MapIter is a copy of the memory layout of reflect.MapIter{}.
-//
-// see: go/src/reflect/map_swiss.go
-type reflect_MapIter struct {
- m reflect.Value
- hiter maps_Iter
-}
-
-func init() {
- if unsafe.Sizeof(reflect_MapIter{}) != unsafe.Sizeof(reflect.MapIter{}) {
- panic("reflect_MapIter{} not in sync with reflect.MapIter{}")
- }
-}
-
-// map_iter creates a new map iterator from value,
-// skipping the initial v.MapRange() type checking.
-func map_iter(v reflect.Value) *reflect.MapIter {
- var i reflect_MapIter
- i.m = v
- return (*reflect.MapIter)(unsafe.Pointer(&i))
-}
-
-// map_key returns ptr to current map key in iter.
-func map_key(i *reflect.MapIter) unsafe.Pointer {
- return (*reflect_MapIter)(unsafe.Pointer(i)).hiter.key
-}
-
-// map_elem returns ptr to current map element in iter.
-func map_elem(i *reflect.MapIter) unsafe.Pointer {
- return (*reflect_MapIter)(unsafe.Pointer(i)).hiter.elem
-}
-
-// see: go/src/internal/unsafeheader/unsafeheader.go
-type unsafeheader_Slice struct {
- Data unsafe.Pointer
- Len int
- Cap int
-}
-
-// see: go/src/internal/unsafeheader/unsafeheader.go
-type unsafeheader_String struct {
- Data unsafe.Pointer
- Len int
-}
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/array.go b/vendor/codeberg.org/gruf/go-kv/v2/format/array.go
index ab3a90d39..1ece16378 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/array.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/array.go
@@ -1,19 +1,23 @@
package format
-import "unsafe"
+import (
+ "unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
+)
// iterArrayType returns a FormatFunc capable of iterating
-// and formatting the given array type currently in typenode{}.
+// and formatting the given array type currently in TypeIter{}.
// note this will fetch a sub-FormatFunc for the array element
// type, and also handle special cases of [n]byte, [n]rune arrays.
-func (fmt *Formatter) iterArrayType(t typenode) FormatFunc {
+func (fmt *Formatter) iterArrayType(t xunsafe.TypeIter) FormatFunc {
// Array element type.
- elem := t.rtype.Elem()
+ elem := t.Type.Elem()
- // Get nested elem typenode with appropriate flags.
- flags := reflect_array_elem_flags(t.flags, elem)
- et := t.next(elem, flags)
+ // Get nested elem TypeIter with appropriate flags.
+ flags := xunsafe.ReflectArrayElemFlags(t.Flag, elem)
+ et := t.Child(elem, flags)
// Get elem format func.
fn := fmt.loadOrGet(et)
@@ -22,7 +26,7 @@ func (fmt *Formatter) iterArrayType(t typenode) FormatFunc {
}
// Handle possible sizes.
- switch t.rtype.Len() {
+ switch t.Type.Len() {
case 0:
return emptyArrayType(t)
case 1:
@@ -32,8 +36,8 @@ func (fmt *Formatter) iterArrayType(t typenode) FormatFunc {
}
}
-func emptyArrayType(t typenode) FormatFunc {
- if !t.needs_typestr() {
+func emptyArrayType(t xunsafe.TypeIter) FormatFunc {
+ if !needs_typestr(t) {
// Simply append empty.
return func(s *State) {
s.B = append(s.B, "[]"...)
@@ -41,7 +45,7 @@ func emptyArrayType(t typenode) FormatFunc {
}
// Array type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
// Append empty with type.
return func(s *State) {
@@ -54,8 +58,8 @@ func emptyArrayType(t typenode) FormatFunc {
}
}
-func iterSingleArrayType(t typenode, fn FormatFunc) FormatFunc {
- if !t.needs_typestr() {
+func iterSingleArrayType(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
+ if !needs_typestr(t) {
return func(s *State) {
// Wrap 'fn' in braces.
s.B = append(s.B, '[')
@@ -65,7 +69,7 @@ func iterSingleArrayType(t typenode, fn FormatFunc) FormatFunc {
}
// Array type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
// Wrap in type+braces.
return func(s *State) {
@@ -87,14 +91,14 @@ func iterSingleArrayType(t typenode, fn FormatFunc) FormatFunc {
}
}
-func iterMultiArrayType(t typenode, fn FormatFunc) FormatFunc {
+func iterMultiArrayType(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
// Array element in-memory size.
- esz := t.rtype.Elem().Size()
+ esz := t.Type.Elem().Size()
// Number of elements.
- n := t.rtype.Len()
+ n := t.Type.Len()
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
// Wrap elems in braces.
return func(s *State) {
ptr := s.P
@@ -121,7 +125,7 @@ func iterMultiArrayType(t typenode, fn FormatFunc) FormatFunc {
}
// Array type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
// Wrap in type+braces.
return func(s *State) {
@@ -158,13 +162,13 @@ func iterMultiArrayType(t typenode, fn FormatFunc) FormatFunc {
}
}
-func wrapByteArray(t typenode, fn FormatFunc) FormatFunc {
- n := t.rtype.Len()
- if !t.needs_typestr() {
+func wrapByteArray(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
+ n := t.Type.Len()
+ if !needs_typestr(t) {
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
var v string
- p := (*unsafeheader_String)(unsafe.Pointer(&v))
+ p := (*xunsafe.Unsafeheader_String)(unsafe.Pointer(&v))
p.Len = n
p.Data = s.P
appendString(s, v)
@@ -173,11 +177,11 @@ func wrapByteArray(t typenode, fn FormatFunc) FormatFunc {
}
}
}
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
var v string
- p := (*unsafeheader_String)(unsafe.Pointer(&v))
+ p := (*xunsafe.Unsafeheader_String)(unsafe.Pointer(&v))
p.Len = n
p.Data = s.P
if s.A.WithType() {
@@ -193,13 +197,13 @@ func wrapByteArray(t typenode, fn FormatFunc) FormatFunc {
}
}
-func wrapRuneArray(t typenode, fn FormatFunc) FormatFunc {
- n := t.rtype.Len()
- if !t.needs_typestr() {
+func wrapRuneArray(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
+ n := t.Type.Len()
+ if !needs_typestr(t) {
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
var v []rune
- p := (*unsafeheader_Slice)(unsafe.Pointer(&v))
+ p := (*xunsafe.Unsafeheader_Slice)(unsafe.Pointer(&v))
p.Cap = n
p.Len = n
p.Data = s.P
@@ -209,11 +213,11 @@ func wrapRuneArray(t typenode, fn FormatFunc) FormatFunc {
}
}
}
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
var v []rune
- p := (*unsafeheader_Slice)(unsafe.Pointer(&v))
+ p := (*xunsafe.Unsafeheader_Slice)(unsafe.Pointer(&v))
p.Cap = n
p.Len = n
p.Data = s.P
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go b/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go
new file mode 100644
index 000000000..8c9bfa210
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/cache.go
@@ -0,0 +1,60 @@
+package format
+
+import (
+ "sync/atomic"
+ "unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
+)
+
+// cache is a concurrency-safe map[xunsafe.TypeInfo]FormatFunc
+// cache, designed for heavy reads but with unfortunately expensive
+// writes. it is designed such that after some initial load period
+// in which functions are cached by types, all future ops are reads.
+type cache struct{ p unsafe.Pointer }
+
+// Get will check cache for format func under key.
+func (c *cache) Get(t xunsafe.TypeInfo) FormatFunc {
+ if p := c.load(); p != nil {
+ return (*p)[t]
+ }
+ return nil
+}
+
+// Put will place given format func in cache under key, if not already exists.
+func (c *cache) Put(t xunsafe.TypeInfo, fn FormatFunc) {
+ for {
+ p := c.load()
+
+ var cache map[xunsafe.TypeInfo]FormatFunc
+
+ if p != nil {
+ if _, ok := (*p)[t]; ok {
+ return
+ }
+
+ cache = make(map[xunsafe.TypeInfo]FormatFunc, len(*p)+1)
+ for key, value := range *p {
+ cache[key] = value
+ }
+ } else {
+ cache = make(map[xunsafe.TypeInfo]FormatFunc, 1)
+ }
+
+ cache[t] = fn
+
+ if c.cas(p, &cache) {
+ return
+ }
+ }
+}
+
+// load is a typed wrapper around atomic.LoadPointer().
+func (c *cache) load() *map[xunsafe.TypeInfo]FormatFunc {
+ return (*map[xunsafe.TypeInfo]FormatFunc)(atomic.LoadPointer(&c.p))
+}
+
+// cas is a typed wrapper around atomic.CompareAndSwapPointer().
+func (c *cache) cas(old, new *map[xunsafe.TypeInfo]FormatFunc) bool {
+ return atomic.CompareAndSwapPointer(&c.p, unsafe.Pointer(old), unsafe.Pointer(new))
+}
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/format.go b/vendor/codeberg.org/gruf/go-kv/v2/format/format.go
index 69edcb597..0629c6f96 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/format.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/format.go
@@ -4,8 +4,9 @@ import (
"reflect"
"runtime/debug"
"strconv"
- "sync"
"unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
)
// Global formatter instance.
@@ -93,15 +94,7 @@ type Formatter struct {
// internal
// format func
// cache map.
- fns sync.Map
-}
-
-// LoadFor returns a FormatFunc for the given value type.
-func (fmt *Formatter) LoadFor(value any) FormatFunc {
- rtype := reflect.TypeOf(value)
- flags := reflect_iface_elem_flags(rtype)
- t := new_typenode(rtype, flags)
- return fmt.loadOrStore(t)
+ fns cache
}
// Append calls AppendState() with a newly allocated State{}, returning byte buffer.
@@ -126,17 +119,17 @@ func (fmt *Formatter) AppendState(s *State, value any) {
// global defaults.
s.A = defaultArgs
}
- s.P = unpack_eface(value)
+ t := xunsafe.TypeIterFrom(value)
+ s.P = xunsafe.UnpackEface(value)
s.ifaces.clear()
s.ifaces.set(s.P)
- fmt.LoadFor(value)(s)
+ fmt.loadOrStore(t)(s)
}
-func (fmt *Formatter) loadOrGet(t typenode) FormatFunc {
+func (fmt *Formatter) loadOrGet(t xunsafe.TypeIter) FormatFunc {
// Look for existing stored
// func under this type key.
- v, _ := fmt.fns.Load(t.key())
- fn, _ := v.(FormatFunc)
+ fn := fmt.fns.Get(t.TypeInfo)
if fn == nil {
// Load format func
@@ -150,14 +143,13 @@ func (fmt *Formatter) loadOrGet(t typenode) FormatFunc {
return fn
}
-func (fmt *Formatter) loadOrStore(t typenode) FormatFunc {
+func (fmt *Formatter) loadOrStore(t xunsafe.TypeIter) FormatFunc {
// Get cache key.
- key := t.key()
+ key := t.TypeInfo
// Look for existing stored
// func under this type key.
- v, _ := fmt.fns.Load(key)
- fn, _ := v.(FormatFunc)
+ fn := fmt.fns.Get(key)
if fn == nil {
// Load format func
@@ -167,8 +159,8 @@ func (fmt *Formatter) loadOrStore(t typenode) FormatFunc {
panic("unreachable")
}
- // Store in map under type.
- fmt.fns.Store(key, fn)
+ // Store under type.
+ fmt.fns.Put(key, fn)
}
return fn
@@ -188,8 +180,8 @@ var (
runesType = typeof[[]rune]()
)
-func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
- if t.rtype == nil {
+func (fmt *Formatter) get(t xunsafe.TypeIter) (fn FormatFunc) {
+ if t.Type == nil {
// catch nil type.
return appendNil
}
@@ -205,7 +197,7 @@ func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
// Don't allow method functions for map keys,
// to prevent situation of the method receiver
// attempting to modify stored map key itself.
- if t.flags&flagKeyType != 0 {
+ if t.Flag&flagKeyType != 0 {
return
}
@@ -228,20 +220,20 @@ func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
}
}()
- if t.rtype == reflectTypeType {
+ if t.Type == reflectTypeType {
// DO NOT iterate down internal ABI
// types, some are in non-GC memory.
return getPointerType(t)
}
- if !t.visit() {
+ if !visit(t) {
// On type recursion simply
// format as raw pointer.
return getPointerType(t)
}
// Get func for type kind.
- switch t.rtype.Kind() {
+ switch t.Type.Kind() {
case reflect.Interface:
return fmt.getInterfaceType(t)
case reflect.String:
@@ -269,7 +261,7 @@ func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
case reflect.Pointer:
return fmt.derefPointerType(t)
case reflect.Array:
- elem := t.rtype.Elem()
+ elem := t.Type.Elem()
switch fn := fmt.iterArrayType(t); {
case elem.AssignableTo(byteType):
return wrapByteArray(t, fn)
@@ -280,9 +272,9 @@ func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
}
case reflect.Slice:
switch fn := fmt.iterSliceType(t); {
- case t.rtype.AssignableTo(bytesType):
+ case t.Type.AssignableTo(bytesType):
return wrapByteSlice(t, fn)
- case t.rtype.AssignableTo(runesType):
+ case t.Type.AssignableTo(runesType):
return wrapRuneSlice(t, fn)
default:
return fn
@@ -296,12 +288,12 @@ func (fmt *Formatter) get(t typenode) (fn FormatFunc) {
}
}
-func (fmt *Formatter) getInterfaceType(t typenode) FormatFunc {
- if t.rtype.NumMethod() == 0 {
+func (fmt *Formatter) getInterfaceType(t xunsafe.TypeIter) FormatFunc {
+ if t.Type.NumMethod() == 0 {
return func(s *State) {
// Unpack empty interface.
eface := *(*any)(s.P)
- s.P = unpack_eface(eface)
+ s.P = xunsafe.UnpackEface(eface)
// Get reflected type information.
rtype := reflect.TypeOf(eface)
@@ -319,9 +311,10 @@ func (fmt *Formatter) getInterfaceType(t typenode) FormatFunc {
// Store value ptr.
s.ifaces.set(s.P)
- // Wrap in our typenode for before load.
- flags := reflect_iface_elem_flags(rtype)
- t := new_typenode(rtype, flags)
+ // Wrap before load.
+ var t xunsafe.TypeIter
+ t.Flag = xunsafe.ReflectIfaceElemFlags(rtype)
+ t.Type = rtype
// Load + pass to func.
fmt.loadOrStore(t)(s)
@@ -330,7 +323,7 @@ func (fmt *Formatter) getInterfaceType(t typenode) FormatFunc {
return func(s *State) {
// Unpack interface-with-method ptr.
iface := *(*interface{ M() })(s.P)
- s.P = unpack_eface(iface)
+ s.P = xunsafe.UnpackEface(iface)
// Get reflected type information.
rtype := reflect.TypeOf(iface)
@@ -348,9 +341,10 @@ func (fmt *Formatter) getInterfaceType(t typenode) FormatFunc {
// Store value ptr.
s.ifaces.set(s.P)
- // Wrap in our typenode for before load.
- flags := reflect_iface_elem_flags(rtype)
- t := new_typenode(rtype, flags)
+ // Wrap before load.
+ var t xunsafe.TypeIter
+ t.Flag = xunsafe.ReflectIfaceElemFlags(rtype)
+ t.Type = rtype
// Load + pass to func.
fmt.loadOrStore(t)(s)
@@ -358,20 +352,20 @@ func (fmt *Formatter) getInterfaceType(t typenode) FormatFunc {
}
}
-func getStringType(t typenode) FormatFunc {
+func getStringType(t xunsafe.TypeIter) FormatFunc {
return with_typestr_ptrs(t, func(s *State) {
appendString(s, *(*string)(s.P))
})
}
-func getBoolType(t typenode) FormatFunc {
+func getBoolType(t xunsafe.TypeIter) FormatFunc {
return with_typestr_ptrs(t, func(s *State) {
s.B = strconv.AppendBool(s.B, *(*bool)(s.P))
})
}
-func getIntType(t typenode) FormatFunc {
- switch t.rtype.Bits() {
+func getIntType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Type.Bits() {
case 8:
return with_typestr_ptrs(t, func(s *State) {
appendInt(s, int64(*(*int8)(s.P)))
@@ -403,8 +397,8 @@ func getIntType(t typenode) FormatFunc {
}
}
-func getUintType(t typenode) FormatFunc {
- switch t.rtype.Bits() {
+func getUintType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Type.Bits() {
case 8:
return with_typestr_ptrs(t, func(s *State) {
switch {
@@ -433,8 +427,8 @@ func getUintType(t typenode) FormatFunc {
}
}
-func getFloatType(t typenode) FormatFunc {
- switch t.rtype.Bits() {
+func getFloatType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Type.Bits() {
case 32:
return with_typestr_ptrs(t, func(s *State) {
appendFloat(s, float64(*(*float32)(s.P)), 32)
@@ -448,8 +442,8 @@ func getFloatType(t typenode) FormatFunc {
}
}
-func getComplexType(t typenode) FormatFunc {
- switch t.rtype.Bits() {
+func getComplexType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Type.Bits() {
case 64:
return with_typestr_ptrs(t, func(s *State) {
v := *(*complex64)(s.P)
@@ -467,8 +461,8 @@ func getComplexType(t typenode) FormatFunc {
}
}
-func getPointerType(t typenode) FormatFunc {
- switch t.indirect() {
+func getPointerType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Indirect() {
case true:
return with_typestr_ptrs(t, func(s *State) {
s.P = *(*unsafe.Pointer)(s.P)
@@ -483,18 +477,18 @@ func getPointerType(t typenode) FormatFunc {
}
}
-func with_typestr_ptrs(t typenode, fn FormatFunc) FormatFunc {
+func with_typestr_ptrs(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
if fn == nil {
panic("nil func")
}
// Check for type wrapping.
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
return fn
}
// Get type string with pointers.
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
// Wrap format func to include
// type information when needed.
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/map.go b/vendor/codeberg.org/gruf/go-kv/v2/format/map.go
index 038fb74ac..a3c4acd60 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/map.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/map.go
@@ -1,21 +1,25 @@
package format
-import "unsafe"
+import (
+ "unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
+)
// iterMapType returns a FormatFunc capable of iterating
-// and formatting the given map type currently in typenode{}.
+// and formatting the given map type currently in TypeIter{}.
// note this will fetch sub-FormatFuncs for key / value types.
-func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
+func (fmt *Formatter) iterMapType(t xunsafe.TypeIter) FormatFunc {
// Key / value types.
- key := t.rtype.Key()
- elem := t.rtype.Elem()
+ key := t.Type.Key()
+ elem := t.Type.Elem()
- // Get nested k / v typenodes with appropriate flags.
- flagsKey := reflect_map_key_flags(key)
- flagsVal := reflect_map_elem_flags(elem)
- kt := t.next(t.rtype.Key(), flagsKey)
- vt := t.next(t.rtype.Elem(), flagsVal)
+ // Get nested k / v TypeIters with appropriate flags.
+ flagsKey := xunsafe.ReflectMapKeyFlags(key) | flagKeyType
+ flagsVal := xunsafe.ReflectMapElemFlags(elem)
+ kt := t.Child(key, flagsKey)
+ vt := t.Child(elem, flagsVal)
// Get key format func.
kfn := fmt.loadOrGet(kt)
@@ -30,14 +34,14 @@ func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
}
// Final map type.
- rtype := t.rtype
- flags := t.flags
+ rtype := t.Type
+ flags := t.Flag
// Map type string with ptrs / refs.
- typestrPtrs := t.typestr_with_ptrs()
- typestrRefs := t.typestr_with_refs()
+ typestrPtrs := typestr_with_ptrs(t)
+ typestrRefs := typestr_with_refs(t)
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
return func(s *State) {
if s.P == nil || *(*unsafe.Pointer)(s.P) == nil {
// Append nil.
@@ -45,9 +49,9 @@ func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
return
}
- // Build reflect value, and then a map iter.
- v := build_reflect_value(rtype, s.P, flags)
- i := map_iter(v)
+ // Build reflect value, and then a map iterator.
+ v := xunsafe.BuildReflectValue(rtype, s.P, flags)
+ i := xunsafe.GetMapIter(v)
// Prepend object brace.
s.B = append(s.B, '{')
@@ -56,15 +60,15 @@ func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
l := len(s.B)
for i.Next() {
- // Pass to key fn.
- s.P = map_key(i)
+ // Pass to map key func.
+ s.P = xunsafe.Map_Key(i)
kfn(s)
// Add key seperator.
s.B = append(s.B, '=')
- // Pass to elem fn.
- s.P = map_elem(i)
+ // Pass to map elem func.
+ s.P = xunsafe.Map_Elem(i)
vfn(s)
// Add comma pair seperator.
@@ -89,8 +93,8 @@ func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
}
// Build reflect value, and then a map iter.
- v := build_reflect_value(rtype, s.P, flags)
- i := map_iter(v)
+ v := xunsafe.BuildReflectValue(rtype, s.P, flags)
+ i := xunsafe.GetMapIter(v)
// Include type info.
if s.A.WithType() {
@@ -104,15 +108,15 @@ func (fmt *Formatter) iterMapType(t typenode) FormatFunc {
l := len(s.B)
for i.Next() {
- // Pass to key fn.
- s.P = map_key(i)
+ // Pass to map key func.
+ s.P = xunsafe.Map_Key(i)
kfn(s)
// Add key seperator.
s.B = append(s.B, '=')
- // Pass to elem fn.
- s.P = map_elem(i)
+ // Pass to map elem func.
+ s.P = xunsafe.Map_Elem(i)
vfn(s)
// Add comma pair seperator.
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go b/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go
index fcbffd3a4..8febd4a1d 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/methods.go
@@ -3,31 +3,45 @@ package format
import (
"reflect"
"unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
)
type Stringer interface{ String() string }
+type Formattable interface{ Format(*State) }
+
var (
// stringer type for implement checks.
stringerType = typeof[Stringer]()
+ // formattableType type for implement checks.
+ formattableType = typeof[Formattable]()
+
// error type for implement checks.
errorType = typeof[error]()
)
// getMethodType returns a *possible* FormatFunc to handle case
// of a type that implements any known interface{} types, else nil.
-func getMethodType(t typenode) FormatFunc {
+func getMethodType(t xunsafe.TypeIter) FormatFunc {
switch {
- case t.rtype.Implements(stringerType):
- switch t.rtype.Kind() {
+ case t.Type.Implements(stringerType):
+ switch t.Type.Kind() {
case reflect.Interface:
return getInterfaceStringerType(t)
default:
return getConcreteStringerType(t)
}
- case t.rtype.Implements(errorType):
- switch t.rtype.Kind() {
+ case t.Type.Implements(formattableType):
+ switch t.Type.Kind() {
+ case reflect.Interface:
+ return getInterfaceFormattableType(t)
+ default:
+ return getConcreteFormattableType(t)
+ }
+ case t.Type.Implements(errorType):
+ switch t.Type.Kind() {
case reflect.Interface:
return getInterfaceErrorType(t)
default:
@@ -40,12 +54,12 @@ func getMethodType(t typenode) FormatFunc {
// getInterfaceStringerType returns a FormatFunc to handle case of an interface{}
// type that implements Stringer{}, i.e. Stringer{} itself and any superset of.
-func getInterfaceStringerType(t typenode) FormatFunc {
- switch t.indirect() && !t.iface_indir() {
+func getInterfaceStringerType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Indirect() && !t.IfaceIndir() {
case true:
return with_typestr_ptrs(t, func(s *State) {
s.P = *(*unsafe.Pointer)(s.P)
- if s.P == nil || (*abi_NonEmptyInterface)(s.P).Data == nil {
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
appendNil(s)
return
}
@@ -54,7 +68,7 @@ func getInterfaceStringerType(t typenode) FormatFunc {
})
case false:
return with_typestr_ptrs(t, func(s *State) {
- if s.P == nil || (*abi_NonEmptyInterface)(s.P).Data == nil {
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
appendNil(s)
return
}
@@ -68,9 +82,9 @@ func getInterfaceStringerType(t typenode) FormatFunc {
// getConcreteStringerType returns a FormatFunc to handle case of concrete
// (i.e. non-interface{}) type that has a Stringer{} method receiver.
-func getConcreteStringerType(t typenode) FormatFunc {
- itab := get_iface_ITab[Stringer](t.rtype)
- switch t.indirect() && !t.iface_indir() {
+func getConcreteStringerType(t xunsafe.TypeIter) FormatFunc {
+ itab := xunsafe.GetIfaceITab[Stringer](t.Type)
+ switch t.Indirect() && !t.IfaceIndir() {
case true:
return with_typestr_ptrs(t, func(s *State) {
s.P = *(*unsafe.Pointer)(s.P)
@@ -78,17 +92,66 @@ func getConcreteStringerType(t typenode) FormatFunc {
appendNil(s)
return
}
- v := *(*Stringer)(pack_iface(itab, s.P))
+ v := *(*Stringer)(xunsafe.PackIface(itab, s.P))
appendString(s, v.String())
})
case false:
return with_typestr_ptrs(t, func(s *State) {
+ v := *(*Stringer)(xunsafe.PackIface(itab, s.P))
+ appendString(s, v.String())
+ })
+ default:
+ panic("unreachable")
+ }
+}
+
+// getInterfaceFormattableType returns a FormatFunc to handle case of an interface{}
+// type that implements Formattable{}, i.e. Formattable{} itself and any superset of.
+func getInterfaceFormattableType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Indirect() && !t.IfaceIndir() {
+ case true:
+ return with_typestr_ptrs(t, func(s *State) {
+ s.P = *(*unsafe.Pointer)(s.P)
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
+ appendNil(s)
+ return
+ }
+ v := *(*Formattable)(s.P)
+ v.Format(s)
+ })
+ case false:
+ return with_typestr_ptrs(t, func(s *State) {
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
+ appendNil(s)
+ return
+ }
+ v := *(*Formattable)(s.P)
+ v.Format(s)
+ })
+ default:
+ panic("unreachable")
+ }
+}
+
+// getConcreteFormattableType returns a FormatFunc to handle case of concrete
+// (i.e. non-interface{}) type that has a Formattable{} method receiver.
+func getConcreteFormattableType(t xunsafe.TypeIter) FormatFunc {
+ itab := xunsafe.GetIfaceITab[Formattable](t.Type)
+ switch t.Indirect() && !t.IfaceIndir() {
+ case true:
+ return with_typestr_ptrs(t, func(s *State) {
+ s.P = *(*unsafe.Pointer)(s.P)
if s.P == nil {
appendNil(s)
return
}
- v := *(*Stringer)(pack_iface(itab, s.P))
- appendString(s, v.String())
+ v := *(*Formattable)(xunsafe.PackIface(itab, s.P))
+ v.Format(s)
+ })
+ case false:
+ return with_typestr_ptrs(t, func(s *State) {
+ v := *(*Formattable)(xunsafe.PackIface(itab, s.P))
+ v.Format(s)
})
default:
panic("unreachable")
@@ -97,12 +160,12 @@ func getConcreteStringerType(t typenode) FormatFunc {
// getInterfaceErrorType returns a FormatFunc to handle case of an interface{}
// type that implements error{}, i.e. error{} itself and any superset of.
-func getInterfaceErrorType(t typenode) FormatFunc {
- switch t.indirect() && !t.iface_indir() {
+func getInterfaceErrorType(t xunsafe.TypeIter) FormatFunc {
+ switch t.Indirect() && !t.IfaceIndir() {
case true:
return with_typestr_ptrs(t, func(s *State) {
s.P = *(*unsafe.Pointer)(s.P)
- if s.P == nil || (*abi_NonEmptyInterface)(s.P).Data == nil {
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
appendNil(s)
return
}
@@ -111,7 +174,7 @@ func getInterfaceErrorType(t typenode) FormatFunc {
})
case false:
return with_typestr_ptrs(t, func(s *State) {
- if s.P == nil || (*abi_NonEmptyInterface)(s.P).Data == nil {
+ if s.P == nil || (*xunsafe.Abi_NonEmptyInterface)(s.P).Data == nil {
appendNil(s)
return
}
@@ -125,9 +188,9 @@ func getInterfaceErrorType(t typenode) FormatFunc {
// getConcreteErrorType returns a FormatFunc to handle case of concrete
// (i.e. non-interface{}) type that has an error{} method receiver.
-func getConcreteErrorType(t typenode) FormatFunc {
- itab := get_iface_ITab[error](t.rtype)
- switch t.indirect() && !t.iface_indir() {
+func getConcreteErrorType(t xunsafe.TypeIter) FormatFunc {
+ itab := xunsafe.GetIfaceITab[error](t.Type)
+ switch t.Indirect() && !t.IfaceIndir() {
case true:
return with_typestr_ptrs(t, func(s *State) {
s.P = *(*unsafe.Pointer)(s.P)
@@ -135,16 +198,12 @@ func getConcreteErrorType(t typenode) FormatFunc {
appendNil(s)
return
}
- v := *(*error)(pack_iface(itab, s.P))
+ v := *(*error)(xunsafe.PackIface(itab, s.P))
appendString(s, v.Error())
})
case false:
return with_typestr_ptrs(t, func(s *State) {
- if s.P == nil {
- appendNil(s)
- return
- }
- v := *(*error)(pack_iface(itab, s.P))
+ v := *(*error)(xunsafe.PackIface(itab, s.P))
appendString(s, v.Error())
})
default:
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go b/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go
index 1f860aba9..ec1e2e15d 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/pointer.go
@@ -3,34 +3,36 @@ package format
import (
"reflect"
"unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
)
// derefPointerType returns a FormatFunc capable of dereferencing
-// and formatting the given pointer type currently in typenode{}.
+// and formatting the given pointer type currently in TypeIter{}.
// note this will fetch a sub-FormatFunc for resulting value type.
-func (fmt *Formatter) derefPointerType(t typenode) FormatFunc {
+func (fmt *Formatter) derefPointerType(t xunsafe.TypeIter) FormatFunc {
var n int
- rtype := t.rtype
- flags := t.flags
+ rtype := t.Type
+ flags := t.Flag
// Iteratively dereference pointer types.
for rtype.Kind() == reflect.Pointer {
- // If this is actual indirect
- // memory, increase dereferences.
- if flags&reflect_flagIndir != 0 {
+ // If this actual indirect memory,
+ // increase dereferences counter.
+ if flags&xunsafe.Reflect_flagIndir != 0 {
n++
}
// Get next elem type.
rtype = rtype.Elem()
- // Get next set of dereferenced elem type flags.
- flags = reflect_pointer_elem_flags(flags, rtype)
+ // Get next set of dereferenced element type flags.
+ flags = xunsafe.ReflectPointerElemFlags(flags, rtype)
}
- // Wrap value as typenode.
- vt := t.next(rtype, flags)
+ // Wrap value as TypeIter.
+ vt := t.Child(rtype, flags)
// Get value format func.
fn := fmt.loadOrGet(vt)
@@ -38,7 +40,7 @@ func (fmt *Formatter) derefPointerType(t typenode) FormatFunc {
panic("unreachable")
}
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
if n <= 0 {
// No derefs are needed.
return func(s *State) {
@@ -83,7 +85,7 @@ func (fmt *Formatter) derefPointerType(t typenode) FormatFunc {
}
// Final type string with ptrs.
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
if n <= 0 {
// No derefs are needed.
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go b/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go
index f76e85410..e53fc5c4b 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/slice.go
@@ -1,18 +1,20 @@
package format
+import "codeberg.org/gruf/go-xunsafe"
+
// iterSliceType returns a FormatFunc capable of iterating
-// and formatting the given slice type currently in typenode{}.
+// and formatting the given slice type currently in TypeIter{}.
// note this will fetch a sub-FormatFunc for the slice element
// type, and also handle special cases of []byte, []rune slices.
-func (fmt *Formatter) iterSliceType(t typenode) FormatFunc {
+func (fmt *Formatter) iterSliceType(t xunsafe.TypeIter) FormatFunc {
// Get nested element type.
- elem := t.rtype.Elem()
+ elem := t.Type.Elem()
esz := elem.Size()
- // Get nested elem typenode with flags.
- flags := reflect_slice_elem_flags(elem)
- et := t.next(elem, flags)
+ // Get nested elem TypeIter{} with flags.
+ flags := xunsafe.ReflectSliceElemFlags(elem)
+ et := t.Child(elem, flags)
// Get elem format func.
fn := fmt.loadOrGet(et)
@@ -20,12 +22,12 @@ func (fmt *Formatter) iterSliceType(t typenode) FormatFunc {
panic("unreachable")
}
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
return func(s *State) {
ptr := s.P
// Get data as unsafe slice header.
- hdr := (*unsafeheader_Slice)(ptr)
+ hdr := (*xunsafe.Unsafeheader_Slice)(ptr)
if hdr == nil || hdr.Data == nil {
// Append nil.
@@ -57,14 +59,14 @@ func (fmt *Formatter) iterSliceType(t typenode) FormatFunc {
}
// Slice type string with ptrs / refs.
- typestrPtrs := t.typestr_with_ptrs()
- typestrRefs := t.typestr_with_refs()
+ typestrPtrs := typestr_with_ptrs(t)
+ typestrRefs := typestr_with_refs(t)
return func(s *State) {
ptr := s.P
// Get data as unsafe slice header.
- hdr := (*unsafeheader_Slice)(ptr)
+ hdr := (*xunsafe.Unsafeheader_Slice)(ptr)
if hdr == nil || hdr.Data == nil {
// Append nil value with type.
@@ -105,8 +107,8 @@ func (fmt *Formatter) iterSliceType(t typenode) FormatFunc {
}
}
-func wrapByteSlice(t typenode, fn FormatFunc) FormatFunc {
- if !t.needs_typestr() {
+func wrapByteSlice(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
+ if !needs_typestr(t) {
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
appendString(s, *(*string)(s.P))
@@ -115,7 +117,7 @@ func wrapByteSlice(t typenode, fn FormatFunc) FormatFunc {
}
}
}
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
if s.A.WithType() {
@@ -131,8 +133,8 @@ func wrapByteSlice(t typenode, fn FormatFunc) FormatFunc {
}
}
-func wrapRuneSlice(t typenode, fn FormatFunc) FormatFunc {
- if !t.needs_typestr() {
+func wrapRuneSlice(t xunsafe.TypeIter, fn FormatFunc) FormatFunc {
+ if !needs_typestr(t) {
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
appendString(s, string(*(*[]rune)(s.P)))
@@ -141,7 +143,7 @@ func wrapRuneSlice(t typenode, fn FormatFunc) FormatFunc {
}
}
}
- typestr := t.typestr_with_ptrs()
+ typestr := typestr_with_ptrs(t)
return func(s *State) {
if s.A.AsText() || s.A.AsQuotedText() || s.A.AsQuotedASCII() {
if s.A.WithType() {
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go b/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go
index cc1c8634d..617f65d81 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/struct.go
@@ -1,5 +1,7 @@
package format
+import "codeberg.org/gruf/go-xunsafe"
+
// field stores the minimum necessary
// data for iterating and formatting
// each field in a given struct.
@@ -10,23 +12,23 @@ type field struct {
}
// iterStructType returns a FormatFunc capable of iterating
-// and formatting the given struct type currently in typenode{}.
+// and formatting the given struct type currently in TypeIter{}.
// note this will fetch sub-FormatFuncs for each struct field.
-func (fmt *Formatter) iterStructType(t typenode) FormatFunc {
+func (fmt *Formatter) iterStructType(t xunsafe.TypeIter) FormatFunc {
// Number of struct fields.
- n := t.rtype.NumField()
+ n := t.Type.NumField()
// Gather format functions.
fields := make([]field, n)
for i := 0; i < n; i++ {
// Get struct field at index.
- sfield := t.rtype.Field(i)
+ sfield := t.Type.Field(i)
rtype := sfield.Type
- // Get nested field typenode with appropriate flags.
- flags := reflect_struct_field_flags(t.flags, rtype)
- ft := t.next(sfield.Type, flags)
+ // Get nested field TypeIter with appropriate flags.
+ flags := xunsafe.ReflectStructFieldFlags(t.Flag, rtype)
+ ft := t.Child(sfield.Type, flags)
// Get field format func.
fn := fmt.loadOrGet(ft)
@@ -53,8 +55,8 @@ func (fmt *Formatter) iterStructType(t typenode) FormatFunc {
}
}
-func emptyStructType(t typenode) FormatFunc {
- if !t.needs_typestr() {
+func emptyStructType(t xunsafe.TypeIter) FormatFunc {
+ if !needs_typestr(t) {
return func(s *State) {
// Append empty object.
s.B = append(s.B, "{}"...)
@@ -62,7 +64,7 @@ func emptyStructType(t typenode) FormatFunc {
}
// Struct type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
// Append empty object
// with type information.
@@ -74,12 +76,12 @@ func emptyStructType(t typenode) FormatFunc {
}
}
-func iterSingleFieldStructType(t typenode, field field) FormatFunc {
+func iterSingleFieldStructType(t xunsafe.TypeIter, field field) FormatFunc {
if field.format == nil {
panic("nil func")
}
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
return func(s *State) {
// Wrap 'fn' with braces + field name.
s.B = append(s.B, "{"+field.name+"="...)
@@ -89,7 +91,7 @@ func iterSingleFieldStructType(t typenode, field field) FormatFunc {
}
// Struct type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
return func(s *State) {
// Include type info.
@@ -104,14 +106,14 @@ func iterSingleFieldStructType(t typenode, field field) FormatFunc {
}
}
-func iterMultiFieldStructType(t typenode, fields []field) FormatFunc {
+func iterMultiFieldStructType(t xunsafe.TypeIter, fields []field) FormatFunc {
for _, field := range fields {
if field.format == nil {
panic("nil func")
}
}
- if !t.needs_typestr() {
+ if !needs_typestr(t) {
return func(s *State) {
ptr := s.P
@@ -139,7 +141,7 @@ func iterMultiFieldStructType(t typenode, fields []field) FormatFunc {
}
// Struct type string with refs.
- typestr := t.typestr_with_refs()
+ typestr := typestr_with_refs(t)
return func(s *State) {
ptr := s.P
diff --git a/vendor/codeberg.org/gruf/go-kv/v2/format/type.go b/vendor/codeberg.org/gruf/go-kv/v2/format/type.go
index ec5557b05..ce2235c88 100644
--- a/vendor/codeberg.org/gruf/go-kv/v2/format/type.go
+++ b/vendor/codeberg.org/gruf/go-kv/v2/format/type.go
@@ -3,58 +3,17 @@ package format
import (
"reflect"
"strings"
-)
-
-// typenode ...
-type typenode struct {
- typeinfo
- parent *typenode
-}
-
-// typeinfo ...
-type typeinfo struct {
- rtype reflect.Type
- flags reflect_flag
-}
-
-// new_typenode returns a new typenode{} with reflect.Type and flags.
-func new_typenode(t reflect.Type, flags reflect_flag) typenode {
- return typenode{typeinfo: typeinfo{
- rtype: t,
- flags: flags,
- }}
-}
-// key returns data (i.e. type value info)
-// to store a FormatFunc under in a cache.
-func (n typenode) key() typeinfo {
- return n.typeinfo
-}
-
-// indirect returns whether reflect_flagIndir is set for given type flags.
-func (n typenode) indirect() bool {
- return n.flags&reflect_flagIndir != 0
-}
-
-// iface_indir returns the result of abi.Type{}.IfaceIndir() for underlying type.
-func (n typenode) iface_indir() bool {
- return abi_Type_IfaceIndir(n.rtype)
-}
-
-// next ...
-func (n typenode) next(t reflect.Type, flags reflect_flag) typenode {
- child := new_typenode(t, flags)
- child.parent = &n
- return child
-}
+ "codeberg.org/gruf/go-xunsafe"
+)
// visit ...
-func (n typenode) visit() bool {
- t := n.rtype
+func visit(iter xunsafe.TypeIter) bool {
+ t := iter.Type
// Check if type is already encountered further up tree.
- for node := n.parent; node != nil; node = node.parent {
- if node.rtype == t {
+ for node := iter.Parent; node != nil; node = node.Parent {
+ if node.Type == t {
return false
}
}
@@ -63,16 +22,16 @@ func (n typenode) visit() bool {
}
// needs_typestr returns whether the type contained in the
-// receiving typenode{} needs type string information prefixed
+// receiving TypeIter{} needs type string information prefixed
// when the TypeMask argument flag bit is set. Certain types
// don't need this as the parent type already indicates this.
-func (n typenode) needs_typestr() bool {
- if n.parent == nil {
+func needs_typestr(iter xunsafe.TypeIter) bool {
+ if iter.Parent == nil {
return true
}
- switch p := n.parent.rtype; p.Kind() {
+ switch p := iter.Parent.Type; p.Kind() {
case reflect.Pointer:
- return n.parent.needs_typestr()
+ return needs_typestr(*iter.Parent)
case reflect.Slice,
reflect.Array,
reflect.Map:
@@ -83,17 +42,17 @@ func (n typenode) needs_typestr() bool {
}
// typestr_with_ptrs returns the type string for
-// current typenode{} with asterisks for pointers.
-func (n typenode) typestr_with_ptrs() string {
- t := n.rtype
+// current xunsafe.TypeIter{} with asterisks for pointers.
+func typestr_with_ptrs(iter xunsafe.TypeIter) string {
+ t := iter.Type
// Check for parent.
- if n.parent == nil {
+ if iter.Parent == nil {
return t.String()
}
// Get parent type.
- p := n.parent.rtype
+ p := iter.Parent.Type
// If parent is not ptr, then
// this was not a deref'd ptr.
@@ -107,17 +66,17 @@ func (n typenode) typestr_with_ptrs() string {
}
// typestr_with_refs returns the type string for
-// current typenode{} with ampersands for pointers.
-func (n typenode) typestr_with_refs() string {
- t := n.rtype
+// current xunsafe.TypeIter{} with ampersands for pointers.
+func typestr_with_refs(iter xunsafe.TypeIter) string {
+ t := iter.Type
// Check for parent.
- if n.parent == nil {
+ if iter.Parent == nil {
return t.String()
}
// Get parent type.
- p := n.parent.rtype
+ p := iter.Parent.Type
var d int