1*f4ee7fbaSAndroid Build Coastguard Worker /* NOLINT(build/header_guard) */ 2*f4ee7fbaSAndroid Build Coastguard Worker /* Copyright 2013 Google Inc. All Rights Reserved. 3*f4ee7fbaSAndroid Build Coastguard Worker 4*f4ee7fbaSAndroid Build Coastguard Worker Distributed under MIT license. 5*f4ee7fbaSAndroid Build Coastguard Worker See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 6*f4ee7fbaSAndroid Build Coastguard Worker */ 7*f4ee7fbaSAndroid Build Coastguard Worker 8*f4ee7fbaSAndroid Build Coastguard Worker /* template parameters: Histogram, DATA_SIZE, DataType */ 9*f4ee7fbaSAndroid Build Coastguard Worker 10*f4ee7fbaSAndroid Build Coastguard Worker /* A simple container for histograms of data in blocks. */ 11*f4ee7fbaSAndroid Build Coastguard Worker 12*f4ee7fbaSAndroid Build Coastguard Worker typedef struct FN(Histogram) { 13*f4ee7fbaSAndroid Build Coastguard Worker uint32_t data_[DATA_SIZE]; 14*f4ee7fbaSAndroid Build Coastguard Worker size_t total_count_; 15*f4ee7fbaSAndroid Build Coastguard Worker double bit_cost_; 16*f4ee7fbaSAndroid Build Coastguard Worker } FN(Histogram); 17*f4ee7fbaSAndroid Build Coastguard Worker FN(HistogramClear)18*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE void FN(HistogramClear)(FN(Histogram)* self) { 19*f4ee7fbaSAndroid Build Coastguard Worker memset(self->data_, 0, sizeof(self->data_)); 20*f4ee7fbaSAndroid Build Coastguard Worker self->total_count_ = 0; 21*f4ee7fbaSAndroid Build Coastguard Worker self->bit_cost_ = HUGE_VAL; 22*f4ee7fbaSAndroid Build Coastguard Worker } 23*f4ee7fbaSAndroid Build Coastguard Worker FN(ClearHistograms)24*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE void FN(ClearHistograms)( 25*f4ee7fbaSAndroid Build Coastguard Worker FN(Histogram)* array, size_t length) { 26*f4ee7fbaSAndroid Build Coastguard Worker size_t i; 27*f4ee7fbaSAndroid Build Coastguard Worker for (i = 0; i < length; ++i) FN(HistogramClear)(array + i); 28*f4ee7fbaSAndroid Build Coastguard Worker } 29*f4ee7fbaSAndroid Build Coastguard Worker FN(HistogramAdd)30*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE void FN(HistogramAdd)(FN(Histogram)* self, size_t val) { 31*f4ee7fbaSAndroid Build Coastguard Worker ++self->data_[val]; 32*f4ee7fbaSAndroid Build Coastguard Worker ++self->total_count_; 33*f4ee7fbaSAndroid Build Coastguard Worker } 34*f4ee7fbaSAndroid Build Coastguard Worker FN(HistogramAddVector)35*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE void FN(HistogramAddVector)(FN(Histogram)* self, 36*f4ee7fbaSAndroid Build Coastguard Worker const DataType* p, size_t n) { 37*f4ee7fbaSAndroid Build Coastguard Worker self->total_count_ += n; 38*f4ee7fbaSAndroid Build Coastguard Worker n += 1; 39*f4ee7fbaSAndroid Build Coastguard Worker while (--n) ++self->data_[*p++]; 40*f4ee7fbaSAndroid Build Coastguard Worker } 41*f4ee7fbaSAndroid Build Coastguard Worker FN(HistogramAddHistogram)42*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE void FN(HistogramAddHistogram)(FN(Histogram)* self, 43*f4ee7fbaSAndroid Build Coastguard Worker const FN(Histogram)* v) { 44*f4ee7fbaSAndroid Build Coastguard Worker size_t i; 45*f4ee7fbaSAndroid Build Coastguard Worker self->total_count_ += v->total_count_; 46*f4ee7fbaSAndroid Build Coastguard Worker for (i = 0; i < DATA_SIZE; ++i) { 47*f4ee7fbaSAndroid Build Coastguard Worker self->data_[i] += v->data_[i]; 48*f4ee7fbaSAndroid Build Coastguard Worker } 49*f4ee7fbaSAndroid Build Coastguard Worker } 50*f4ee7fbaSAndroid Build Coastguard Worker FN(HistogramDataSize)51*f4ee7fbaSAndroid Build Coastguard Workerstatic BROTLI_INLINE size_t FN(HistogramDataSize)(void) { return DATA_SIZE; } 52