Do a pseudo merge of events in the envelopes
This commit is contained in:
parent
f66aedfc4f
commit
65f172a02e
2 changed files with 26 additions and 8 deletions
|
|
@ -65,15 +65,33 @@ void EventEnvelope<Type>::registerEvent(int timestamp, Type inputValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
void EventEnvelope<Type>::prepareEvents()
|
void EventEnvelope<Type>::prepareEvents(int blockLength)
|
||||||
{
|
{
|
||||||
if (resetEvents)
|
if (resetEvents)
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
absl::c_sort(events, [](const auto& lhs, const auto& rhs) {
|
absl::c_stable_sort(events, [](const auto& lhs, const auto& rhs) {
|
||||||
return lhs.first < rhs.first;
|
return lhs.first < rhs.first;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
auto eventIt = events.begin();
|
||||||
|
while (eventIt < events.end()) {
|
||||||
|
if (eventIt->first >= blockLength) {
|
||||||
|
eventIt->first = blockLength - 1;
|
||||||
|
eventIt->second = events.back().second;
|
||||||
|
++eventIt;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto nextEventIt = std::next(eventIt);
|
||||||
|
while (nextEventIt < events.end() && eventIt->first == nextEventIt->first ) {
|
||||||
|
eventIt->second = nextEventIt->second;
|
||||||
|
++nextEventIt;
|
||||||
|
}
|
||||||
|
++eventIt;
|
||||||
|
}
|
||||||
|
events.resize(std::distance(events.begin(), eventIt));
|
||||||
|
|
||||||
resetEvents = true;
|
resetEvents = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,15 +111,15 @@ void EventEnvelope<Type>::reset(Type value)
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
void EventEnvelope<Type>::getBlock(absl::Span<Type>)
|
void EventEnvelope<Type>::getBlock(absl::Span<Type> output)
|
||||||
{
|
{
|
||||||
prepareEvents();
|
prepareEvents(output.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
void EventEnvelope<Type>::getQuantizedBlock(absl::Span<Type>, Type)
|
void EventEnvelope<Type>::getQuantizedBlock(absl::Span<Type> output, Type)
|
||||||
{
|
{
|
||||||
prepareEvents();
|
prepareEvents(output.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ private:
|
||||||
static_assert(std::is_arithmetic<Type>::value, "Type should be arithmetic");
|
static_assert(std::is_arithmetic<Type>::value, "Type should be arithmetic");
|
||||||
std::function<Type(Type)> function { [](Type input) { return input; } };
|
std::function<Type(Type)> function { [](Type input) { return input; } };
|
||||||
int maxCapacity { config::defaultSamplesPerBlock };
|
int maxCapacity { config::defaultSamplesPerBlock };
|
||||||
void prepareEvents();
|
void prepareEvents(int blockLength);
|
||||||
bool resetEvents { false };
|
bool resetEvents { false };
|
||||||
LEAK_DETECTOR(EventEnvelope);
|
LEAK_DETECTOR(EventEnvelope);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue