HexPosition GetStartOfDataCore(HexPosition start, bool validData) {
var bestGuess = start;
var pos = start;
ulong d = 0x10000;
while (pos > HexPosition.Zero) {
var testPos = pos >= d ? pos - d : HexPosition.Zero;
var info = GetSpanInfo(testPos);
if (d < ulong.MaxValue)
d <<= 1;
if (info.HasData == validData && info.Span.End >= bestGuess) {
bestGuess = info.Span.Start;
pos = info.Span.Start;
continue;
}
if (info.HasData != validData && info.Span.End == bestGuess)
return bestGuess;
pos = info.Span.End;
var lastCorrectDataPos = info.HasData == validData ? info.Span.Start : (HexPosition?)null;
bool foundOppositeData = info.HasData != validData;
for (;;) {
if (pos >= bestGuess)
return lastCorrectDataPos ?? bestGuess;
info = GetSpanInfo(pos);
if (info.HasData == validData) {
if (lastCorrectDataPos == null)
lastCorrectDataPos = info.Span.Start;
}
else {
lastCorrectDataPos = null;
foundOppositeData = true;
}
if (info.Span.End >= bestGuess) {
pos = lastCorrectDataPos ?? bestGuess;
if (foundOppositeData)
return pos;
bestGuess = pos;
break;
}
pos = info.Span.End;
}
}
return bestGuess;
}