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