public static void __hx_ctor_encode_metablock_ContextBlockSplitter(global::encode.metablock.ContextBlockSplitter __hx_this, int HistogramTypeInt, int alphabet_size, int num_contexts, int min_block_size, double split_threshold, int num_symbols, global::encode.metablock.BlockSplit split, global::Array <object> histograms) { unchecked { { int[] this1 = null; this1 = new int[2]; __hx_this.last_histogram_ix_ = ((int[])(this1)); } __hx_this.HistogramTypeInt = HistogramTypeInt; __hx_this.alphabet_size_ = alphabet_size; __hx_this.num_contexts_ = num_contexts; __hx_this.max_block_types_ = (global::encode.metablock.ContextBlockSplitter.kMaxBlockTypes / num_contexts); __hx_this.min_block_size_ = min_block_size; __hx_this.split_threshold_ = split_threshold; __hx_this.num_blocks_ = 0; __hx_this.split_ = split; __hx_this.histograms_ = histograms; __hx_this.target_block_size_ = min_block_size; __hx_this.block_size_ = 0; __hx_this.curr_histogram_ix_ = 0; __hx_this.last_entropy_ = global::FunctionMalloc.mallocFloat((2 * num_contexts)); __hx_this.merge_last_count_ = 0; int max_num_types = ((int)(global::System.Math.Min(((double)(((num_symbols / min_block_size) + 1))), ((double)((__hx_this.max_block_types_ + 1)))))); __hx_this.split_.lengths = new global::Array <int>(); __hx_this.split_.types = new global::Array <int>(); { int _g1 = 0; int _g = (max_num_types * num_contexts); while ((_g1 < _g)) { ++_g1; __hx_this.histograms_.push(new global::encode.histogram.Histogram(((int)(HistogramTypeInt)))); } } { ((int[])(__hx_this.last_histogram_ix_))[1] = 0; ((int[])(__hx_this.last_histogram_ix_))[0] = 0; } } }
public static void BuildMetaBlockGreedyWithContexts(uint[] ringbuffer, int pos, int mask, uint prev_byte, uint prev_byte2, int literal_context_mode, int num_contexts, global::Array <int> static_context_map, global::Array <object> commands, int n_commands, global::encode.metablock.MetaBlockSplit mb) { unchecked { int num_literals = 0; { int _g1 = 0; while ((_g1 < n_commands)) { num_literals += ((global::encode.command.Command)(commands[_g1++])).insert_len_; } } global::encode.metablock.ContextBlockSplitter lit_blocks = new global::encode.metablock.ContextBlockSplitter(global::encode.Histogram_functions.HistogramLiteralInt, 256, num_contexts, 512, 400.0, num_literals, mb.literal_split, mb.literal_histograms); global::encode.metablock.BlockSplitter cmd_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramCommandInt, 704, 1024, 500.0, n_commands, mb.command_split, mb.command_histograms); global::encode.metablock.BlockSplitter dist_blocks = new global::encode.metablock.BlockSplitter(global::encode.Histogram_functions.HistogramDistanceInt, 64, 512, 100.0, n_commands, mb.distance_split, mb.distance_histograms); { int _g11 = 0; while ((_g11 < n_commands)) { global::encode.command.Command cmd = ((global::encode.command.Command)(commands[_g11++])); cmd_blocks.AddSymbol(((int)(cmd.cmd_prefix_[0]))); { int _g3 = 0; int _g2 = cmd.insert_len_; while ((_g3 < _g2)) { ++_g3; uint literal = ((uint)(((uint[])(ringbuffer))[(pos & mask)])); lit_blocks.AddSymbol(((int)(literal)), static_context_map[((int)(global::encode.Context.ContextFunction(prev_byte, prev_byte2, literal_context_mode)))]); prev_byte2 = prev_byte; prev_byte = literal; ++pos; } } pos += cmd.copy_len_; if ((cmd.copy_len_ > 0)) { prev_byte2 = ((uint)(((uint[])(ringbuffer))[((pos - 2) & mask)])); prev_byte = ((uint)(((uint[])(ringbuffer))[((pos - 1) & mask)])); if ((((int)(cmd.cmd_prefix_[0])) >= 128)) { dist_blocks.AddSymbol(((int)(cmd.dist_prefix_[0]))); } } } } lit_blocks.FinishBlock(true); cmd_blocks.FinishBlock(true); dist_blocks.FinishBlock(true); mb.literal_context_map = global::FunctionMalloc.mallocInt((mb.literal_split.num_types << 6)); { int _g12 = 0; int _g = mb.literal_split.num_types; while ((_g12 < _g)) { int i = _g12++; { int _g31 = 0; while ((_g31 < 64)) { int j = _g31++; ((int[])(mb.literal_context_map))[(((i << 6)) + j)] = ((i * num_contexts) + static_context_map[j]); } } } } } }