Commit 8fbef47093e93cfdaffd62449a18b57679b610f5

Authored by m-holger
1 parent 5473c095

Use QPDFObjGen::set in QPDF::getAllPages

include/qpdf/QPDF.hh
@@ -1252,8 +1252,8 @@ class QPDF @@ -1252,8 +1252,8 @@ class QPDF
1252 1252
1253 void getAllPagesInternal( 1253 void getAllPagesInternal(
1254 QPDFObjectHandle cur_pages, 1254 QPDFObjectHandle cur_pages,
1255 - std::set<QPDFObjGen>& visited,  
1256 - std::set<QPDFObjGen>& seen); 1255 + QPDFObjGen::set& visited,
  1256 + QPDFObjGen::set& seen);
1257 void insertPage(QPDFObjectHandle newpage, int pos); 1257 void insertPage(QPDFObjectHandle newpage, int pos);
1258 void flattenPagesTree(); 1258 void flattenPagesTree();
1259 void insertPageobjToPage( 1259 void insertPageobjToPage(
libqpdf/QPDF_pages.cc
@@ -55,13 +55,13 @@ QPDF::getAllPages() @@ -55,13 +55,13 @@ QPDF::getAllPages()
55 // initialize this->m->all_pages. 55 // initialize this->m->all_pages.
56 if (this->m->all_pages.empty()) { 56 if (this->m->all_pages.empty()) {
57 this->m->ever_called_get_all_pages = true; 57 this->m->ever_called_get_all_pages = true;
58 - std::set<QPDFObjGen> visited;  
59 - std::set<QPDFObjGen> seen; 58 + QPDFObjGen::set visited;
  59 + QPDFObjGen::set seen;
60 QPDFObjectHandle pages = getRoot().getKey("/Pages"); 60 QPDFObjectHandle pages = getRoot().getKey("/Pages");
61 bool warned = false; 61 bool warned = false;
62 bool changed_pages = false; 62 bool changed_pages = false;
63 while (pages.isDictionary() && pages.hasKey("/Parent")) { 63 while (pages.isDictionary() && pages.hasKey("/Parent")) {
64 - if (seen.count(pages.getObjGen())) { 64 + if (!seen.add(pages)) {
65 // loop -- will be detected again and reported later 65 // loop -- will be detected again and reported later
66 break; 66 break;
67 } 67 }
@@ -74,7 +74,6 @@ QPDF::getAllPages() @@ -74,7 +74,6 @@ QPDF::getAllPages()
74 " to the root of the page tree; attempting to correct"); 74 " to the root of the page tree; attempting to correct");
75 warned = true; 75 warned = true;
76 } 76 }
77 - seen.insert(pages.getObjGen());  
78 changed_pages = true; 77 changed_pages = true;
79 pages = pages.getKey("/Parent"); 78 pages = pages.getKey("/Parent");
80 } 79 }
@@ -92,12 +91,9 @@ QPDF::getAllPages() @@ -92,12 +91,9 @@ QPDF::getAllPages()
92 91
93 void 92 void
94 QPDF::getAllPagesInternal( 93 QPDF::getAllPagesInternal(
95 - QPDFObjectHandle cur_node,  
96 - std::set<QPDFObjGen>& visited,  
97 - std::set<QPDFObjGen>& seen) 94 + QPDFObjectHandle cur_node, QPDFObjGen::set& visited, QPDFObjGen::set& seen)
98 { 95 {
99 - QPDFObjGen cur_node_og = cur_node.getObjGen();  
100 - if (visited.count(cur_node_og) > 0) { 96 + if (!visited.add(cur_node)) {
101 throw QPDFExc( 97 throw QPDFExc(
102 qpdf_e_pages, 98 qpdf_e_pages,
103 this->m->file->getName(), 99 this->m->file->getName(),
@@ -105,7 +101,6 @@ QPDF::getAllPagesInternal( @@ -105,7 +101,6 @@ QPDF::getAllPagesInternal(
105 0, 101 0,
106 "Loop detected in /Pages structure (getAllPages)"); 102 "Loop detected in /Pages structure (getAllPages)");
107 } 103 }
108 - visited.insert(cur_node_og);  
109 if (!cur_node.isDictionaryOfType("/Pages")) { 104 if (!cur_node.isDictionaryOfType("/Pages")) {
110 cur_node.warnIfPossible( 105 cur_node.warnIfPossible(
111 "/Type key should be /Pages but is not; overriding"); 106 "/Type key should be /Pages but is not; overriding");
@@ -125,7 +120,7 @@ QPDF::getAllPagesInternal( @@ -125,7 +120,7 @@ QPDF::getAllPagesInternal(
125 " (from 0) is direct; converting to indirect"); 120 " (from 0) is direct; converting to indirect");
126 kid = makeIndirectObject(kid); 121 kid = makeIndirectObject(kid);
127 kids.setArrayItem(i, kid); 122 kids.setArrayItem(i, kid);
128 - } else if (seen.count(kid.getObjGen())) { 123 + } else if (!seen.add(kid)) {
129 // Make a copy of the page. This does the same as 124 // Make a copy of the page. This does the same as
130 // shallowCopyPage in QPDFPageObjectHelper. 125 // shallowCopyPage in QPDFPageObjectHelper.
131 QTC::TC("qpdf", "QPDF resolve duplicated page object"); 126 QTC::TC("qpdf", "QPDF resolve duplicated page object");
@@ -134,6 +129,7 @@ QPDF::getAllPagesInternal( @@ -134,6 +129,7 @@ QPDF::getAllPagesInternal(
134 " (from 0) appears more than once in the pages tree;" 129 " (from 0) appears more than once in the pages tree;"
135 " creating a new page object as a copy"); 130 " creating a new page object as a copy");
136 kid = makeIndirectObject(QPDFObjectHandle(kid).shallowCopy()); 131 kid = makeIndirectObject(QPDFObjectHandle(kid).shallowCopy());
  132 + seen.add(kid);
137 kids.setArrayItem(i, kid); 133 kids.setArrayItem(i, kid);
138 } 134 }
139 if (!kid.isDictionaryOfType("/Page")) { 135 if (!kid.isDictionaryOfType("/Page")) {
@@ -141,7 +137,6 @@ QPDF::getAllPagesInternal( @@ -141,7 +137,6 @@ QPDF::getAllPagesInternal(
141 "/Type key should be /Page but is not; overriding"); 137 "/Type key should be /Page but is not; overriding");
142 kid.replaceKey("/Type", "/Page"_qpdf); 138 kid.replaceKey("/Type", "/Page"_qpdf);
143 } 139 }
144 - seen.insert(kid.getObjGen());  
145 m->all_pages.push_back(kid); 140 m->all_pages.push_back(kid);
146 } 141 }
147 } 142 }