mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-03 20:02:27 -06:00 
			
		
		
		
	
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			687 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			687 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package puddle
 | 
						|
 | 
						|
import "unsafe"
 | 
						|
 | 
						|
type ints interface {
 | 
						|
	int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64
 | 
						|
}
 | 
						|
 | 
						|
// log2Int returns log2 of an integer. This function panics if val < 0. For val
 | 
						|
// == 0, returns 0.
 | 
						|
func log2Int[T ints](val T) uint8 {
 | 
						|
	if val <= 0 {
 | 
						|
		panic("log2 of non-positive number does not exist")
 | 
						|
	}
 | 
						|
 | 
						|
	return log2IntRange(val, 0, uint8(8*unsafe.Sizeof(val)))
 | 
						|
}
 | 
						|
 | 
						|
func log2IntRange[T ints](val T, begin, end uint8) uint8 {
 | 
						|
	length := end - begin
 | 
						|
	if length == 1 {
 | 
						|
		return begin
 | 
						|
	}
 | 
						|
 | 
						|
	delim := begin + length/2
 | 
						|
	mask := T(1) << delim
 | 
						|
	if mask > val {
 | 
						|
		return log2IntRange(val, begin, delim)
 | 
						|
	} else {
 | 
						|
		return log2IntRange(val, delim, end)
 | 
						|
	}
 | 
						|
}
 |