diff --git a/libqpdf/CMakeLists.txt b/libqpdf/CMakeLists.txt index 12d7018..ade7a2d 100644 --- a/libqpdf/CMakeLists.txt +++ b/libqpdf/CMakeLists.txt @@ -71,8 +71,6 @@ set(libqpdf_SOURCES QPDFJob_json.cc QPDFLogger.cc QPDFMatrix.cc - QPDFNameTreeObjectHelper.cc - QPDFNumberTreeObjectHelper.cc QPDFObject.cc QPDFObjectHandle.cc QPDFObjectHelper.cc diff --git a/libqpdf/NNTree.cc b/libqpdf/NNTree.cc index 3472b50..692828e 100644 --- a/libqpdf/NNTree.cc +++ b/libqpdf/NNTree.cc @@ -2,6 +2,9 @@ #include +#include +#include + #include #include #include @@ -847,3 +850,414 @@ NNTreeImpl::validate(bool a_repair) } return true; } + +QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() // NOLINT (modernize-use-equals-default) +{ + // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific + // class, see github issue #745. +} + +QPDFNameTreeObjectHelper::Members::Members( + QPDFObjectHandle& oh, + QPDF& q, + std::function value_validator, + bool auto_repair) : + impl(std::make_shared(q, oh, ::ot_string, value_validator, auto_repair)) +{ +} + +QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh, QPDF& q, bool auto_repair) : + QPDFObjectHelper(oh), + m(new Members( + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast(o); }, auto_repair)) +{ +} + +QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( + QPDFObjectHandle oh, + QPDF& q, + std::function value_validator, + bool auto_repair) : + QPDFObjectHelper(oh), + m(new Members(oh, q, value_validator, auto_repair)) +{ +} + +QPDFNameTreeObjectHelper +QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair) +{ + return {qpdf.makeIndirectObject("<< /Names [] >>"_qpdf), qpdf, auto_repair}; +} + +QPDFNameTreeObjectHelper::iterator::iterator(std::shared_ptr const& i) : + impl(i) +{ +} + +bool +QPDFNameTreeObjectHelper::iterator::valid() const +{ + return impl->valid(); +} + +QPDFNameTreeObjectHelper::iterator& +QPDFNameTreeObjectHelper::iterator::operator++() +{ + ++(*impl); + updateIValue(); + return *this; +} + +QPDFNameTreeObjectHelper::iterator& +QPDFNameTreeObjectHelper::iterator::operator--() +{ + --(*impl); + updateIValue(); + return *this; +} + +void +QPDFNameTreeObjectHelper::iterator::updateIValue() +{ + if (impl->valid()) { + auto p = *impl; + ivalue.first = p->first.getUTF8Value(); + ivalue.second = p->second; + } else { + ivalue.first = ""; + ivalue.second = QPDFObjectHandle(); + } +} + +QPDFNameTreeObjectHelper::iterator::reference +QPDFNameTreeObjectHelper::iterator::operator*() +{ + updateIValue(); + return ivalue; +} + +QPDFNameTreeObjectHelper::iterator::pointer +QPDFNameTreeObjectHelper::iterator::operator->() +{ + updateIValue(); + return &ivalue; +} + +bool +QPDFNameTreeObjectHelper::iterator::operator==(iterator const& other) const +{ + return *(impl) == *(other.impl); +} + +void +QPDFNameTreeObjectHelper::iterator::insertAfter(std::string const& key, QPDFObjectHandle value) +{ + impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value); + updateIValue(); +} + +void +QPDFNameTreeObjectHelper::iterator::remove() +{ + impl->remove(); + updateIValue(); +} + +QPDFNameTreeObjectHelper::iterator +QPDFNameTreeObjectHelper::begin() const +{ + return {std::make_shared(m->impl->begin())}; +} + +QPDFNameTreeObjectHelper::iterator +QPDFNameTreeObjectHelper::end() const +{ + return {std::make_shared(m->impl->end())}; +} + +QPDFNameTreeObjectHelper::iterator +QPDFNameTreeObjectHelper::last() const +{ + return {std::make_shared(m->impl->last())}; +} + +QPDFNameTreeObjectHelper::iterator +QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found) +{ + auto i = m->impl->find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found); + return {std::make_shared(i)}; +} + +QPDFNameTreeObjectHelper::iterator +QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value) +{ + auto i = m->impl->insert(QPDFObjectHandle::newUnicodeString(key), value); + return {std::make_shared(i)}; +} + +bool +QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value) +{ + return m->impl->remove(QPDFObjectHandle::newUnicodeString(key), value); +} + +bool +QPDFNameTreeObjectHelper::hasName(std::string const& name) +{ + auto i = find(name); + return (i != end()); +} + +bool +QPDFNameTreeObjectHelper::findObject(std::string const& name, QPDFObjectHandle& oh) +{ + auto i = find(name); + if (i == end()) { + return false; + } + oh = i->second; + return true; +} + +void +QPDFNameTreeObjectHelper::setSplitThreshold(int t) +{ + m->impl->setSplitThreshold(t); +} + +std::map +QPDFNameTreeObjectHelper::getAsMap() const +{ + std::map result; + result.insert(begin(), end()); + return result; +} + +bool +QPDFNameTreeObjectHelper::validate(bool repair) +{ + return m->impl->validate(repair); +} + +QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() // NOLINT (modernize-use-equals-default) +{ + // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific + // class, see github issue #745. +} + +QPDFNumberTreeObjectHelper::Members::Members( + QPDFObjectHandle& oh, + QPDF& q, + std::function value_validator, + bool auto_repair) : + impl(std::make_shared(q, oh, ::ot_integer, value_validator, auto_repair)) +{ +} + +QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( + QPDFObjectHandle oh, QPDF& q, bool auto_repair) : + QPDFObjectHelper(oh), + m(new Members( + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast(o); }, auto_repair)) +{ +} + +QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( + QPDFObjectHandle oh, + QPDF& q, + std::function value_validator, + bool auto_repair) : + QPDFObjectHelper(oh), + m(new Members(oh, q, value_validator, auto_repair)) +{ +} + +QPDFNumberTreeObjectHelper +QPDFNumberTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair) +{ + return {qpdf.makeIndirectObject("<< /Nums [] >>"_qpdf), qpdf, auto_repair}; +} + +QPDFNumberTreeObjectHelper::iterator::iterator(std::shared_ptr const& i) : + impl(i) +{ +} + +bool +QPDFNumberTreeObjectHelper::iterator::valid() const +{ + return impl->valid(); +} + +QPDFNumberTreeObjectHelper::iterator& +QPDFNumberTreeObjectHelper::iterator::operator++() +{ + ++(*impl); + updateIValue(); + return *this; +} + +QPDFNumberTreeObjectHelper::iterator& +QPDFNumberTreeObjectHelper::iterator::operator--() +{ + --(*impl); + updateIValue(); + return *this; +} + +void +QPDFNumberTreeObjectHelper::iterator::updateIValue() +{ + if (impl->valid()) { + auto p = *impl; + this->ivalue.first = p->first.getIntValue(); + this->ivalue.second = p->second; + } else { + this->ivalue.first = 0; + this->ivalue.second = QPDFObjectHandle(); + } +} + +QPDFNumberTreeObjectHelper::iterator::reference +QPDFNumberTreeObjectHelper::iterator::operator*() +{ + updateIValue(); + return this->ivalue; +} + +QPDFNumberTreeObjectHelper::iterator::pointer +QPDFNumberTreeObjectHelper::iterator::operator->() +{ + updateIValue(); + return &this->ivalue; +} + +bool +QPDFNumberTreeObjectHelper::iterator::operator==(iterator const& other) const +{ + return *(impl) == *(other.impl); +} + +void +QPDFNumberTreeObjectHelper::iterator::insertAfter(numtree_number key, QPDFObjectHandle value) +{ + impl->insertAfter(QPDFObjectHandle::newInteger(key), value); + updateIValue(); +} + +void +QPDFNumberTreeObjectHelper::iterator::remove() +{ + impl->remove(); + updateIValue(); +} + +QPDFNumberTreeObjectHelper::iterator +QPDFNumberTreeObjectHelper::begin() const +{ + return {std::make_shared(m->impl->begin())}; +} + +QPDFNumberTreeObjectHelper::iterator +QPDFNumberTreeObjectHelper::end() const +{ + return {std::make_shared(m->impl->end())}; +} + +QPDFNumberTreeObjectHelper::iterator +QPDFNumberTreeObjectHelper::last() const +{ + return {std::make_shared(m->impl->last())}; +} + +QPDFNumberTreeObjectHelper::iterator +QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found) +{ + auto i = m->impl->find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found); + return {std::make_shared(i)}; +} + +QPDFNumberTreeObjectHelper::iterator +QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value) +{ + auto i = m->impl->insert(QPDFObjectHandle::newInteger(key), value); + return {std::make_shared(i)}; +} + +bool +QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value) +{ + return m->impl->remove(QPDFObjectHandle::newInteger(key), value); +} + +QPDFNumberTreeObjectHelper::numtree_number +QPDFNumberTreeObjectHelper::getMin() +{ + auto i = begin(); + if (i == end()) { + return 0; + } + return i->first; +} + +QPDFNumberTreeObjectHelper::numtree_number +QPDFNumberTreeObjectHelper::getMax() +{ + auto i = last(); + if (i == end()) { + return 0; + } + return i->first; +} + +bool +QPDFNumberTreeObjectHelper::hasIndex(numtree_number idx) +{ + auto i = find(idx); + return (i != this->end()); +} + +bool +QPDFNumberTreeObjectHelper::findObject(numtree_number idx, QPDFObjectHandle& oh) +{ + auto i = find(idx); + if (i == end()) { + return false; + } + oh = i->second; + return true; +} + +bool +QPDFNumberTreeObjectHelper::findObjectAtOrBelow( + numtree_number idx, QPDFObjectHandle& oh, numtree_number& offset) +{ + auto i = find(idx, true); + if (i == end()) { + return false; + } + oh = i->second; + QIntC::range_check_subtract(idx, i->first); + offset = idx - i->first; + return true; +} + +void +QPDFNumberTreeObjectHelper::setSplitThreshold(int t) +{ + m->impl->setSplitThreshold(t); +} + +std::map +QPDFNumberTreeObjectHelper::getAsMap() const +{ + std::map result; + result.insert(begin(), end()); + return result; +} + +bool +QPDFNumberTreeObjectHelper::validate(bool repair) +{ + return m->impl->validate(repair); +} diff --git a/libqpdf/QPDFNameTreeObjectHelper.cc b/libqpdf/QPDFNameTreeObjectHelper.cc index 9b455e3..e69de29 100644 --- a/libqpdf/QPDFNameTreeObjectHelper.cc +++ b/libqpdf/QPDFNameTreeObjectHelper.cc @@ -1,191 +0,0 @@ -#include - -#include - -QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() // NOLINT (modernize-use-equals-default) -{ - // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific - // class, see github issue #745. -} - -QPDFNameTreeObjectHelper::Members::Members( - QPDFObjectHandle& oh, - QPDF& q, - std::function value_validator, - bool auto_repair) : - impl(std::make_shared(q, oh, ::ot_string, value_validator, auto_repair)) -{ -} - -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh, QPDF& q, bool auto_repair) : - QPDFObjectHelper(oh), - m(new Members( - oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast(o); }, auto_repair)) -{ -} - -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( - QPDFObjectHandle oh, - QPDF& q, - std::function value_validator, - bool auto_repair) : - QPDFObjectHelper(oh), - m(new Members(oh, q, value_validator, auto_repair)) -{ -} - -QPDFNameTreeObjectHelper -QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair) -{ - return {qpdf.makeIndirectObject("<< /Names [] >>"_qpdf), qpdf, auto_repair}; -} - -QPDFNameTreeObjectHelper::iterator::iterator(std::shared_ptr const& i) : - impl(i) -{ -} - -bool -QPDFNameTreeObjectHelper::iterator::valid() const -{ - return impl->valid(); -} - -QPDFNameTreeObjectHelper::iterator& -QPDFNameTreeObjectHelper::iterator::operator++() -{ - ++(*impl); - updateIValue(); - return *this; -} - -QPDFNameTreeObjectHelper::iterator& -QPDFNameTreeObjectHelper::iterator::operator--() -{ - --(*impl); - updateIValue(); - return *this; -} - -void -QPDFNameTreeObjectHelper::iterator::updateIValue() -{ - if (impl->valid()) { - auto p = *impl; - ivalue.first = p->first.getUTF8Value(); - ivalue.second = p->second; - } else { - ivalue.first = ""; - ivalue.second = QPDFObjectHandle(); - } -} - -QPDFNameTreeObjectHelper::iterator::reference -QPDFNameTreeObjectHelper::iterator::operator*() -{ - updateIValue(); - return ivalue; -} - -QPDFNameTreeObjectHelper::iterator::pointer -QPDFNameTreeObjectHelper::iterator::operator->() -{ - updateIValue(); - return &ivalue; -} - -bool -QPDFNameTreeObjectHelper::iterator::operator==(iterator const& other) const -{ - return *(impl) == *(other.impl); -} - -void -QPDFNameTreeObjectHelper::iterator::insertAfter(std::string const& key, QPDFObjectHandle value) -{ - impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value); - updateIValue(); -} - -void -QPDFNameTreeObjectHelper::iterator::remove() -{ - impl->remove(); - updateIValue(); -} - -QPDFNameTreeObjectHelper::iterator -QPDFNameTreeObjectHelper::begin() const -{ - return {std::make_shared(m->impl->begin())}; -} - -QPDFNameTreeObjectHelper::iterator -QPDFNameTreeObjectHelper::end() const -{ - return {std::make_shared(m->impl->end())}; -} - -QPDFNameTreeObjectHelper::iterator -QPDFNameTreeObjectHelper::last() const -{ - return {std::make_shared(m->impl->last())}; -} - -QPDFNameTreeObjectHelper::iterator -QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found) -{ - auto i = m->impl->find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found); - return {std::make_shared(i)}; -} - -QPDFNameTreeObjectHelper::iterator -QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value) -{ - auto i = m->impl->insert(QPDFObjectHandle::newUnicodeString(key), value); - return {std::make_shared(i)}; -} - -bool -QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value) -{ - return m->impl->remove(QPDFObjectHandle::newUnicodeString(key), value); -} - -bool -QPDFNameTreeObjectHelper::hasName(std::string const& name) -{ - auto i = find(name); - return (i != end()); -} - -bool -QPDFNameTreeObjectHelper::findObject(std::string const& name, QPDFObjectHandle& oh) -{ - auto i = find(name); - if (i == end()) { - return false; - } - oh = i->second; - return true; -} - -void -QPDFNameTreeObjectHelper::setSplitThreshold(int t) -{ - m->impl->setSplitThreshold(t); -} - -std::map -QPDFNameTreeObjectHelper::getAsMap() const -{ - std::map result; - result.insert(begin(), end()); - return result; -} - -bool -QPDFNameTreeObjectHelper::validate(bool repair) -{ - return m->impl->validate(repair); -} diff --git a/libqpdf/QPDFNumberTreeObjectHelper.cc b/libqpdf/QPDFNumberTreeObjectHelper.cc index df5461c..e69de29 100644 --- a/libqpdf/QPDFNumberTreeObjectHelper.cc +++ b/libqpdf/QPDFNumberTreeObjectHelper.cc @@ -1,227 +0,0 @@ -#include - -#include -#include - -QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() // NOLINT (modernize-use-equals-default) -{ - // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific - // class, see github issue #745. -} - -QPDFNumberTreeObjectHelper::Members::Members( - QPDFObjectHandle& oh, - QPDF& q, - std::function value_validator, - bool auto_repair) : - impl(std::make_shared(q, oh, ::ot_integer, value_validator, auto_repair)) -{ -} - -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( - QPDFObjectHandle oh, QPDF& q, bool auto_repair) : - QPDFObjectHelper(oh), - m(new Members( - oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast(o); }, auto_repair)) -{ -} - -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( - QPDFObjectHandle oh, - QPDF& q, - std::function value_validator, - bool auto_repair) : - QPDFObjectHelper(oh), - m(new Members(oh, q, value_validator, auto_repair)) -{ -} - -QPDFNumberTreeObjectHelper -QPDFNumberTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair) -{ - return {qpdf.makeIndirectObject("<< /Nums [] >>"_qpdf), qpdf, auto_repair}; -} - -QPDFNumberTreeObjectHelper::iterator::iterator(std::shared_ptr const& i) : - impl(i) -{ -} - -bool -QPDFNumberTreeObjectHelper::iterator::valid() const -{ - return impl->valid(); -} - -QPDFNumberTreeObjectHelper::iterator& -QPDFNumberTreeObjectHelper::iterator::operator++() -{ - ++(*impl); - updateIValue(); - return *this; -} - -QPDFNumberTreeObjectHelper::iterator& -QPDFNumberTreeObjectHelper::iterator::operator--() -{ - --(*impl); - updateIValue(); - return *this; -} - -void -QPDFNumberTreeObjectHelper::iterator::updateIValue() -{ - if (impl->valid()) { - auto p = *impl; - this->ivalue.first = p->first.getIntValue(); - this->ivalue.second = p->second; - } else { - this->ivalue.first = 0; - this->ivalue.second = QPDFObjectHandle(); - } -} - -QPDFNumberTreeObjectHelper::iterator::reference -QPDFNumberTreeObjectHelper::iterator::operator*() -{ - updateIValue(); - return this->ivalue; -} - -QPDFNumberTreeObjectHelper::iterator::pointer -QPDFNumberTreeObjectHelper::iterator::operator->() -{ - updateIValue(); - return &this->ivalue; -} - -bool -QPDFNumberTreeObjectHelper::iterator::operator==(iterator const& other) const -{ - return *(impl) == *(other.impl); -} - -void -QPDFNumberTreeObjectHelper::iterator::insertAfter(numtree_number key, QPDFObjectHandle value) -{ - impl->insertAfter(QPDFObjectHandle::newInteger(key), value); - updateIValue(); -} - -void -QPDFNumberTreeObjectHelper::iterator::remove() -{ - impl->remove(); - updateIValue(); -} - -QPDFNumberTreeObjectHelper::iterator -QPDFNumberTreeObjectHelper::begin() const -{ - return {std::make_shared(m->impl->begin())}; -} - -QPDFNumberTreeObjectHelper::iterator -QPDFNumberTreeObjectHelper::end() const -{ - return {std::make_shared(m->impl->end())}; -} - -QPDFNumberTreeObjectHelper::iterator -QPDFNumberTreeObjectHelper::last() const -{ - return {std::make_shared(m->impl->last())}; -} - -QPDFNumberTreeObjectHelper::iterator -QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found) -{ - auto i = m->impl->find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found); - return {std::make_shared(i)}; -} - -QPDFNumberTreeObjectHelper::iterator -QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value) -{ - auto i = m->impl->insert(QPDFObjectHandle::newInteger(key), value); - return {std::make_shared(i)}; -} - -bool -QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value) -{ - return m->impl->remove(QPDFObjectHandle::newInteger(key), value); -} - -QPDFNumberTreeObjectHelper::numtree_number -QPDFNumberTreeObjectHelper::getMin() -{ - auto i = begin(); - if (i == end()) { - return 0; - } - return i->first; -} - -QPDFNumberTreeObjectHelper::numtree_number -QPDFNumberTreeObjectHelper::getMax() -{ - auto i = last(); - if (i == end()) { - return 0; - } - return i->first; -} - -bool -QPDFNumberTreeObjectHelper::hasIndex(numtree_number idx) -{ - auto i = find(idx); - return (i != this->end()); -} - -bool -QPDFNumberTreeObjectHelper::findObject(numtree_number idx, QPDFObjectHandle& oh) -{ - auto i = find(idx); - if (i == end()) { - return false; - } - oh = i->second; - return true; -} - -bool -QPDFNumberTreeObjectHelper::findObjectAtOrBelow( - numtree_number idx, QPDFObjectHandle& oh, numtree_number& offset) -{ - auto i = find(idx, true); - if (i == end()) { - return false; - } - oh = i->second; - QIntC::range_check_subtract(idx, i->first); - offset = idx - i->first; - return true; -} - -void -QPDFNumberTreeObjectHelper::setSplitThreshold(int t) -{ - m->impl->setSplitThreshold(t); -} - -std::map -QPDFNumberTreeObjectHelper::getAsMap() const -{ - std::map result; - result.insert(begin(), end()); - return result; -} - -bool -QPDFNumberTreeObjectHelper::validate(bool repair) -{ - return m->impl->validate(repair); -}