summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-mangler/v2/slice.go
diff options
context:
space:
mode:
authorLibravatar kim <grufwub@gmail.com>2025-08-21 16:41:50 +0200
committerLibravatar kim <gruf@noreply.codeberg.org>2025-08-21 16:41:50 +0200
commita79f83cbded3fb1165b338ce316dc9f2217467ff (patch)
tree4b4a2b7084aced51c0a691cee6352b4ecae90df8 /vendor/codeberg.org/gruf/go-mangler/v2/slice.go
parent[chore] bump golangci-lint version in CI, disable var-naming package name che... (diff)
downloadgotosocial-a79f83cbded3fb1165b338ce316dc9f2217467ff.tar.xz
[chore] update dependencies (#4386)
- codeberg.org/gruf/go-bytesize v1.0.3 -> v1.0.4 - codeberg.org/gruf/go-kv/v2 v2.0.6 -> v2.0.7 - codeberg.org/gruf/go-mutexes v1.5.2 -> v1.5.3 - codeberg.org/gruf/go-structr v0.9.7 -> v0.9.8 - codeberg.org/gruf/go-ffmpreg v0.6.8 -> v0.6.9 - github.com/tomnomnom/linkheader HEAD@2018 -> HEAD@2025 all of the above codeberg.org/gruf updates are in preparation for Go1.25, except for bytesize, and also ffmpreg which is a rebuild with the latest version of ffmpeg (v5.1.7) Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4386 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/codeberg.org/gruf/go-mangler/v2/slice.go')
-rw-r--r--vendor/codeberg.org/gruf/go-mangler/v2/slice.go95
1 files changed, 95 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-mangler/v2/slice.go b/vendor/codeberg.org/gruf/go-mangler/v2/slice.go
new file mode 100644
index 000000000..0a68c0575
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-mangler/v2/slice.go
@@ -0,0 +1,95 @@
+package mangler
+
+import (
+ "reflect"
+ "unsafe"
+
+ "codeberg.org/gruf/go-xunsafe"
+)
+
+// iterSliceType returns a Mangler capable of iterating
+// and mangling the given slice type currently in TypeIter{}.
+// note this will fetch sub-Mangler for slice element type.
+func iterSliceType(t xunsafe.TypeIter) Mangler {
+
+ // Get nested element type.
+ elem := t.Type.Elem()
+ esz := elem.Size()
+
+ // Get nested elem TypeIter{} with flags.
+ flags := xunsafe.ReflectSliceElemFlags(elem)
+ et := t.Child(elem, flags)
+
+ // Prefer to use a known slice mangler func.
+ if fn := mangleKnownSlice(et); fn != nil {
+ return fn
+ }
+
+ // Get elem mangler.
+ fn := loadOrGet(et)
+ if fn == nil {
+ return nil
+ }
+
+ return func(buf []byte, ptr unsafe.Pointer) []byte {
+ // Get data as unsafe slice header.
+ hdr := (*xunsafe.Unsafeheader_Slice)(ptr)
+ if hdr == nil || hdr.Data == nil {
+
+ // Append nil indicator.
+ buf = append(buf, '0')
+ return buf
+ }
+
+ // Append not-nil flag.
+ buf = append(buf, '1')
+
+ for i := 0; i < hdr.Len; i++ {
+ // Mangle at array index.
+ offset := esz * uintptr(i)
+ ptr = add(hdr.Data, offset)
+ buf = fn(buf, ptr)
+ buf = append(buf, ',')
+ }
+
+ if hdr.Len > 0 {
+ // Drop final comma.
+ buf = buf[:len(buf)-1]
+ }
+
+ return buf
+ }
+}
+
+// mangleKnownSlice loads a Mangler function for a
+// known slice-of-element type (in this case, primtives).
+func mangleKnownSlice(t xunsafe.TypeIter) Mangler {
+ switch t.Type.Kind() {
+ case reflect.String:
+ return mangle_string_slice
+ case reflect.Bool:
+ return mangle_bool_slice
+ case reflect.Int,
+ reflect.Uint,
+ reflect.Uintptr:
+ return mangle_int_slice
+ case reflect.Int8, reflect.Uint8:
+ return mangle_8bit_slice
+ case reflect.Int16, reflect.Uint16:
+ return mangle_16bit_slice
+ case reflect.Int32, reflect.Uint32:
+ return mangle_32bit_slice
+ case reflect.Int64, reflect.Uint64:
+ return mangle_64bit_slice
+ case reflect.Float32:
+ return mangle_32bit_slice
+ case reflect.Float64:
+ return mangle_64bit_slice
+ case reflect.Complex64:
+ return mangle_64bit_slice
+ case reflect.Complex128:
+ return mangle_128bit_slice
+ default:
+ return nil
+ }
+}