summaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_Array.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDF_Array.cc')
-rw-r--r--libqpdf/QPDF_Array.cc181
1 files changed, 140 insertions, 41 deletions
diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc
index 93fbf928..ed43245f 100644
--- a/libqpdf/QPDF_Array.cc
+++ b/libqpdf/QPDF_Array.cc
@@ -19,6 +19,13 @@ QPDF_Array::QPDF_Array(std::vector<std::shared_ptr<QPDFObject>>&& v) :
QPDF_Array::QPDF_Array(SparseOHArray const& items) :
QPDFValue(::ot_array, "array"),
+ sp_elements(items)
+{
+}
+
+QPDF_Array::QPDF_Array(OHArray const& items) :
+ QPDFValue(::ot_array, "array"),
+ sparse(false),
elements(items)
{
}
@@ -42,92 +49,167 @@ QPDF_Array::create(SparseOHArray const& items)
}
std::shared_ptr<QPDFObject>
+QPDF_Array::create(OHArray const& items)
+{
+ return do_create(new QPDF_Array(items));
+}
+
+std::shared_ptr<QPDFObject>
QPDF_Array::copy(bool shallow)
{
- return create(shallow ? elements : elements.copy());
+ if (sparse) {
+ return create(shallow ? sp_elements : sp_elements.copy());
+ } else {
+ return create(shallow ? elements : elements.copy());
+ }
}
void
QPDF_Array::disconnect()
{
- elements.disconnect();
+ if (sparse) {
+ sp_elements.disconnect();
+ } else {
+ elements.disconnect();
+ }
}
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 += " ";
+ if (sparse) {
+ std::string result = "[ ";
+ size_t size = sp_elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ result += sp_elements.at(i).unparse();
+ result += " ";
+ }
+ result += "]";
+ return result;
+ } else {
+ std::string result = "[ ";
+ size_t size = elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ result += elements.at(i).unparse();
+ result += " ";
+ }
+ result += "]";
+ return 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));
+ if (sparse) {
+ JSON j = JSON::makeArray();
+ size_t size = sp_elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ j.addArrayElement(sp_elements.at(i).getJSON(json_version));
+ }
+ return j;
+ } else {
+ JSON j = JSON::makeArray();
+ size_t size = elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ j.addArrayElement(elements.at(i).getJSON(json_version));
+ }
+ return j;
}
- 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());
+ if (sparse) {
+ // This should really return a size_t, but changing it would break
+ // a lot of code.
+ return QIntC::to_int(sp_elements.size());
+ } else {
+ return QIntC::to_int(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");
+ if (sparse) {
+ if ((n < 0) || (n >= QIntC::to_int(sp_elements.size()))) {
+ throw std::logic_error(
+ "INTERNAL ERROR: bounds error accessing QPDF_Array element");
+ }
+ return sp_elements.at(QIntC::to_size(n));
+ } else {
+ if ((n < 0) || (n >= QIntC::to_int(elements.size()))) {
+ throw std::logic_error(
+ "INTERNAL ERROR: bounds error accessing QPDF_Array element");
+ }
+ return elements.at(QIntC::to_size(n));
}
- 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));
+ if (sparse) {
+ size_t size = sp_elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ v.push_back(sp_elements.at(i));
+ }
+ } else {
+ size_t size = elements.size();
+ for (size_t i = 0; i < size; ++i) {
+ v.push_back(elements.at(i));
+ }
}
}
void
QPDF_Array::setItem(int n, QPDFObjectHandle const& oh)
{
- this->elements.setAt(QIntC::to_size(n), oh);
+ if (sparse) {
+ sp_elements.setAt(QIntC::to_size(n), oh);
+ } else {
+ 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);
+ if (sparse) {
+ sp_elements = SparseOHArray();
+ for (auto const& iter: v) {
+ sp_elements.append(iter);
+ }
+ } else {
+ elements = OHArray();
+ for (auto const& iter: v) {
+ elements.append(iter);
+ }
}
}
void
QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v)
{
- this->elements = SparseOHArray();
- for (auto&& item: v) {
- if (item) {
- this->elements.append(item);
- } else {
- ++this->elements.n_elements;
+ if (sparse) {
+ sp_elements = SparseOHArray();
+ for (auto&& item: v) {
+ if (item) {
+ sp_elements.append(item);
+ } else {
+ ++sp_elements.n_elements;
+ }
+ }
+ } else {
+ elements = OHArray();
+ for (auto&& item: v) {
+ if (item) {
+ elements.append(item);
+ } else {
+ ++elements.n_elements;
+ }
}
}
}
@@ -135,22 +217,39 @@ QPDF_Array::setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& v)
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");
+ if (sparse) {
+ // As special case, also allow insert beyond the end
+ if ((at < 0) || (at > QIntC::to_int(sp_elements.size()))) {
+ throw std::logic_error(
+ "INTERNAL ERROR: bounds error accessing QPDF_Array element");
+ }
+ sp_elements.insert(QIntC::to_size(at), item);
+ } else {
+ // As special case, also allow insert beyond the end
+ if ((at < 0) || (at > QIntC::to_int(elements.size()))) {
+ throw std::logic_error(
+ "INTERNAL ERROR: bounds error accessing QPDF_Array element");
+ }
+ elements.insert(QIntC::to_size(at), item);
}
- this->elements.insert(QIntC::to_size(at), item);
}
void
QPDF_Array::appendItem(QPDFObjectHandle const& item)
{
- this->elements.append(item);
+ if (sparse) {
+ sp_elements.append(item);
+ } else {
+ elements.append(item);
+ }
}
void
QPDF_Array::eraseItem(int at)
{
- this->elements.erase(QIntC::to_size(at));
+ if (sparse) {
+ sp_elements.erase(QIntC::to_size(at));
+ } else {
+ elements.erase(QIntC::to_size(at));
+ }
}