From 751506d5b5a28373f6944babb57bb1b2b6008501 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 6 Nov 2018 13:50:31 +0400 Subject: [PATCH] Better adjust shared media count. --- .../storage/storage_sparse_ids_list.cpp | 26 +++++++++++-------- .../storage/storage_sparse_ids_list.h | 8 ++++-- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Telegram/SourceFiles/storage/storage_sparse_ids_list.cpp b/Telegram/SourceFiles/storage/storage_sparse_ids_list.cpp index 38f9dbc9e..b8bd2b7ed 100644 --- a/Telegram/SourceFiles/storage/storage_sparse_ids_list.cpp +++ b/Telegram/SourceFiles/storage/storage_sparse_ids_list.cpp @@ -31,18 +31,18 @@ void SparseIdsList::Slice::merge( } template -int SparseIdsList::uniteAndAdd( +SparseIdsList::AddResult SparseIdsList::uniteAndAdd( SparseIdsSliceUpdate &update, base::flat_set::iterator uniteFrom, base::flat_set::iterator uniteTill, const Range &messages, MsgRange noSkipRange) { - auto uniteFromIndex = uniteFrom - _slices.begin(); - auto was = uniteFrom->messages.size(); + const auto uniteFromIndex = uniteFrom - _slices.begin(); + const auto was = int(uniteFrom->messages.size()); _slices.modify(uniteFrom, [&](Slice &slice) { slice.merge(messages, noSkipRange); }); - auto firstToErase = uniteFrom + 1; + const auto firstToErase = uniteFrom + 1; if (firstToErase != uniteTill) { for (auto it = firstToErase; it != uniteTill; ++it) { _slices.modify(uniteFrom, [&](Slice &slice) { @@ -54,11 +54,12 @@ int SparseIdsList::uniteAndAdd( } update.messages = &uniteFrom->messages; update.range = uniteFrom->range; - return uniteFrom->messages.size() - was; + const auto count = int(uniteFrom->messages.size()); + return { count, count - was }; } template -int SparseIdsList::addRangeItemsAndCountNew( +SparseIdsList::AddResult SparseIdsList::addRangeItemsAndCountNew( SparseIdsSliceUpdate &update, const Range &messages, MsgRange noSkipRange) { @@ -86,7 +87,8 @@ int SparseIdsList::addRangeItemsAndCountNew( noSkipRange); update.messages = &slice->messages; update.range = slice->range; - return slice->messages.size(); + const auto count = int(slice->messages.size()); + return { count, count }; } template @@ -97,22 +99,24 @@ void SparseIdsList::addRange( bool incrementCount) { Expects(!count || !incrementCount); - auto wasCount = _count; auto update = SparseIdsSliceUpdate(); - auto result = addRangeItemsAndCountNew( + const auto result = addRangeItemsAndCountNew( update, messages, noSkipRange); if (count) { _count = count; - } else if (incrementCount && _count && result > 0) { - *_count += result; + } else if (incrementCount && _count && result.added > 0) { + *_count += result.added; } if (_slices.size() == 1) { if (_slices.front().range == MsgRange { 0, ServerMaxMsgId }) { _count = _slices.front().messages.size(); } } + if (_count) { + accumulate_max(*_count, result.inslice); + } update.count = _count; _sliceUpdated.fire(std::move(update)); } diff --git a/Telegram/SourceFiles/storage/storage_sparse_ids_list.h b/Telegram/SourceFiles/storage/storage_sparse_ids_list.h index d247001f4..1081c48c7 100644 --- a/Telegram/SourceFiles/storage/storage_sparse_ids_list.h +++ b/Telegram/SourceFiles/storage/storage_sparse_ids_list.h @@ -68,15 +68,19 @@ private: }; + struct AddResult { + int inslice = 0; + int added = 0; + }; template - int uniteAndAdd( + AddResult uniteAndAdd( SparseIdsSliceUpdate &update, base::flat_set::iterator uniteFrom, base::flat_set::iterator uniteTill, const Range &messages, MsgRange noSkipRange); template - int addRangeItemsAndCountNew( + AddResult addRangeItemsAndCountNew( SparseIdsSliceUpdate &update, const Range &messages, MsgRange noSkipRange);