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