Better adjust shared media count.

This commit is contained in:
John Preston 2018-11-06 13:50:31 +04:00
parent 2061248224
commit 751506d5b5
2 changed files with 21 additions and 13 deletions

View File

@ -31,18 +31,18 @@ void SparseIdsList::Slice::merge(
} }
template <typename Range> template <typename Range>
int SparseIdsList::uniteAndAdd( SparseIdsList::AddResult SparseIdsList::uniteAndAdd(
SparseIdsSliceUpdate &update, SparseIdsSliceUpdate &update,
base::flat_set<Slice>::iterator uniteFrom, base::flat_set<Slice>::iterator uniteFrom,
base::flat_set<Slice>::iterator uniteTill, base::flat_set<Slice>::iterator uniteTill,
const Range &messages, const Range &messages,
MsgRange noSkipRange) { MsgRange noSkipRange) {
auto uniteFromIndex = uniteFrom - _slices.begin(); const auto uniteFromIndex = uniteFrom - _slices.begin();
auto was = uniteFrom->messages.size(); const auto was = int(uniteFrom->messages.size());
_slices.modify(uniteFrom, [&](Slice &slice) { _slices.modify(uniteFrom, [&](Slice &slice) {
slice.merge(messages, noSkipRange); slice.merge(messages, noSkipRange);
}); });
auto firstToErase = uniteFrom + 1; const auto firstToErase = uniteFrom + 1;
if (firstToErase != uniteTill) { if (firstToErase != uniteTill) {
for (auto it = firstToErase; it != uniteTill; ++it) { for (auto it = firstToErase; it != uniteTill; ++it) {
_slices.modify(uniteFrom, [&](Slice &slice) { _slices.modify(uniteFrom, [&](Slice &slice) {
@ -54,11 +54,12 @@ int SparseIdsList::uniteAndAdd(
} }
update.messages = &uniteFrom->messages; update.messages = &uniteFrom->messages;
update.range = uniteFrom->range; update.range = uniteFrom->range;
return uniteFrom->messages.size() - was; const auto count = int(uniteFrom->messages.size());
return { count, count - was };
} }
template <typename Range> template <typename Range>
int SparseIdsList::addRangeItemsAndCountNew( SparseIdsList::AddResult SparseIdsList::addRangeItemsAndCountNew(
SparseIdsSliceUpdate &update, SparseIdsSliceUpdate &update,
const Range &messages, const Range &messages,
MsgRange noSkipRange) { MsgRange noSkipRange) {
@ -86,7 +87,8 @@ int SparseIdsList::addRangeItemsAndCountNew(
noSkipRange); noSkipRange);
update.messages = &slice->messages; update.messages = &slice->messages;
update.range = slice->range; update.range = slice->range;
return slice->messages.size(); const auto count = int(slice->messages.size());
return { count, count };
} }
template <typename Range> template <typename Range>
@ -97,22 +99,24 @@ void SparseIdsList::addRange(
bool incrementCount) { bool incrementCount) {
Expects(!count || !incrementCount); Expects(!count || !incrementCount);
auto wasCount = _count;
auto update = SparseIdsSliceUpdate(); auto update = SparseIdsSliceUpdate();
auto result = addRangeItemsAndCountNew( const auto result = addRangeItemsAndCountNew(
update, update,
messages, messages,
noSkipRange); noSkipRange);
if (count) { if (count) {
_count = count; _count = count;
} else if (incrementCount && _count && result > 0) { } else if (incrementCount && _count && result.added > 0) {
*_count += result; *_count += result.added;
} }
if (_slices.size() == 1) { if (_slices.size() == 1) {
if (_slices.front().range == MsgRange { 0, ServerMaxMsgId }) { if (_slices.front().range == MsgRange { 0, ServerMaxMsgId }) {
_count = _slices.front().messages.size(); _count = _slices.front().messages.size();
} }
} }
if (_count) {
accumulate_max(*_count, result.inslice);
}
update.count = _count; update.count = _count;
_sliceUpdated.fire(std::move(update)); _sliceUpdated.fire(std::move(update));
} }

View File

@ -68,15 +68,19 @@ private:
}; };
struct AddResult {
int inslice = 0;
int added = 0;
};
template <typename Range> template <typename Range>
int uniteAndAdd( AddResult uniteAndAdd(
SparseIdsSliceUpdate &update, SparseIdsSliceUpdate &update,
base::flat_set<Slice>::iterator uniteFrom, base::flat_set<Slice>::iterator uniteFrom,
base::flat_set<Slice>::iterator uniteTill, base::flat_set<Slice>::iterator uniteTill,
const Range &messages, const Range &messages,
MsgRange noSkipRange); MsgRange noSkipRange);
template <typename Range> template <typename Range>
int addRangeItemsAndCountNew( AddResult addRangeItemsAndCountNew(
SparseIdsSliceUpdate &update, SparseIdsSliceUpdate &update,
const Range &messages, const Range &messages,
MsgRange noSkipRange); MsgRange noSkipRange);