Merge branch '2404-statusvector-fix-2' into 'main'

StatusVector: Use std::vector instead of std::map

See merge request jungfraujoch/nextgendcu!40
This commit is contained in:
2024-04-09 14:14:28 +02:00
+27 -28
View File
@@ -15,13 +15,13 @@
template <class T> class StatusVector {
mutable std::mutex m;
std::map<uint32_t, T > content;
uint32_t max_id = 0;
std::vector<T> content;
std::vector<uint8_t> present;
MultiLinePlot GeneratePlot(const std::vector<float> &status, int32_t bin_size) const {
MultiLinePlot ret(1);
if (status.size() == 1) {
ret[0].x = {max_id / 2.0f};
ret[0].x = {(content.size() - 1) / 2.0f};
ret[0].y = {status[0]};
} else if (!status.empty()) {
ret[0].y = status;
@@ -39,26 +39,32 @@ template <class T> class StatusVector {
public:
void AddElement(uint32_t id, T val) {
std::unique_lock<std::mutex> ul(m);
if (id >= content.size()) {
content.resize(id + 1);
present.resize(id + 1);
}
content[id] = val;
if (id > max_id)
max_id = id;
present[id] = 1;
}
[[nodiscard]] std::vector<T> ExportArray(T def_value) const {
std::unique_lock<std::mutex> ul(m);
std::vector<T> ret(max_id + 1, def_value);
for (auto &[x,y]: content)
ret[x] = y;
std::vector<T> ret(content.size(), def_value);
for (int i = 0; i < content.size(); i++) {
if (present[i])
ret[i] = content[i];
}
return ret;
}
[[nodiscard]] float Mean() const {
std::unique_lock<std::mutex> ul(m);
size_t count = content.size();
size_t count = 0;
double sum = 0;
for (auto &[x,y]: content)
sum += y;
for (int i = 0; i < content.size(); i++) {
sum += present[i] * content[i];
count += present[i];
}
if (count > 0)
return static_cast<float>(sum / count);
@@ -75,7 +81,7 @@ public:
std::vector<float> ret;
size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % bin_size > 0) ? 1 : 0);
size_t elems = content.size() / bin_size + ((content.size() % bin_size > 0) ? 1 : 0);
ret.resize(elems);
if (!content.empty()) {
@@ -83,14 +89,11 @@ public:
double sum = 0;
int64_t count = 0;
auto it_start = content.lower_bound(bin * bin_size);
auto it_end = content.upper_bound((bin + 1) * bin_size);
if ((it_start != content.end()) && (it_start->first < (bin + 1) * bin_size)) {
for (auto it = it_start; it != it_end; it++) {
sum += it->second;
count++;
}
for (int i = bin * bin_size; (i < (bin + 1) * bin_size) && (i < content.size()); i++) {
sum += present[i] * content[i];
count += present[i];
}
if (count > 0)
ret[bin] = static_cast<float>(sum / static_cast<double>(count));
else
@@ -109,20 +112,16 @@ public:
std::vector<float> ret;
size_t elems = (max_id + 1) / bin_size + (((max_id + 1) % bin_size > 0) ? 1 : 0);
size_t elems = content.size() / bin_size + ((content.size() % bin_size > 0) ? 1 : 0);
ret.resize(elems);
if (!content.empty()) {
for (int bin = 0; bin < elems; bin++) {
ret[bin] = default_val;
auto it_start = content.lower_bound(bin * bin_size);
auto it_end = content.upper_bound((bin + 1) * bin_size);
if ((it_start != content.end()) && (it_start->first < (bin + 1) * bin_size)) {
for (auto it = it_start; it != it_end; it++) {
if (ret[bin] < it->second)
ret[bin] = it->second;
}
for (int i = bin * bin_size; (i < (bin + 1) * bin_size) && (i < content.size()); i++) {
if (present[i] && (content[i] > ret[bin]))
ret[bin] = content[i];
}
}
}