mirror of
https://github.com/overte-org/overte.git
synced 2025-08-12 21:59:49 +02:00
Added insert function to LossList
This commit is contained in:
parent
64e1281d47
commit
1df657c359
2 changed files with 48 additions and 2 deletions
|
@ -34,6 +34,50 @@ void LossList::append(SequenceNumber start, SequenceNumber end) {
|
|||
_length += seqlen(start, end);
|
||||
}
|
||||
|
||||
void LossList::insert(SequenceNumber start, SequenceNumber end) {
|
||||
auto it = find_if_not(_lossList.begin(), _lossList.end(), [&start](pair<SequenceNumber, SequenceNumber> pair){
|
||||
return pair.second < start;
|
||||
});
|
||||
|
||||
if (it == _lossList.end()) {
|
||||
// No overlap, simply insert
|
||||
_lossList.insert(it, make_pair(start, end));
|
||||
_length += seqlen(start, end);
|
||||
} else {
|
||||
// If it starts before segment, extend segment
|
||||
if (start < it->first) {
|
||||
_length += seqlen(start, it->first - 1);
|
||||
it->first = start;
|
||||
}
|
||||
|
||||
if (end > it->second) {
|
||||
// If it goes further, find the actual end
|
||||
auto it2 = find_if(it, _lossList.end(), [&end](pair<SequenceNumber, SequenceNumber> pair){
|
||||
return end <= pair.second;
|
||||
});
|
||||
|
||||
// If it ends inside a segment, change end (segment will be deleted)
|
||||
// Or backup iterator so segment doesn't get deleted
|
||||
if (it2->first <= end) {
|
||||
end = it2->second;
|
||||
} else {
|
||||
--it2;
|
||||
}
|
||||
|
||||
// Change the end of the original segment
|
||||
_length += seqlen(it->second + 1, end);
|
||||
it->second = end;
|
||||
|
||||
// remove all underlapping segments
|
||||
++it; ++it2;
|
||||
while (it != it2) {
|
||||
_length -= seqlen(it->first, it->second);
|
||||
it = _lossList.erase(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LossList::remove(SequenceNumber seq) {
|
||||
auto it = find_if(_lossList.begin(), _lossList.end(), [&seq](pair<SequenceNumber, SequenceNumber> pair) {
|
||||
return pair.first <= seq && seq <= pair.second;
|
||||
|
@ -58,8 +102,7 @@ void LossList::remove(SequenceNumber seq) {
|
|||
void LossList::remove(SequenceNumber start, SequenceNumber end) {
|
||||
// Find the first segment sharing sequence numbers
|
||||
auto it = find_if(_lossList.begin(), _lossList.end(), [&start, &end](pair<SequenceNumber, SequenceNumber> pair) {
|
||||
return (pair.first <= start && start <= pair.second) ||
|
||||
(start <= pair.first && pair.first <= end);
|
||||
return (pair.first <= start && start <= pair.second) || (start <= pair.first && pair.first <= end);
|
||||
});
|
||||
|
||||
// If we found one
|
||||
|
|
|
@ -26,6 +26,9 @@ public:
|
|||
void append(SequenceNumber seq);
|
||||
void append(SequenceNumber start, SequenceNumber end);
|
||||
|
||||
// Inserts anywhere - MUCH slower
|
||||
void insert(SequenceNumber start, SequenceNumber end);
|
||||
|
||||
void remove(SequenceNumber seq);
|
||||
void remove(SequenceNumber start, SequenceNumber end);
|
||||
|
||||
|
|
Loading…
Reference in a new issue