mirror of
https://github.com/qpdf/qpdf.git
synced 2025-02-08 22:58:25 +00:00
name/number trees: newEmpty, increment/decrement end()
This commit is contained in:
parent
b5614f611d
commit
16a9bb3f6f
@ -54,6 +54,12 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper
|
|||||||
// structure.
|
// structure.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
QPDFNameTreeObjectHelper(QPDFObjectHandle);
|
QPDFNameTreeObjectHelper(QPDFObjectHandle);
|
||||||
|
|
||||||
|
// Create an empty name tree
|
||||||
|
QPDF_DLL
|
||||||
|
static QPDFNameTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true);
|
||||||
|
|
||||||
|
// ABI: = default
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
virtual ~QPDFNameTreeObjectHelper();
|
virtual ~QPDFNameTreeObjectHelper();
|
||||||
|
|
||||||
@ -112,7 +118,9 @@ class QPDFNameTreeObjectHelper: public QPDFObjectHelper
|
|||||||
};
|
};
|
||||||
|
|
||||||
// The iterator looks like map iterator, so i.first is a string
|
// The iterator looks like map iterator, so i.first is a string
|
||||||
// and i.second is a QPDFObjectHandle.
|
// and i.second is a QPDFObjectHandle. Incrementing end() brings
|
||||||
|
// you to the first item. Decrementing end() brings you to the
|
||||||
|
// last item.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
iterator begin() const;
|
iterator begin() const;
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
|
@ -51,11 +51,17 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
|
|||||||
// structure.
|
// structure.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
QPDFNumberTreeObjectHelper(QPDFObjectHandle);
|
QPDFNumberTreeObjectHelper(QPDFObjectHandle);
|
||||||
|
|
||||||
|
// ABI: = default
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
virtual ~QPDFNumberTreeObjectHelper()
|
virtual ~QPDFNumberTreeObjectHelper()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create an empty number tree
|
||||||
|
QPDF_DLL
|
||||||
|
static QPDFNumberTreeObjectHelper newEmpty(QPDF&, bool auto_repair = true);
|
||||||
|
|
||||||
typedef long long int numtree_number;
|
typedef long long int numtree_number;
|
||||||
|
|
||||||
// Return overall minimum and maximum indices
|
// Return overall minimum and maximum indices
|
||||||
@ -131,7 +137,9 @@ class QPDFNumberTreeObjectHelper: public QPDFObjectHelper
|
|||||||
};
|
};
|
||||||
|
|
||||||
// The iterator looks like map iterator, so i.first is a string
|
// The iterator looks like map iterator, so i.first is a string
|
||||||
// and i.second is a QPDFObjectHandle.
|
// and i.second is a QPDFObjectHandle. Incrementing end() brings
|
||||||
|
// you to the first item. Decrementing end() brings you to the
|
||||||
|
// last item.
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
iterator begin() const;
|
iterator begin() const;
|
||||||
QPDF_DLL
|
QPDF_DLL
|
||||||
|
@ -103,9 +103,9 @@ NNTreeIterator::increment(bool backward)
|
|||||||
{
|
{
|
||||||
if (this->item_number < 0)
|
if (this->item_number < 0)
|
||||||
{
|
{
|
||||||
throw std::logic_error(
|
QTC::TC("qpdf", "NNTree increment end()");
|
||||||
"attempt made to increment or decrement an invalid"
|
deepen(impl.oh, ! backward, true);
|
||||||
" name/number tree iterator");
|
return;
|
||||||
}
|
}
|
||||||
bool found_valid_key = false;
|
bool found_valid_key = false;
|
||||||
while (valid() && (! found_valid_key))
|
while (valid() && (! found_valid_key))
|
||||||
|
@ -56,6 +56,13 @@ QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPDFNameTreeObjectHelper
|
||||||
|
QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)
|
||||||
|
{
|
||||||
|
return QPDFNameTreeObjectHelper(
|
||||||
|
QPDFObjectHandle::parse("<< /Names [] >>"), qpdf, auto_repair);
|
||||||
|
}
|
||||||
|
|
||||||
QPDFNameTreeObjectHelper::iterator::iterator(
|
QPDFNameTreeObjectHelper::iterator::iterator(
|
||||||
std::shared_ptr<NNTreeIterator> const& i) :
|
std::shared_ptr<NNTreeIterator> const& i) :
|
||||||
impl(i)
|
impl(i)
|
||||||
|
@ -52,6 +52,13 @@ QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(QPDFObjectHandle oh) :
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPDFNumberTreeObjectHelper
|
||||||
|
QPDFNumberTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)
|
||||||
|
{
|
||||||
|
return QPDFNumberTreeObjectHelper(
|
||||||
|
QPDFObjectHandle::parse("<< /Nums [] >>"), qpdf, auto_repair);
|
||||||
|
}
|
||||||
|
|
||||||
QPDFNumberTreeObjectHelper::iterator::iterator(
|
QPDFNumberTreeObjectHelper::iterator::iterator(
|
||||||
std::shared_ptr<NNTreeIterator> const& i) :
|
std::shared_ptr<NNTreeIterator> const& i) :
|
||||||
impl(i)
|
impl(i)
|
||||||
|
@ -551,3 +551,4 @@ NNTree -1 in binary search 0
|
|||||||
NNTree bad node during find 0
|
NNTree bad node during find 0
|
||||||
NNTree node is not a dictionary 0
|
NNTree node is not a dictionary 0
|
||||||
NNTree limits didn't change 0
|
NNTree limits didn't change 0
|
||||||
|
NNTree increment end() 0
|
||||||
|
@ -1776,6 +1776,32 @@ void runtest(int n, char const* filename1, char const* arg2)
|
|||||||
assert("six" == oh.getStringValue());
|
assert("six" == oh.getStringValue());
|
||||||
assert(2 == offset);
|
assert(2 == offset);
|
||||||
|
|
||||||
|
auto new1 = QPDFNumberTreeObjectHelper::newEmpty(pdf);
|
||||||
|
auto iter1 = new1.begin();
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
++iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
new1.insert(1, QPDFObjectHandle::newString("1"));
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == 1);
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert((*iter1).first == 1);
|
||||||
|
new1.insert(2, QPDFObjectHandle::newString("2"));
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == 2);
|
||||||
|
++iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == 1);
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert((*iter1).first == 2);
|
||||||
|
|
||||||
// Exercise deprecated API until qpdf 11
|
// Exercise deprecated API until qpdf 11
|
||||||
std::cout << "/Bad1: deprecated API" << std::endl;
|
std::cout << "/Bad1: deprecated API" << std::endl;
|
||||||
auto bad1 = QPDFNumberTreeObjectHelper(
|
auto bad1 = QPDFNumberTreeObjectHelper(
|
||||||
@ -1909,6 +1935,32 @@ void runtest(int n, char const* filename1, char const* arg2)
|
|||||||
assert((*last).first == "29 twenty-nine");
|
assert((*last).first == "29 twenty-nine");
|
||||||
assert((*last).second.getUTF8Value() == "twenty-nine!");
|
assert((*last).second.getUTF8Value() == "twenty-nine!");
|
||||||
|
|
||||||
|
auto new1 = QPDFNameTreeObjectHelper::newEmpty(pdf);
|
||||||
|
auto iter1 = new1.begin();
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
++iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
new1.insert("1", QPDFObjectHandle::newString("1"));
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == "1");
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert((*iter1).first == "1");
|
||||||
|
new1.insert("2", QPDFObjectHandle::newString("2"));
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == "2");
|
||||||
|
++iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
++iter1;
|
||||||
|
assert((*iter1).first == "1");
|
||||||
|
--iter1;
|
||||||
|
assert(iter1 == new1.end());
|
||||||
|
--iter1;
|
||||||
|
assert((*iter1).first == "2");
|
||||||
|
|
||||||
std::vector<std::string> empties = {"/Empty1", "/Empty2"};
|
std::vector<std::string> empties = {"/Empty1", "/Empty2"};
|
||||||
for (auto const& k: empties)
|
for (auto const& k: empties)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user