private IValueCodec WriteMetadataCore <T>(Stream stream, Schema schema, int col, string kind, ColumnType type, out CompressionKind compressionKind) { _host.Assert(typeof(T) == type.RawType); IValueCodec generalCodec; if (!_factory.TryGetCodec(type, out generalCodec)) { compressionKind = default(CompressionKind); return(null); } IValueCodec <T> codec = (IValueCodec <T>)generalCodec; T value = default(T); schema[col].Metadata.GetValue(kind, ref value); // Metadatas will often be pretty small, so that compression makes no sense. // We try both a compressed and uncompressed version of metadata and // opportunistically pick whichever is smallest. MemoryStream uncompressedMem = _memPool.Get(); using (IValueWriter <T> writer = codec.OpenWriter(uncompressedMem)) { writer.Write(in value); writer.Commit(); } MemoryStream compressedMem = _memPool.Get(); ArraySegment <byte> buffer; bool tmp = uncompressedMem.TryGetBuffer(out buffer); _host.Assert(tmp); using (Stream compressStream = _compression.CompressStream(compressedMem)) compressStream.Write(buffer.Array, buffer.Offset, buffer.Count); if (uncompressedMem.Length <= compressedMem.Length) { // Write uncompressed. compressionKind = CompressionKind.None; } else { // Write compressed. compressionKind = _compression; tmp = compressedMem.TryGetBuffer(out buffer); _host.Assert(tmp); } stream.Write(buffer.Array, buffer.Offset, buffer.Count); _memPool.Return(ref uncompressedMem); _memPool.Return(ref compressedMem); return(codec); }