Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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);
            }
        }