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