Index: content/browser/download/parallel_download_utils.cc |
diff --git a/content/browser/download/parallel_download_utils.cc b/content/browser/download/parallel_download_utils.cc |
index d21ea49f20c061e15a062e6fec4758ea0e905705..a5974cf079f9c133a719c2ab840021514be72a6c 100644 |
--- a/content/browser/download/parallel_download_utils.cc |
+++ b/content/browser/download/parallel_download_utils.cc |
@@ -28,6 +28,11 @@ const char kParallelRequestCountFinchKey[] = "request_count"; |
// specified. |
const int kParallelRequestCount = 2; |
+bool compareReceivedSlices(const DownloadItem::ReceivedSlice& lhs, |
David Trainor- moved to gerrit
2017/03/09 17:44:02
Comparator operators on the DownloadItem::Received
qinmin
2017/03/09 21:44:58
Added a TODO here.
|
+ const DownloadItem::ReceivedSlice& rhs) { |
+ return lhs.offset < rhs.offset; |
+} |
+ |
} // namespace |
std::vector<DownloadItem::ReceivedSlice> FindSlicesToDownload( |
@@ -61,6 +66,24 @@ std::vector<DownloadItem::ReceivedSlice> FindSlicesToDownload( |
return result; |
} |
+size_t AddOrMergeReceivedSliceIntoSortedArray( |
+ const DownloadItem::ReceivedSlice& new_slice, |
+ std::vector<DownloadItem::ReceivedSlice>& received_slices) { |
+ std::vector<DownloadItem::ReceivedSlice>::iterator it = |
+ std::upper_bound(received_slices.begin(), received_slices.end(), |
+ new_slice, compareReceivedSlices); |
+ if (it != received_slices.begin()) { |
+ std::vector<DownloadItem::ReceivedSlice>::iterator prev = std::prev(it); |
+ if (prev->offset + prev->received_bytes == new_slice.offset) { |
+ prev->received_bytes += new_slice.received_bytes; |
+ return static_cast<size_t>(std::distance(received_slices.begin(), prev)); |
+ } |
+ } |
+ |
+ it = received_slices.emplace(it, new_slice); |
+ return static_cast<size_t>(std::distance(received_slices.begin(), it)); |
+} |
+ |
int64_t GetMinSliceSizeConfig() { |
std::string finch_value = base::GetFieldTrialParamValueByFeature( |
features::kParallelDownloading, kMinSliceSizeFinchKey); |