github.com/andybalholm/brotli@v1.0.6/hash_composite.go (about) 1 package brotli 2 3 /* Copyright 2018 Google Inc. All Rights Reserved. 4 5 Distributed under MIT license. 6 See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 7 */ 8 9 func (h *hashComposite) HashTypeLength() uint { 10 var a uint = h.ha.HashTypeLength() 11 var b uint = h.hb.HashTypeLength() 12 if a > b { 13 return a 14 } else { 15 return b 16 } 17 } 18 19 func (h *hashComposite) StoreLookahead() uint { 20 var a uint = h.ha.StoreLookahead() 21 var b uint = h.hb.StoreLookahead() 22 if a > b { 23 return a 24 } else { 25 return b 26 } 27 } 28 29 /* Composite hasher: This hasher allows to combine two other hashers, HASHER_A 30 and HASHER_B. */ 31 type hashComposite struct { 32 hasherCommon 33 ha hasherHandle 34 hb hasherHandle 35 params *encoderParams 36 } 37 38 func (h *hashComposite) Initialize(params *encoderParams) { 39 h.params = params 40 } 41 42 /* TODO: Initialize of the hashers is defered to Prepare (and params 43 remembered here) because we don't get the one_shot and input_size params 44 here that are needed to know the memory size of them. Instead provide 45 those params to all hashers InitializehashComposite */ 46 func (h *hashComposite) Prepare(one_shot bool, input_size uint, data []byte) { 47 if h.ha == nil { 48 var common_a *hasherCommon 49 var common_b *hasherCommon 50 51 common_a = h.ha.Common() 52 common_a.params = h.params.hasher 53 common_a.is_prepared_ = false 54 common_a.dict_num_lookups = 0 55 common_a.dict_num_matches = 0 56 h.ha.Initialize(h.params) 57 58 common_b = h.hb.Common() 59 common_b.params = h.params.hasher 60 common_b.is_prepared_ = false 61 common_b.dict_num_lookups = 0 62 common_b.dict_num_matches = 0 63 h.hb.Initialize(h.params) 64 } 65 66 h.ha.Prepare(one_shot, input_size, data) 67 h.hb.Prepare(one_shot, input_size, data) 68 } 69 70 func (h *hashComposite) Store(data []byte, mask uint, ix uint) { 71 h.ha.Store(data, mask, ix) 72 h.hb.Store(data, mask, ix) 73 } 74 75 func (h *hashComposite) StoreRange(data []byte, mask uint, ix_start uint, ix_end uint) { 76 h.ha.StoreRange(data, mask, ix_start, ix_end) 77 h.hb.StoreRange(data, mask, ix_start, ix_end) 78 } 79 80 func (h *hashComposite) StitchToPreviousBlock(num_bytes uint, position uint, ringbuffer []byte, ring_buffer_mask uint) { 81 h.ha.StitchToPreviousBlock(num_bytes, position, ringbuffer, ring_buffer_mask) 82 h.hb.StitchToPreviousBlock(num_bytes, position, ringbuffer, ring_buffer_mask) 83 } 84 85 func (h *hashComposite) PrepareDistanceCache(distance_cache []int) { 86 h.ha.PrepareDistanceCache(distance_cache) 87 h.hb.PrepareDistanceCache(distance_cache) 88 } 89 90 func (h *hashComposite) FindLongestMatch(dictionary *encoderDictionary, data []byte, ring_buffer_mask uint, distance_cache []int, cur_ix uint, max_length uint, max_backward uint, gap uint, max_distance uint, out *hasherSearchResult) { 91 h.ha.FindLongestMatch(dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out) 92 h.hb.FindLongestMatch(dictionary, data, ring_buffer_mask, distance_cache, cur_ix, max_length, max_backward, gap, max_distance, out) 93 }