private static long?BinarySearchBlockNumber(long left, long right, Func <long, bool> isBlockFound, BinarySearchDirection direction = BinarySearchDirection.Up) { if (left > right) { return(null); } long?result = null; while (left != right) { long index = direction == BinarySearchDirection.Up ? left + (right - left) / 2 : right - (right - left) / 2; if (isBlockFound(index)) { result = index; if (direction == BinarySearchDirection.Up) { left = index + 1; } else { right = index - 1; } } else { if (direction == BinarySearchDirection.Up) { right = index; } else { left = index; } } } if (isBlockFound(left)) { result = direction == BinarySearchDirection.Up ? left : right; } return(result); }
public static ulong?Search(ulong left, ulong right, Func <ulong, bool> isLeafFound, BinarySearchDirection direction = BinarySearchDirection.Up) { if (left > right) { return(null); } ulong?result = null; while (left < right) { ulong index = direction == BinarySearchDirection.Up ? left + (right - left) / 2 : right - (right - left) / 2; if (isLeafFound(index)) { result = index; if (direction == BinarySearchDirection.Up) { left = index + 1; } else { right = index - 1; } } else { if (direction == BinarySearchDirection.Up) { right = index; } else { left = index; } } } if (isLeafFound(left)) { result = direction == BinarySearchDirection.Up ? left : right; } return(result); }