Optimize empty map cases in CPDF_CrossRefTable::UpdateInfo()
In the case where UpdateInfo() receives an empty map, that is
effectively a no-op. Just return early and avoid moving anything around.
In the cases where CPDF_CrossRefTable has an existing map that is empty,
simply take the new map in its entirety, instead of processing it one
element at a time.
Also remove the rvalue references. They are not needed in this case, per
the style guide.
Change-Id: I05ee6f768a8a22456206674ee48d57cace5fcb28
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/109730
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_cross_ref_table.cpp b/core/fpdfapi/parser/cpdf_cross_ref_table.cpp
index 68322be..31177a3 100644
--- a/core/fpdfapi/parser/cpdf_cross_ref_table.cpp
+++ b/core/fpdfapi/parser/cpdf_cross_ref_table.cpp
@@ -124,7 +124,16 @@
}
void CPDF_CrossRefTable::UpdateInfo(
- std::map<uint32_t, ObjectInfo>&& new_objects_info) {
+ std::map<uint32_t, ObjectInfo> new_objects_info) {
+ if (new_objects_info.empty()) {
+ return;
+ }
+
+ if (objects_info_.empty()) {
+ objects_info_ = std::move(new_objects_info);
+ return;
+ }
+
auto cur_it = objects_info_.begin();
auto new_it = new_objects_info.begin();
while (cur_it != objects_info_.end() && new_it != new_objects_info.end()) {
diff --git a/core/fpdfapi/parser/cpdf_cross_ref_table.h b/core/fpdfapi/parser/cpdf_cross_ref_table.h
index ad8a85c..d76e29c 100644
--- a/core/fpdfapi/parser/cpdf_cross_ref_table.h
+++ b/core/fpdfapi/parser/cpdf_cross_ref_table.h
@@ -77,7 +77,7 @@
void SetObjectMapSize(uint32_t size);
private:
- void UpdateInfo(std::map<uint32_t, ObjectInfo>&& new_objects_info);
+ void UpdateInfo(std::map<uint32_t, ObjectInfo> new_objects_info);
void UpdateTrailer(RetainPtr<CPDF_Dictionary> new_trailer);
RetainPtr<CPDF_Dictionary> trailer_;