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; }