diff options
Diffstat (limited to 'libqpdf/QPDF_Array.cc')
-rw-r--r-- | libqpdf/QPDF_Array.cc | 181 |
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)); + } } |