2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-09-26 20:19:05 +00:00
qpdf/libqpdf/QPDF_Array.cc
m-holger 9c86ba40d8 Fix commit 805c1ad : Reset QPDFValue::qpdf and QPDFValue::og when ...
On destruction of the QPDF object replace all indirect object references
with direct nulls.

Remove all existing code to release resolved references.

Fixes performance issue due to interaction of resetting QPDFValue::qpdf and
og members and prior code.
2022-09-04 10:41:18 +01:00

133 lines
2.8 KiB
C++

#include <qpdf/QPDF_Array.hh>
#include <qpdf/QIntC.hh>
#include <qpdf/QUtil.hh>
#include <stdexcept>
QPDF_Array::QPDF_Array(std::vector<QPDFObjectHandle> const& v) :
QPDFValue(::ot_array, "array")
{
setFromVector(v);
}
QPDF_Array::QPDF_Array(SparseOHArray const& items) :
QPDFValue(::ot_array, "array"),
elements(items)
{
}
std::shared_ptr<QPDFObject>
QPDF_Array::create(std::vector<QPDFObjectHandle> const& items)
{
return do_create(new QPDF_Array(items));
}
std::shared_ptr<QPDFObject>
QPDF_Array::create(SparseOHArray const& items)
{
return do_create(new QPDF_Array(items));
}
std::shared_ptr<QPDFObject>
QPDF_Array::shallowCopy()
{
return create(elements);
}
std::string
QPDF_Array::unparse()
{
std::string result = "[ ";
size_t size = this->elements.size();
for (size_t i = 0; i < size; ++i) {
result += this->elements.at(i).unparse();
result += " ";
}
result += "]";
return result;
}
JSON
QPDF_Array::getJSON(int json_version)
{
JSON j = JSON::makeArray();
size_t size = this->elements.size();
for (size_t i = 0; i < size; ++i) {
j.addArrayElement(this->elements.at(i).getJSON(json_version));
}
return j;
}
int
QPDF_Array::getNItems() const
{
// This should really return a size_t, but changing it would break
// a lot of code.
return QIntC::to_int(this->elements.size());
}
QPDFObjectHandle
QPDF_Array::getItem(int n) const
{
if ((n < 0) || (n >= QIntC::to_int(elements.size()))) {
throw std::logic_error(
"INTERNAL ERROR: bounds error accessing QPDF_Array element");
}
return this->elements.at(QIntC::to_size(n));
}
void
QPDF_Array::getAsVector(std::vector<QPDFObjectHandle>& v) const
{
size_t size = this->elements.size();
for (size_t i = 0; i < size; ++i) {
v.push_back(this->elements.at(i));
}
}
void
QPDF_Array::setItem(int n, QPDFObjectHandle const& oh)
{
this->elements.setAt(QIntC::to_size(n), oh);
}
void
QPDF_Array::setFromVector(std::vector<QPDFObjectHandle> const& v)
{
this->elements = SparseOHArray();
for (auto const& iter: v) {
this->elements.append(iter);
}
}
void
QPDF_Array::insertItem(int at, QPDFObjectHandle const& item)
{
// As special case, also allow insert beyond the end
if ((at < 0) || (at > QIntC::to_int(this->elements.size()))) {
throw std::logic_error(
"INTERNAL ERROR: bounds error accessing QPDF_Array element");
}
this->elements.insert(QIntC::to_size(at), item);
}
void
QPDF_Array::appendItem(QPDFObjectHandle const& item)
{
this->elements.append(item);
}
void
QPDF_Array::eraseItem(int at)
{
this->elements.erase(QIntC::to_size(at));
}
void
QPDF_Array::addExplicitElementsToList(std::list<QPDFObjectHandle>& l) const
{
for (auto const& iter: this->elements) {
l.push_back(iter.second);
}
}