mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 12:52:25 -05: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)
 | |
| 	}
 | |
| }
 |