private int TranslateClosestForwardWithoutMidpoints(ReaderWorkItem workItem, long pos, long startIndex, long endIndex) { PosMap res = ReadPosMap(workItem, endIndex); // to allow backward reading of the last record, forward read will decline anyway if (pos > res.LogPos) { return(Chunk.PhysicalDataSize); } long low = startIndex; long high = endIndex; while (low < high) { var mid = low + (high - low) / 2; var v = ReadPosMap(workItem, mid); if (v.LogPos < pos) { low = mid + 1; } else { high = mid; res = v; } } return(res.ActualPos); }
private IEnumerable<PosMap> ReadPosMap(ReaderWorkItem workItem, long index, int count) { if (Chunk.ChunkFooter.IsMap12Bytes) { var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.FullSize; workItem.Stream.Seek(pos, SeekOrigin.Begin); for (int i = 0; i < count; i++) yield return PosMap.FromNewFormat(workItem.Reader); } else { var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.DeprecatedSize; workItem.Stream.Seek(pos, SeekOrigin.Begin); for (int i = 0; i < count; i++) yield return PosMap.FromOldFormat(workItem.Reader); } }
private PosMap ReadPosMap(ReaderWorkItem workItem, long index) { if (Chunk.ChunkFooter.IsMap12Bytes) { var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.FullSize; workItem.Stream.Seek(pos, SeekOrigin.Begin); return(PosMap.FromNewFormat(workItem.Reader)); } else { var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.DeprecatedSize; workItem.Stream.Seek(pos, SeekOrigin.Begin); return(PosMap.FromOldFormat(workItem.Reader)); } }
public Midpoint(int itemIndex, PosMap posmap) { ItemIndex = itemIndex; LogPos = posmap.LogPos; }