diff options
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mangler/helpers.go')
-rw-r--r-- | vendor/codeberg.org/gruf/go-mangler/helpers.go | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/vendor/codeberg.org/gruf/go-mangler/helpers.go b/vendor/codeberg.org/gruf/go-mangler/helpers.go deleted file mode 100644 index 4e37e1344..000000000 --- a/vendor/codeberg.org/gruf/go-mangler/helpers.go +++ /dev/null @@ -1,200 +0,0 @@ -package mangler - -import ( - "reflect" - "unsafe" -) - -func append_uint16(b []byte, u uint16) []byte { - return append(b, // LE - byte(u), - byte(u>>8), - ) -} - -func append_uint32(b []byte, u uint32) []byte { - return append(b, // LE - byte(u), - byte(u>>8), - byte(u>>16), - byte(u>>24), - ) -} - -func append_uint64(b []byte, u uint64) []byte { - return append(b, // LE - byte(u), - byte(u>>8), - byte(u>>16), - byte(u>>24), - byte(u>>32), - byte(u>>40), - byte(u>>48), - byte(u>>56), - ) -} - -type typecontext struct { - ntype reflect.Type - rtype reflect.Type -} - -func deref_ptr_mangler(ctx typecontext, mangle Mangler, n uint) Mangler { - if mangle == nil || n == 0 { - panic("bad input") - } - - // Non-nested value types, - // i.e. just direct ptrs to - // primitives require one - // less dereference to ptr. - if ctx.ntype == nil { - n-- - } - - return func(buf []byte, ptr unsafe.Pointer) []byte { - - // Deref n number times. - for i := n; i > 0; i-- { - - if ptr == nil { - // Check for nil values - buf = append(buf, '0') - return buf - } - - // Further deref ptr - buf = append(buf, '1') - ptr = *(*unsafe.Pointer)(ptr) - } - - if ptr == nil { - // Final nil val check - buf = append(buf, '0') - return buf - } - - // Mangle fully deref'd - buf = append(buf, '1') - buf = mangle(buf, ptr) - return buf - } -} - -func iter_slice_mangler(ctx typecontext, mangle Mangler) Mangler { - if ctx.rtype == nil || mangle == nil { - panic("bad input") - } - - // memory size of elem. - esz := ctx.rtype.Size() - - return func(buf []byte, ptr unsafe.Pointer) []byte { - // Get data as slice hdr. - hdr := (*slice_header)(ptr) - - for i := 0; i < hdr.len; i++ { - // Mangle data at slice index. - eptr := array_at(hdr.data, esz, i) - buf = mangle(buf, eptr) - buf = append(buf, ',') - } - - if hdr.len > 0 { - // Drop final comma. - buf = buf[:len(buf)-1] - } - - return buf - } -} - -func iter_array_mangler(ctx typecontext, mangle Mangler) Mangler { - if ctx.rtype == nil || mangle == nil { - panic("bad input") - } - - // no. array elements. - n := ctx.ntype.Len() - - // memory size of elem. - esz := ctx.rtype.Size() - - return func(buf []byte, ptr unsafe.Pointer) []byte { - for i := 0; i < n; i++ { - // Mangle data at array index. - offset := esz * uintptr(i) - eptr := add(ptr, offset) - buf = mangle(buf, eptr) - buf = append(buf, ',') - } - - if n > 0 { - // Drop final comma. - buf = buf[:len(buf)-1] - } - - return buf - } -} - -func iter_struct_mangler(ctx typecontext, manglers []Mangler) Mangler { - if ctx.rtype == nil || len(manglers) != ctx.rtype.NumField() { - panic("bad input") - } - - type field struct { - mangle Mangler - offset uintptr - } - - // Bundle together the fields and manglers. - fields := make([]field, ctx.rtype.NumField()) - for i := range fields { - rfield := ctx.rtype.FieldByIndex([]int{i}) - fields[i].offset = rfield.Offset - fields[i].mangle = manglers[i] - if fields[i].mangle == nil { - panic("bad input") - } - } - - return func(buf []byte, ptr unsafe.Pointer) []byte { - for i := range fields { - // Get struct field ptr via offset. - fptr := add(ptr, fields[i].offset) - - // Mangle the struct field data. - buf = fields[i].mangle(buf, fptr) - buf = append(buf, ',') - } - - if len(fields) > 0 { - // Drop final comma. - buf = buf[:len(buf)-1] - } - - return buf - } -} - -// array_at returns ptr to index in array at ptr, given element size. -func array_at(ptr unsafe.Pointer, esz uintptr, i int) unsafe.Pointer { - return unsafe.Pointer(uintptr(ptr) + esz*uintptr(i)) -} - -// 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) -} - -type slice_header struct { - data unsafe.Pointer - len int - cap int -} - -func eface_data(a any) unsafe.Pointer { - type eface struct{ _, data unsafe.Pointer } - return (*eface)(unsafe.Pointer(&a)).data -} |