private (long offset, int size) Append(TKey key, TValue value) { var keyBytes = keySerializer.GetBytes(key); var valueBytes = valueSerializer.GetBytes(value); var offsetStart = dataStorage.Length; var offset = offsetStart; dataStorage.WriteAll(offset, BitConverter.GetBytes(keyBytes.Length), 0, sizeof(int)); offset += sizeof(int); dataStorage.WriteAll(offset, keyBytes, 0, keyBytes.Length); offset += keyBytes.Length; dataStorage.WriteAll(offset, BitConverter.GetBytes(valueBytes.Length), 0, sizeof(int)); offset += sizeof(int); dataStorage.WriteAll(offset, valueBytes, 0, valueBytes.Length); offset += valueBytes.Length; // Link dataStorage.WriteAll(offset, BitConverter.GetBytes(0L), 0, sizeof(long)); offset += sizeof(long); dataStorage.WriteAll(offset, BitConverter.GetBytes(0), 0, sizeof(int)); offset += sizeof(int); checked { return(offsetStart, (int)(offset - offsetStart)); } }
public TValue this[long index] { get { var offset = linearIndex[index]; if (offset == 0) { throw new ArgumentOutOfRangeException(nameof(index)); } dataStorage.ReadAll(offset, sizeBuffer, 0, sizeBuffer.Length); int dataSize = BitConverter.ToInt32(sizeBuffer, 0); //TODO: Improve serializer, no need to reallocate if (valueBuffer == null || valueBuffer.Length != dataSize) { valueBuffer = new byte[dataSize]; } dataStorage.ReadAll(offset + sizeBuffer.Length, valueBuffer, 0, valueBuffer.Length); return(valueSerializer.GetValue(valueBuffer)); } set { var offset = linearIndex[index]; if (offset == 0) { offset = dataStorage.Length; linearIndex[index] = dataStorage.Length; } var data = valueSerializer.GetBytes(value); var dataSize = BitConverter.GetBytes(data.Length); dataStorage.WriteAll(offset, dataSize, 0, dataSize.Length); dataStorage.WriteAll(offset + dataSize.Length, data, 0, data.Length); } }