| /* NOLINT(build/header_guard) */ | |
| /* Copyright 2013 Google Inc. All Rights Reserved. | |
| Distributed under MIT license. | |
| See file LICENSE for detail or copy at https://opensource.org/licenses/MIT | |
| */ | |
| /* template parameters: Histogram, DATA_SIZE, DataType */ | |
| /* A simple container for histograms of data in blocks. */ | |
| typedef struct FN(Histogram) { | |
| uint32_t data_[DATA_SIZE]; | |
| size_t total_count_; | |
| double bit_cost_; | |
| } FN(Histogram); | |
| static BROTLI_INLINE void FN(HistogramClear)(FN(Histogram)* self) { | |
| memset(self->data_, 0, sizeof(self->data_)); | |
| self->total_count_ = 0; | |
| self->bit_cost_ = HUGE_VAL; | |
| } | |
| static BROTLI_INLINE void FN(ClearHistograms)( | |
| FN(Histogram)* array, size_t length) { | |
| size_t i; | |
| for (i = 0; i < length; ++i) FN(HistogramClear)(array + i); | |
| } | |
| static BROTLI_INLINE void FN(HistogramAdd)(FN(Histogram)* self, size_t val) { | |
| ++self->data_[val]; | |
| ++self->total_count_; | |
| } | |
| static BROTLI_INLINE void FN(HistogramAddVector)(FN(Histogram)* self, | |
| const DataType *p, size_t n) { | |
| self->total_count_ += n; | |
| n += 1; | |
| while (--n) ++self->data_[*p++]; | |
| } | |
| static BROTLI_INLINE void FN(HistogramAddHistogram)(FN(Histogram)* self, | |
| const FN(Histogram)* v) { | |
| size_t i; | |
| self->total_count_ += v->total_count_; | |
| for (i = 0; i < DATA_SIZE; ++i) { | |
| self->data_[i] += v->data_[i]; | |
| } | |
| } | |
| static BROTLI_INLINE size_t FN(HistogramDataSize)(void) { return DATA_SIZE; } |