public static O ReadValue <T, O>(this IMarkedBitReader reader, HuffmanNode <T> tree, string name, Func <T, O> mapper) where T : IComparable <T> { reader.MarkStart(); O result = mapper(tree.LookupValue(reader)); reader.MarkEndValue(name, result !); return(result); }
/// <summary> /// Returns lengths of paths that are needed to encode exactly <paramref name="symbolCount"/> symbols. /// If <paramref name="symbolCount"/> equals 4, another bit is consumed from the <paramref name="reader"/> to determine the correct lengths. /// </summary> private static byte[] DetermineSimpleCodeLengths(IMarkedBitReader reader, int symbolCount) { return(symbolCount switch { 1 => new byte[] { 0 }, 2 => new byte[] { 1, 1 }, 3 => new byte[] { 1, 2, 2 }, 4 => reader.NextBit("tree-select") ? new byte[] { 1, 2, 3, 3 } : new byte[] { 2, 2, 2, 2 }, _ => throw new ArgumentOutOfRangeException(nameof(symbolCount), "The amount of symbols in a simple code must be in the range [1; 4]."), });
public static T MarkTitle <T>(this IMarkedBitReader reader, string title, Func <T> action) { reader.MarkStart(); T result = action(); reader.MarkEndTitle(title); return(result); }
public static byte NextAlignedByte(this IMarkedBitReader reader, string name) { reader.MarkStart(); byte result = reader.NextAlignedByte(); reader.MarkEndValue(name, new Literal(result)); return(result); }
// Complex structures public static O ReadValue <T, C, O>(this IMarkedBitReader reader, BitDeserializer <T, C> deserialize, C context, string name, Func <T, O> mapper) { reader.MarkStart(); O result = mapper(deserialize(reader, context)); reader.MarkEndValue(name, result !); return(result); }
public static int NextChunk(this IMarkedBitReader reader, int bits, string name) { reader.MarkStart(); int result = reader.NextChunk(bits); reader.MarkEndValue(name, result); return(result); }
public static T NextChunk <T, U>(this IMarkedBitReader reader, int bits, string name, U context, Func <int, U, T> mapper) { reader.MarkStart(); T result = mapper(reader.NextChunk(bits), context); reader.MarkEndValue(name, result !); return(result); }
// Marking overloads public static bool NextBit(this IMarkedBitReader reader, string name) { reader.MarkStart(); bool result = reader.NextBit(); reader.MarkEndValue(name, result); return(result); }
public static T ReadStructure <T, C>(this IMarkedBitReader reader, BitDeserializer <T, C> deserialize, C context, string title) { reader.MarkStart(); T result = deserialize(reader, context); reader.MarkEndTitle(title); return(result); }
// Serialization private static LiteralContextMode[] ReadLiteralContextModes(IMarkedBitReader reader, int modeCount) { return(reader.MarkTitle("Literal Context Modes", () => reader.ReadValueArray(modeCount, "CMODE", () => LiteralContextModes.Deserialize(reader, NoContext.Value)))); }
private static IList <HuffmanTree <T> > ReadHuffmanTrees <T>(IMarkedBitReader reader, Category category, int treeCount, HuffmanTree <T> .Context context) where T : IComparable <T> { return(reader.ReadStructureArray(treeCount, HuffmanTree <T> .Deserialize, context, "HTREE" + category.Id())); }
public ReaderDataContext(Context wrapped, IMarkedBitReader reader) : base(wrapped) { this.readingTrackers = Header.BlockTypes.Select(info => new BlockSwitchTracker.Reading(info, reader)); this.BlockTrackers = readingTrackers.Select <BlockSwitchTracker>(tracker => tracker); }
public static T ReadValue <T, C>(this IMarkedBitReader reader, BitDeserializer <T, C> deserialize, C context, string name) { return(reader.ReadValue(deserialize, context, name, result => result)); }
public static T[] ReadStructureArray <T, C>(this IMarkedBitReader reader, int length, BitDeserializer <T, C> deserialize, C context, string title) { return(Enumerable.Range(0, length) .Select(counter => reader.ReadStructure(deserialize, context, title + " " + (counter + 1) + "/" + length)) .ToArray()); }
public static T[] ReadValueArray <T>(this IMarkedBitReader reader, int length, string name, Func <T> supplier) { return(Enumerable.Range(0, length) .Select(counter => reader.MarkValue(name + " " + (counter + 1) + "/" + length, supplier)) .ToArray()); }
public static T ReadValue <T>(this IMarkedBitReader reader, HuffmanNode <T> tree, string name) where T : IComparable <T> { return(reader.ReadValue(tree, name, result => result)); }