public void EncodeTo(LogWriter writer)
        {
            writer.RecordStarted();

            if (HasComparator)
            {
	            writer.Write7BitEncodedInt((int)Tag.Comparator);
	            writer.WriteLengthPrefixedSlice(Comparator);
            }

            if (LogNumber.HasValue)
            {
	            writer.Write7BitEncodedInt((int)Tag.LogNumber);
				writer.Write7BitEncodedLong((long)LogNumber.Value);
            }

            if (PrevLogNumber.HasValue)
            {
				writer.Write7BitEncodedInt((int)Tag.PrevLogNumber);
				writer.Write7BitEncodedLong((long)PrevLogNumber.Value);
            }

            if (NextFileNumber.HasValue)
            {
				writer.Write7BitEncodedInt((int)Tag.NextFileNumber);
				writer.Write7BitEncodedLong((long)NextFileNumber.Value);
            }

            if (LastSequence.HasValue)
            {
				writer.Write7BitEncodedInt((int)Tag.LastSequence);
				writer.Write7BitEncodedLong((long)LastSequence.Value);
            }

            for (int level = 0; level < Config.NumberOfLevels; level++)
            {
                foreach (var compactionPointer in CompactionPointers[level])
                {
					writer.Write7BitEncodedInt((int)Tag.CompactPointer);
					writer.Write7BitEncodedInt(level);
					writer.WriteLengthPrefixedInternalKey(compactionPointer);
                }

                foreach (var fileNumber in DeletedFiles[level])
                {
					writer.Write7BitEncodedInt((int)Tag.DeletedFile);
					writer.Write7BitEncodedInt(level);
					writer.Write7BitEncodedLong((long)fileNumber);
                }

                foreach (var fileMetadata in NewFiles[level])
                {
					writer.Write7BitEncodedInt((int)Tag.NewFile);
					writer.Write7BitEncodedInt(level);
					writer.Write7BitEncodedLong((long)fileMetadata.FileNumber);
					writer.Write7BitEncodedLong(fileMetadata.FileSize);
					writer.WriteLengthPrefixedInternalKey(fileMetadata.SmallestKey);
					writer.WriteLengthPrefixedInternalKey(fileMetadata.LargestKey);
                }
            }

	        writer.RecordCompleted(true);
        }
		public static async Task WriteRecordAsync(LogWriter logWriterStream, byte[] buffer)
		{
			logWriterStream.RecordStarted();
			await logWriterStream.WriteAsync(buffer, 0, buffer.Length);
			logWriterStream.RecordCompleted(true);
		}