#pragma once
#include "exports.hpp"
#include <algorithm>
#include <vector>
// Histogram over integers with binsize 1
class Histogram {
public:
Histogram() : xmin(0) {}
~Histogram() {}
void reset() {
frequencies.clear();
xmin = 0;
}
void add(int sample) {
if (frequencies.empty()) {
xmin = sample;
frequencies.push_back(1);
return;
}
if (sample < xmin) {
int extra = xmin - sample;
frequencies.insert(frequencies.begin(), extra, 0);
xmin = sample;
frequencies.front()++;
return;
}
if (sample - xmin >= (int)frequencies.size()) {
int extra = sample - xmin - frequencies.size() + 1;
frequencies.insert(frequencies.end(), extra, 0);
frequencies.back()++;
return;
}
frequencies[sample - xmin]++;
}
// For exports
std::vector<std::pair<int, int>> getHistogram() const {
std::vector<std::pair<int, int>> histogram;
int i = xmin;
for (auto f : frequencies)
histogram.push_back({i++, f});
return histogram;
}
std::vector<int> frequencies;
int xmin;
};