summaryrefslogtreecommitdiffstats
path: root/include/qpdf/QPDFNumberTreeObjectHelper.hh
diff options
context:
space:
mode:
Diffstat (limited to 'include/qpdf/QPDFNumberTreeObjectHelper.hh')
-rw-r--r--include/qpdf/QPDFNumberTreeObjectHelper.hh34
1 files changed, 12 insertions, 22 deletions
diff --git a/include/qpdf/QPDFNumberTreeObjectHelper.hh b/include/qpdf/QPDFNumberTreeObjectHelper.hh
index 699fc687..7fb9195c 100644
--- a/include/qpdf/QPDFNumberTreeObjectHelper.hh
+++ b/include/qpdf/QPDFNumberTreeObjectHelper.hh
@@ -24,17 +24,15 @@
#include <qpdf/QPDFObjectHelper.hh>
#include <qpdf/QPDFObjGen.hh>
-#include <functional>
#include <map>
+#include <memory>
#include <qpdf/DLL.h>
// This is an object helper for number trees. See section 7.9.7 in the
-// PDF spec (ISO 32000) for a description of number trees. This
-// implementation disregards stated limits and sequencing and simply
-// builds a map from numerical index to object. If the array of
-// numbers does not contain a numerical value where expected, this
-// implementation silently skips forward until it finds a number.
+// PDF spec (ISO 32000) for a description of number trees.
+
+class NNTreeImpl;
class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
{
@@ -75,6 +73,10 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
bool findObjectAtOrBelow(numtree_number idx, QPDFObjectHandle& oh,
numtree_number& offset);
+ // Return the contents of the number tree as a map. Note that
+ // number trees may be very large, so this may use a lot of RAM.
+ // It is more efficient to use QPDFNumberTreeObjectHelper's
+ // iterator.
typedef std::map<numtree_number, QPDFObjectHandle> idx_map;
QPDF_DLL
idx_map getAsMap() const;
@@ -90,23 +92,11 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
~Members();
private:
- Members();
- Members(Members const&);
-
- // Use a reverse sorted map so we can use the lower_bound
- // method for searching. lower_bound returns smallest entry
- // not before the searched entry, meaning that the searched
- // entry is the lower bound. There's also an upper_bound
- // method, but it does not do what you'd think it should.
- // lower_bound implements >=, and upper_bound implements >.
- typedef std::map<numtree_number,
- QPDFObjectHandle,
- std::greater<numtree_number> > idx_map;
- idx_map entries;
- std::set<QPDFObjGen> seen;
- };
+ Members(QPDFObjectHandle& oh);
+ Members(Members const&) = delete;
- void updateMap(QPDFObjectHandle oh);
+ std::shared_ptr<NNTreeImpl> impl;
+ };
PointerHolder<Members> m;
};