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