diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index 3077b11..c70e158 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -206,18 +206,27 @@ Array::operator[](int n) const return (*this)[static_cast(n)]; } -std::pair -Array::at(int n) const +QPDFObjectHandle +Array::get(size_t n) const { - auto a = array(); - if (n < 0 || std::cmp_greater_equal(n, size())) { - return {false, {}}; + if (n >= size()) { + return {}; } + auto a = array(); if (!a->sp) { - return {true, a->elements[to_s(n)]}; + return a->elements[n]; + } + auto const& iter = a->sp->elements.find(n); + return iter == a->sp->elements.end() ? null() : iter->second; +} + +QPDFObjectHandle +Array::get(int n) const +{ + if (n < 0) { + return {}; } - auto const& iter = a->sp->elements.find(to_s(n)); - return {true, iter == a->sp->elements.end() ? null() : iter->second}; + return get(to_s(n)); } std::vector diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index e6dd873..992cc84 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -442,7 +442,7 @@ Stream::filterable( int i = -1; for (auto& filter: filters) { - auto d_obj = decode_array.at(++i).second; + auto d_obj = decode_array.get(++i); if (!can_filter(decode_level, *filter, d_obj)) { return false; } diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index 161534c..5a8a348 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -92,7 +92,8 @@ namespace qpdf // Return the number of elements in the array. Return 0 if the object is not an array. size_t size() const; - std::pair at(int n) const; + QPDFObjectHandle get(size_t n) const; + QPDFObjectHandle get(int n) const; bool setAt(int at, QPDFObjectHandle const& oh); bool insert(int at, QPDFObjectHandle const& item); void push_back(QPDFObjectHandle const& item); diff --git a/libtests/sparse_array.cc b/libtests/sparse_array.cc index d0fee40..9dffd7f 100644 --- a/libtests/sparse_array.cc +++ b/libtests/sparse_array.cc @@ -26,69 +26,69 @@ main() a.push_back(QPDFObjectHandle::parse("null")); a.push_back(QPDFObjectHandle::parse("/Quack")); assert(a.size() == 5); - assert(a.at(0).second.isInteger() && (a.at(0).second.getIntValue() == 1)); - assert(a.at(1).second.isString() && (a.at(1).second.getStringValue() == "potato")); - assert(a.at(2).second.isNull()); - assert(a.at(3).second.isNull()); - assert(a.at(4).second.isName() && (a.at(4).second.getName() == "/Quack")); + assert(a[0].isInteger() && (a[0].getIntValue() == 1)); + assert(a[1].isString() && (a[1].getStringValue() == "potato")); + assert(a[2].isNull()); + assert(a[3].isNull()); + assert(a[4].isName() && (a[4].getName() == "/Quack")); a.insert(4, QPDFObjectHandle::parse("/BeforeQuack")); assert(a.size() == 6); - assert(a.at(0).second.isInteger() && (a.at(0).second.getIntValue() == 1)); - assert(a.at(4).second.isName() && (a.at(4).second.getName() == "/BeforeQuack")); - assert(a.at(5).second.isName() && (a.at(5).second.getName() == "/Quack")); + assert(a[0].isInteger() && (a[0].getIntValue() == 1)); + assert(a[4].isName() && (a[4].getName() == "/BeforeQuack")); + assert(a[5].isName() && (a[5].getName() == "/Quack")); a.insert(2, QPDFObjectHandle::parse("/Third")); assert(a.size() == 7); - assert(a.at(1).second.isString() && (a.at(1).second.getStringValue() == "potato")); - assert(a.at(2).second.isName() && (a.at(2).second.getName() == "/Third")); - assert(a.at(3).second.isNull()); - assert(a.at(6).second.isName() && (a.at(6).second.getName() == "/Quack")); + assert(a[1].isString() && (a[1].getStringValue() == "potato")); + assert(a[2].isName() && (a[2].getName() == "/Third")); + assert(a[3].isNull()); + assert(a[6].isName() && (a[6].getName() == "/Quack")); a.insert(0, QPDFObjectHandle::parse("/First")); assert(a.size() == 8); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(7).second.isName() && (a.at(7).second.getName() == "/Quack")); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[7].isName() && (a[7].getName() == "/Quack")); a.erase(6); assert(a.size() == 7); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(5).second.isNull()); - assert(a.at(6).second.isName() && (a.at(6).second.getName() == "/Quack")); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[5].isNull()); + assert(a[6].isName() && (a[6].getName() == "/Quack")); a.erase(6); assert(a.size() == 6); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third")); - assert(a.at(4).second.isNull()); - assert(a.at(5).second.isNull()); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[3].isName() && (a[3].getName() == "/Third")); + assert(a[4].isNull()); + assert(a[5].isNull()); a.setAt(4, QPDFObjectHandle::parse("12")); - assert(a.at(4).second.isInteger() && (a.at(4).second.getIntValue() == 12)); + assert(a[4].isInteger() && (a[4].getIntValue() == 12)); a.setAt(4, QPDFObjectHandle::newNull()); - assert(a.at(4).second.isNull()); + assert(a[4].isNull()); a.erase(to_i(a.size()) - 1); assert(a.size() == 5); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third")); - assert(a.at(4).second.isNull()); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[3].isName() && (a[3].getName() == "/Third")); + assert(a[4].isNull()); a.erase(to_i(a.size()) - 1); assert(a.size() == 4); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third")); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[3].isName() && (a[3].getName() == "/Third")); a.erase(to_i(a.size()) - 1); assert(a.size() == 3); - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First")); - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1)); - assert(a.at(2).second.isString() && (a.at(2).second.getStringValue() == "potato")); + assert(a[0].isName() && (a[0].getName() == "/First")); + assert(a[1].isInteger() && (a[1].getIntValue() == 1)); + assert(a[2].isString() && (a[2].getStringValue() == "potato")); QPDF pdf; pdf.emptyPDF(); @@ -98,15 +98,15 @@ main() auto b = qpdf::Array(obj); b.setAt(5, pdf.newIndirectNull()); b.setAt(7, "[0 1 2 3]"_qpdf); - assert(b.at(3).second.isNull()); - assert(b.at(8).second.isNull()); - assert(b.at(5).second.isIndirect()); + assert(b[3].null()); + assert(b[8].null()); + assert(b[5].indirect()); assert( QPDFObjectHandle(obj).unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]"); auto c = QPDFObjectHandle(obj).unsafeShallowCopy(); auto d = QPDFObjectHandle(obj).shallowCopy(); - b.at(7).second.setArrayItem(2, "42"_qpdf); + b.get(7).setArrayItem(2, "42"_qpdf); assert(c.unparse() == "[ null null null null null 3 0 R null [ 0 1 42 3 ] null null ]"); assert(d.unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");