mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 21:22:25 -05:00 
			
		
		
		
	
		
			
	
	
		
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			56 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package mangler | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"unsafe" | ||
|  | 
 | ||
|  | 	"codeberg.org/gruf/go-xunsafe" | ||
|  | ) | ||
|  | 
 | ||
|  | // iterArrayType returns a Mangler capable of iterating | ||
|  | // and mangling the given array type currently in TypeIter{}. | ||
|  | // note this will fetch sub-Mangler for array element type. | ||
|  | func iterArrayType(t xunsafe.TypeIter) Mangler { | ||
|  | 
 | ||
|  | 	// Array element type. | ||
|  | 	elem := t.Type.Elem() | ||
|  | 
 | ||
|  | 	// Get nested elem TypeIter with appropriate flags. | ||
|  | 	flags := xunsafe.ReflectArrayElemFlags(t.Flag, elem) | ||
|  | 	et := t.Child(elem, flags) | ||
|  | 
 | ||
|  | 	// Get elem mangler. | ||
|  | 	fn := loadOrGet(et) | ||
|  | 	if fn == nil { | ||
|  | 		return nil | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Array element in-memory size. | ||
|  | 	esz := t.Type.Elem().Size() | ||
|  | 
 | ||
|  | 	// No of elements. | ||
|  | 	n := t.Type.Len() | ||
|  | 	switch n { | ||
|  | 	case 0: | ||
|  | 		return empty_mangler | ||
|  | 	case 1: | ||
|  | 		return fn | ||
|  | 	default: | ||
|  | 		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 = fn(buf, eptr) | ||
|  | 				buf = append(buf, ',') | ||
|  | 			} | ||
|  | 
 | ||
|  | 			if n > 0 { | ||
|  | 				// Drop final comma. | ||
|  | 				buf = buf[:len(buf)-1] | ||
|  | 			} | ||
|  | 
 | ||
|  | 			return buf | ||
|  | 		} | ||
|  | 	} | ||
|  | } |