示例#1
0
        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);
        }
示例#2
0
 /// <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]."),
     });
示例#3
0
        public static T MarkTitle <T>(this IMarkedBitReader reader, string title, Func <T> action)
        {
            reader.MarkStart();

            T result = action();

            reader.MarkEndTitle(title);
            return(result);
        }
示例#4
0
        public static byte NextAlignedByte(this IMarkedBitReader reader, string name)
        {
            reader.MarkStart();

            byte result = reader.NextAlignedByte();

            reader.MarkEndValue(name, new Literal(result));
            return(result);
        }
示例#5
0
        // 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);
        }
示例#6
0
        public static int NextChunk(this IMarkedBitReader reader, int bits, string name)
        {
            reader.MarkStart();

            int result = reader.NextChunk(bits);

            reader.MarkEndValue(name, result);
            return(result);
        }
示例#7
0
        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);
        }
示例#8
0
        // Marking overloads

        public static bool NextBit(this IMarkedBitReader reader, string name)
        {
            reader.MarkStart();

            bool result = reader.NextBit();

            reader.MarkEndValue(name, result);
            return(result);
        }
示例#9
0
        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);
        }
示例#10
0
        // Serialization

        private static LiteralContextMode[] ReadLiteralContextModes(IMarkedBitReader reader, int modeCount)
        {
            return(reader.MarkTitle("Literal Context Modes", () => reader.ReadValueArray(modeCount, "CMODE", () => LiteralContextModes.Deserialize(reader, NoContext.Value))));
        }
示例#11
0
 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()));
 }
示例#12
0
 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);
 }
示例#13
0
 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));
 }
示例#14
0
 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());
 }
示例#15
0
 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());
 }
示例#16
0
 public static T ReadValue <T>(this IMarkedBitReader reader, HuffmanNode <T> tree, string name) where T : IComparable <T>
 {
     return(reader.ReadValue(tree, name, result => result));
 }