Commit ba814703fbfc99c99d24c8873ae3356b2623dc69
1 parent
5f070841
Use QPDFNameTreeObjectHelper's iterator directly
Showing
5 changed files
with
20 additions
and
5 deletions
ChangeLog
| 1 | 2021-01-16 Jay Berkenbilt <ejb@ql.org> | 1 | 2021-01-16 Jay Berkenbilt <ejb@ql.org> |
| 2 | 2 | ||
| 3 | + * Re-implement QPDFNameTreeObjectHelper and | ||
| 4 | + QPDFNumberTreeObjectHelper to be much more efficient and to have | ||
| 5 | + an iterator-based API in addition to the existing one. This makes | ||
| 6 | + it possible to use "range-for" loops over these helpers and to | ||
| 7 | + iterate through name and number trees without creating a map | ||
| 8 | + containing all the keys and values, which is slow and potentially | ||
| 9 | + consumes a lot of memory. | ||
| 10 | + | ||
| 3 | * Add warn() to QPDF's public API. | 11 | * Add warn() to QPDF's public API. |
| 4 | 12 | ||
| 5 | 2021-01-11 Jay Berkenbilt <ejb@ql.org> | 13 | 2021-01-11 Jay Berkenbilt <ejb@ql.org> |
include/qpdf/QPDFNameTreeObjectHelper.hh
| @@ -53,7 +53,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper | @@ -53,7 +53,7 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper | ||
| 53 | bool hasName(std::string const& utf8); | 53 | bool hasName(std::string const& utf8); |
| 54 | 54 | ||
| 55 | // Find an object by name. If found, returns true and initializes | 55 | // Find an object by name. If found, returns true and initializes |
| 56 | - // oh. | 56 | + // oh. See also find(). |
| 57 | QPDF_DLL | 57 | QPDF_DLL |
| 58 | bool findObject(std::string const& utf8, QPDFObjectHandle& oh); | 58 | bool findObject(std::string const& utf8, QPDFObjectHandle& oh); |
| 59 | 59 |
include/qpdf/QPDFNumberTreeObjectHelper.hh
| @@ -60,7 +60,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper | @@ -60,7 +60,7 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper | ||
| 60 | bool hasIndex(numtree_number idx); | 60 | bool hasIndex(numtree_number idx); |
| 61 | 61 | ||
| 62 | // Find an object with a specific index. If found, returns true | 62 | // Find an object with a specific index. If found, returns true |
| 63 | - // and initializes oh. | 63 | + // and initializes oh. See also find(). |
| 64 | QPDF_DLL | 64 | QPDF_DLL |
| 65 | bool findObject(numtree_number idx, QPDFObjectHandle& oh); | 65 | bool findObject(numtree_number idx, QPDFObjectHandle& oh); |
| 66 | // Find the object at the index or, if not found, the object whose | 66 | // Find the object at the index or, if not found, the object whose |
| @@ -70,7 +70,8 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper | @@ -70,7 +70,8 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper | ||
| 70 | // offset to the difference between the requested index and the | 70 | // offset to the difference between the requested index and the |
| 71 | // actual index. For example, if a number tree has values for 3 | 71 | // actual index. For example, if a number tree has values for 3 |
| 72 | // and 6 and idx is 5, this method would return true, initialize | 72 | // and 6 and idx is 5, this method would return true, initialize |
| 73 | - // oh to the value with index 3, and set offset to 2 (5 - 3). | 73 | + // oh to the value with index 3, and set offset to 2 (5 - 3). See |
| 74 | + // also find(). | ||
| 74 | QPDF_DLL | 75 | QPDF_DLL |
| 75 | bool findObjectAtOrBelow(numtree_number idx, QPDFObjectHandle& oh, | 76 | bool findObjectAtOrBelow(numtree_number idx, QPDFObjectHandle& oh, |
| 76 | numtree_number& offset); | 77 | numtree_number& offset); |
libqpdf/QPDF.cc
| @@ -3011,8 +3011,7 @@ QPDF::findAttachmentStreams() | @@ -3011,8 +3011,7 @@ QPDF::findAttachmentStreams() | ||
| 3011 | return; | 3011 | return; |
| 3012 | } | 3012 | } |
| 3013 | QPDFNameTreeObjectHelper ef_tree(embedded_files); | 3013 | QPDFNameTreeObjectHelper ef_tree(embedded_files); |
| 3014 | - auto ef_tree_map = ef_tree.getAsMap(); | ||
| 3015 | - for (auto& i: ef_tree_map) | 3014 | + for (auto i: ef_tree) |
| 3016 | { | 3015 | { |
| 3017 | QPDFObjectHandle item = i.second; | 3016 | QPDFObjectHandle item = i.second; |
| 3018 | if (item.isDictionary() && | 3017 | if (item.isDictionary() && |
manual/qpdf-manual.xml
| @@ -4833,6 +4833,13 @@ print "\n"; | @@ -4833,6 +4833,13 @@ print "\n"; | ||
| 4833 | <classname>QPDF</classname>'s public API. | 4833 | <classname>QPDF</classname>'s public API. |
| 4834 | </para> | 4834 | </para> |
| 4835 | </listitem> | 4835 | </listitem> |
| 4836 | + <listitem> | ||
| 4837 | + <para> | ||
| 4838 | + Re-implement <classname>QPDFNameTreeObjectHelper</classname> | ||
| 4839 | + and <classname>QPDFNumberTreeObjectHelper</classname> to be | ||
| 4840 | + more efficient, and add an iterator-based API. | ||
| 4841 | + </para> | ||
| 4842 | + </listitem> | ||
| 4836 | </itemizedlist> | 4843 | </itemizedlist> |
| 4837 | </listitem> | 4844 | </listitem> |
| 4838 | </itemizedlist> | 4845 | </itemizedlist> |