126fa459cSmrg/* NOLINT(build/header_guard) */ 226fa459cSmrg/* Copyright 2013 Google Inc. All Rights Reserved. 326fa459cSmrg 426fa459cSmrg Distributed under MIT license. 526fa459cSmrg See file LICENSE for detail or copy at https://opensource.org/licenses/MIT 626fa459cSmrg*/ 726fa459cSmrg 826fa459cSmrg/* template parameters: Histogram, DATA_SIZE, DataType */ 926fa459cSmrg 1026fa459cSmrg/* A simple container for histograms of data in blocks. */ 1126fa459cSmrg 1226fa459cSmrgtypedef struct FN(Histogram) { 1326fa459cSmrg uint32_t data_[DATA_SIZE]; 1426fa459cSmrg size_t total_count_; 1526fa459cSmrg double bit_cost_; 1626fa459cSmrg} FN(Histogram); 1726fa459cSmrg 1826fa459cSmrgstatic BROTLI_INLINE void FN(HistogramClear)(FN(Histogram)* self) { 1926fa459cSmrg memset(self->data_, 0, sizeof(self->data_)); 2026fa459cSmrg self->total_count_ = 0; 2126fa459cSmrg self->bit_cost_ = HUGE_VAL; 2226fa459cSmrg} 2326fa459cSmrg 2426fa459cSmrgstatic BROTLI_INLINE void FN(ClearHistograms)( 2526fa459cSmrg FN(Histogram)* array, size_t length) { 2626fa459cSmrg size_t i; 2726fa459cSmrg for (i = 0; i < length; ++i) FN(HistogramClear)(array + i); 2826fa459cSmrg} 2926fa459cSmrg 3026fa459cSmrgstatic BROTLI_INLINE void FN(HistogramAdd)(FN(Histogram)* self, size_t val) { 3126fa459cSmrg ++self->data_[val]; 3226fa459cSmrg ++self->total_count_; 3326fa459cSmrg} 3426fa459cSmrg 3526fa459cSmrgstatic BROTLI_INLINE void FN(HistogramAddVector)(FN(Histogram)* self, 3626fa459cSmrg const DataType* p, size_t n) { 3726fa459cSmrg self->total_count_ += n; 3826fa459cSmrg n += 1; 3926fa459cSmrg while (--n) ++self->data_[*p++]; 4026fa459cSmrg} 4126fa459cSmrg 4226fa459cSmrgstatic BROTLI_INLINE void FN(HistogramAddHistogram)(FN(Histogram)* self, 4326fa459cSmrg const FN(Histogram)* v) { 4426fa459cSmrg size_t i; 4526fa459cSmrg self->total_count_ += v->total_count_; 4626fa459cSmrg for (i = 0; i < DATA_SIZE; ++i) { 4726fa459cSmrg self->data_[i] += v->data_[i]; 4826fa459cSmrg } 4926fa459cSmrg} 5026fa459cSmrg 5126fa459cSmrgstatic BROTLI_INLINE size_t FN(HistogramDataSize)(void) { return DATA_SIZE; } 52