private void ExtractMetadata(List <object> row, CompressedHeader header)
        {
            var blockTypes = header.BlockTypes[category].TypeCount;

            var map = category switch {
                Category.Literal => header.LiteralCtxMap,
                Category.Distance => header.DistanceCtxMap,
                _ => throw new InvalidOperationException("Invalid context map category: " + category)
            };

            row.Add(blockTypes);
            row.Add(map.TreeCount);

            StringBuilder builder = new StringBuilder();

            for (int blockID = 0; blockID < blockTypes; blockID++)
            {
                for (int contextID = 0; contextID < map.ContextsPerBlockType; contextID++)
                {
                    builder.Append(map.DetermineTreeID(blockID, contextID));
                    builder.Append(',');
                }
            }

            builder.Length -= 1;
            row.Add(builder.ToString());
        }
    }
        private static void ExtractMetadata(List <object> row, CompressedHeader header, CompressedData data)
        {
            row.Add(header.DistanceParameters.PostfixBitCount);
            row.Add(header.DistanceParameters.DirectCodeCount);

            var lcm = header.LiteralCtxModes;

            // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
            if (Enumerable.Range(1, lcm.Count - 1).All(index => lcm[index] == lcm[0]))
            {
                row.Add(lcm[0].ToString());
            }
            else
            {
                row.Add(string.Join(',', lcm.Select(mode => mode.ToString())));
            }

            foreach (var category in Categories.LID)
            {
                row.Add(header.BlockTypes[category].TypeCount);
            }

            row.Add(header.LiteralTrees.Count);
            row.Add(header.InsertCopyTrees.Count);
            row.Add(header.DistanceTrees.Count);

            foreach (var category in Categories.LID)
            {
                row.Add(data.BlockSwitchCommands[category].Count);
            }

            row.Add(data.InsertCopyCommands.Count);
        }
 public Compressed(DataLength dataLength, CompressedHeader header, CompressedData data) : base(dataLength)
 {
     this.Header = header;
     this.Data   = data;
 }