private int NextInteger() { if (selectorIndex == 4) { if (!EnsureBuffer(1)) { throw new Exception("Wrong data"); } int selector = (int)buffer[indxInBuffer++]; selectors[3] = (selector & 0b11) + 1; selectors[2] = ((selector >> 2) & 0b11) + 1; selectors[1] = ((selector >> 4) & 0b11) + 1; selectors[0] = ((selector >> 6) & 0b11) + 1; selectorIndex = 0; } if (!EnsureBuffer(selectors[selectorIndex])) { throw new Exception("Wrong data"); } var result = GroupVarint.ReadInt(buffer, indxInBuffer, selectors[selectorIndex]); indxInBuffer += selectors[selectorIndex]; selectorIndex++; return(result); }
public bool MoveNext() { while (true) { if (state == 0) { if (continuationOffset > 0) { readOffset = continuationOffset; isEof = false; dataInBuffer = 0; indxInBuffer = 0; } if (isEof) { return(false); } var buffer = new byte[HeaderLength]; persistentStorage.ReadAll(readOffset, buffer, 0, buffer.Length); continuationOffset = BitConverter.ToInt64(buffer, 0); listEndOffset = readOffset + HeaderLength + BitConverter.ToInt32(buffer, sizeof(long)); readOffset += buffer.Length; state = 1; } if (state == 1) { if (!ReadSelectors()) { throw new Exception("Wrong data"); } EnsureBuffer(selector1 + selector2 + selector3); var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1); indxInBuffer += selector1; var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2); indxInBuffer += selector2; var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3); indxInBuffer += selector3; state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 4; current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId); return(true); } if (state == 4) { EnsureBuffer(selector4); var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4); indxInBuffer += selector4; if (!ReadSelectors()) { throw new Exception("Wrong data"); } EnsureBuffer(selector1 + selector2); var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1); indxInBuffer += selector1; var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2); indxInBuffer += selector2; state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 3; current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId); return(true); } if (state == 3) { EnsureBuffer(selector3 + selector4); var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3); indxInBuffer += selector3; var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4); indxInBuffer += selector4; if (!ReadSelectors()) { throw new Exception("Wrong data"); } EnsureBuffer(selector1); var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector1); indxInBuffer += selector1; state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 2; current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId); return(true); } if (state == 2) { EnsureBuffer(selector2 + selector3 + selector4); var docId = GroupVarint.ReadInt(buffer, indxInBuffer, selector2); indxInBuffer += selector2; var fieldId = GroupVarint.ReadInt(buffer, indxInBuffer, selector3); indxInBuffer += selector3; var tokenId = GroupVarint.ReadInt(buffer, indxInBuffer, selector4); indxInBuffer += selector4; state = (isEof && indxInBuffer >= dataInBuffer) ? 0 : 1; current = Occurrence.O((ulong)docId, (ulong)fieldId, (ulong)tokenId); return(true); } throw new Exception("What?"); } }