| /* 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; } |