You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							29 lines
						
					
					
						
							996 B
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							29 lines
						
					
					
						
							996 B
						
					
					
				| package idx | |
| 
 | |
| import ( | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/types" | |
| ) | |
| 
 | |
| // FirstInvalidIndex find the first index the failed lessThanOrEqualToFn function's requirement. | |
| func FirstInvalidIndex(bytes []byte, lessThanOrEqualToFn func(key types.NeedleId, offset types.Offset, size types.Size) (bool, error)) (int, error) { | |
| 	left, right := 0, len(bytes)/types.NeedleMapEntrySize-1 | |
| 	index := right + 1 | |
| 	for left <= right { | |
| 		mid := left + (right-left)>>1 | |
| 		loc := mid * types.NeedleMapEntrySize | |
| 		key := types.BytesToNeedleId(bytes[loc : loc+types.NeedleIdSize]) | |
| 		offset := types.BytesToOffset(bytes[loc+types.NeedleIdSize : loc+types.NeedleIdSize+types.OffsetSize]) | |
| 		size := types.BytesToSize(bytes[loc+types.NeedleIdSize+types.OffsetSize : loc+types.NeedleIdSize+types.OffsetSize+types.SizeSize]) | |
| 		res, err := lessThanOrEqualToFn(key, offset, size) | |
| 		if err != nil { | |
| 			return -1, err | |
| 		} | |
| 		if res { | |
| 			left = mid + 1 | |
| 		} else { | |
| 			index = mid | |
| 			right = mid - 1 | |
| 		} | |
| 	} | |
| 	return index, nil | |
| }
 |