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:
+27
-28
@@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user