public ReaderEnumerator(IPersistentStorage storage, PostingListAddress address) { this.persistentStorage = storage; this.address = address; this.buffer = new byte[ReadBufferSize]; this.selectors = new int[4]; this.data = null; this.dataIndex = 0; Reset(); }
private int NextInteger() { if (data == null || dataIndex >= data.Length) { data = ReadPacked(); dataIndex = 0; } return(data.Get(dataIndex++)); }
public void Reset() { state = 0; dataInBuffer = 0; indxInBuffer = 0; readOffset = address.Offset; isEof = false; listEndOffset = 0; continuationOffset = 0; data = null; dataIndex = 0; }
public bool MoveNext() { while (true) { if (state == 0) { if (continuationOffset > 0) { readOffset = continuationOffset; isEof = false; dataInBuffer = 0; indxInBuffer = 0; } if (isEof) { return(false); } var headerBuffer = new byte[HeaderLength]; persistentStorage.ReadAll(readOffset, headerBuffer, 0, headerBuffer.Length); continuationOffset = BitConverter.ToInt64(headerBuffer, 0); listEndOffset = readOffset + HeaderLength + BitConverter.ToInt32(headerBuffer, sizeof(long)); readOffset += headerBuffer.Length; state = 1; data = null; dataIndex = 0; } if (state == 1) { current = Occurrence.O((ulong)NextInteger(), (ulong)NextInteger(), (ulong)NextInteger()); state = 2; return(true); } if (state == 2) { if (isEof && indxInBuffer >= dataInBuffer && (data == null || dataIndex >= data.Length)) { state = 0; } else { deltaSelector = (uint)NextInteger(); if (deltaSelector == 0) { state = 0; } else { state = 3; } } } if (state == 3) { int delta = (int)(deltaSelector & 0b00000011); deltaSelector >>= 2; switch (delta) { case 0: { throw new Exception("Zero delta is not used, see comments in DeltaWriter"); } case 1: { var deltaToken = (ulong)NextInteger(); current = Occurrence.O(current.DocumentId, current.FieldId, current.TokenId + deltaToken); break; } case 2: { var deltaFieldId = (ulong)NextInteger(); var token = (ulong)NextInteger(); current = Occurrence.O(current.DocumentId, current.FieldId + deltaFieldId, token); break; } case 3: { var deltaDocId = (ulong)NextInteger(); var fieldId = (ulong)NextInteger(); var token = (ulong)NextInteger(); current = Occurrence.O(current.DocumentId + deltaDocId, fieldId, token); break; } default: { throw new Exception("Something wrong"); } } if (deltaSelector == 0) { state = 2; } return(true); } } }