Commit 091580cc2d9cced9772704cabf95a62bc234d5d9

Authored by m-holger
1 parent 92de8397

Refactor `Array` API: replace `at` with `get` for improved clarity, update tests…

… to use subscript operators, and simplify object access logic.
libqpdf/QPDF_Array.cc
@@ -206,18 +206,27 @@ Array::operator[](int n) const @@ -206,18 +206,27 @@ Array::operator[](int n) const
206 return (*this)[static_cast<size_t>(n)]; 206 return (*this)[static_cast<size_t>(n)];
207 } 207 }
208 208
209 -std::pair<bool, QPDFObjectHandle>  
210 -Array::at(int n) const 209 +QPDFObjectHandle
  210 +Array::get(size_t n) const
211 { 211 {
212 - auto a = array();  
213 - if (n < 0 || std::cmp_greater_equal(n, size())) {  
214 - return {false, {}}; 212 + if (n >= size()) {
  213 + return {};
215 } 214 }
  215 + auto a = array();
216 if (!a->sp) { 216 if (!a->sp) {
217 - return {true, a->elements[to_s(n)]}; 217 + return a->elements[n];
  218 + }
  219 + auto const& iter = a->sp->elements.find(n);
  220 + return iter == a->sp->elements.end() ? null() : iter->second;
  221 +}
  222 +
  223 +QPDFObjectHandle
  224 +Array::get(int n) const
  225 +{
  226 + if (n < 0) {
  227 + return {};
218 } 228 }
219 - auto const& iter = a->sp->elements.find(to_s(n));  
220 - return {true, iter == a->sp->elements.end() ? null() : iter->second}; 229 + return get(to_s(n));
221 } 230 }
222 231
223 std::vector<QPDFObjectHandle> 232 std::vector<QPDFObjectHandle>
libqpdf/QPDF_Stream.cc
@@ -442,7 +442,7 @@ Stream::filterable( @@ -442,7 +442,7 @@ Stream::filterable(
442 442
443 int i = -1; 443 int i = -1;
444 for (auto& filter: filters) { 444 for (auto& filter: filters) {
445 - auto d_obj = decode_array.at(++i).second; 445 + auto d_obj = decode_array.get(++i);
446 if (!can_filter(decode_level, *filter, d_obj)) { 446 if (!can_filter(decode_level, *filter, d_obj)) {
447 return false; 447 return false;
448 } 448 }
libqpdf/qpdf/QPDFObjectHandle_private.hh
@@ -92,7 +92,8 @@ namespace qpdf @@ -92,7 +92,8 @@ namespace qpdf
92 92
93 // Return the number of elements in the array. Return 0 if the object is not an array. 93 // Return the number of elements in the array. Return 0 if the object is not an array.
94 size_t size() const; 94 size_t size() const;
95 - std::pair<bool, QPDFObjectHandle> at(int n) const; 95 + QPDFObjectHandle get(size_t n) const;
  96 + QPDFObjectHandle get(int n) const;
96 bool setAt(int at, QPDFObjectHandle const& oh); 97 bool setAt(int at, QPDFObjectHandle const& oh);
97 bool insert(int at, QPDFObjectHandle const& item); 98 bool insert(int at, QPDFObjectHandle const& item);
98 void push_back(QPDFObjectHandle const& item); 99 void push_back(QPDFObjectHandle const& item);
libtests/sparse_array.cc
@@ -26,69 +26,69 @@ main() @@ -26,69 +26,69 @@ main()
26 a.push_back(QPDFObjectHandle::parse("null")); 26 a.push_back(QPDFObjectHandle::parse("null"));
27 a.push_back(QPDFObjectHandle::parse("/Quack")); 27 a.push_back(QPDFObjectHandle::parse("/Quack"));
28 assert(a.size() == 5); 28 assert(a.size() == 5);
29 - assert(a.at(0).second.isInteger() && (a.at(0).second.getIntValue() == 1));  
30 - assert(a.at(1).second.isString() && (a.at(1).second.getStringValue() == "potato"));  
31 - assert(a.at(2).second.isNull());  
32 - assert(a.at(3).second.isNull());  
33 - assert(a.at(4).second.isName() && (a.at(4).second.getName() == "/Quack")); 29 + assert(a[0].isInteger() && (a[0].getIntValue() == 1));
  30 + assert(a[1].isString() && (a[1].getStringValue() == "potato"));
  31 + assert(a[2].isNull());
  32 + assert(a[3].isNull());
  33 + assert(a[4].isName() && (a[4].getName() == "/Quack"));
34 34
35 a.insert(4, QPDFObjectHandle::parse("/BeforeQuack")); 35 a.insert(4, QPDFObjectHandle::parse("/BeforeQuack"));
36 assert(a.size() == 6); 36 assert(a.size() == 6);
37 - assert(a.at(0).second.isInteger() && (a.at(0).second.getIntValue() == 1));  
38 - assert(a.at(4).second.isName() && (a.at(4).second.getName() == "/BeforeQuack"));  
39 - assert(a.at(5).second.isName() && (a.at(5).second.getName() == "/Quack")); 37 + assert(a[0].isInteger() && (a[0].getIntValue() == 1));
  38 + assert(a[4].isName() && (a[4].getName() == "/BeforeQuack"));
  39 + assert(a[5].isName() && (a[5].getName() == "/Quack"));
40 40
41 a.insert(2, QPDFObjectHandle::parse("/Third")); 41 a.insert(2, QPDFObjectHandle::parse("/Third"));
42 assert(a.size() == 7); 42 assert(a.size() == 7);
43 - assert(a.at(1).second.isString() && (a.at(1).second.getStringValue() == "potato"));  
44 - assert(a.at(2).second.isName() && (a.at(2).second.getName() == "/Third"));  
45 - assert(a.at(3).second.isNull());  
46 - assert(a.at(6).second.isName() && (a.at(6).second.getName() == "/Quack")); 43 + assert(a[1].isString() && (a[1].getStringValue() == "potato"));
  44 + assert(a[2].isName() && (a[2].getName() == "/Third"));
  45 + assert(a[3].isNull());
  46 + assert(a[6].isName() && (a[6].getName() == "/Quack"));
47 47
48 a.insert(0, QPDFObjectHandle::parse("/First")); 48 a.insert(0, QPDFObjectHandle::parse("/First"));
49 assert(a.size() == 8); 49 assert(a.size() == 8);
50 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
51 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
52 - assert(a.at(7).second.isName() && (a.at(7).second.getName() == "/Quack")); 50 + assert(a[0].isName() && (a[0].getName() == "/First"));
  51 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  52 + assert(a[7].isName() && (a[7].getName() == "/Quack"));
53 53
54 a.erase(6); 54 a.erase(6);
55 assert(a.size() == 7); 55 assert(a.size() == 7);
56 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
57 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
58 - assert(a.at(5).second.isNull());  
59 - assert(a.at(6).second.isName() && (a.at(6).second.getName() == "/Quack")); 56 + assert(a[0].isName() && (a[0].getName() == "/First"));
  57 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  58 + assert(a[5].isNull());
  59 + assert(a[6].isName() && (a[6].getName() == "/Quack"));
60 60
61 a.erase(6); 61 a.erase(6);
62 assert(a.size() == 6); 62 assert(a.size() == 6);
63 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
64 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
65 - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third"));  
66 - assert(a.at(4).second.isNull());  
67 - assert(a.at(5).second.isNull()); 63 + assert(a[0].isName() && (a[0].getName() == "/First"));
  64 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  65 + assert(a[3].isName() && (a[3].getName() == "/Third"));
  66 + assert(a[4].isNull());
  67 + assert(a[5].isNull());
68 68
69 a.setAt(4, QPDFObjectHandle::parse("12")); 69 a.setAt(4, QPDFObjectHandle::parse("12"));
70 - assert(a.at(4).second.isInteger() && (a.at(4).second.getIntValue() == 12)); 70 + assert(a[4].isInteger() && (a[4].getIntValue() == 12));
71 a.setAt(4, QPDFObjectHandle::newNull()); 71 a.setAt(4, QPDFObjectHandle::newNull());
72 - assert(a.at(4).second.isNull()); 72 + assert(a[4].isNull());
73 73
74 a.erase(to_i(a.size()) - 1); 74 a.erase(to_i(a.size()) - 1);
75 assert(a.size() == 5); 75 assert(a.size() == 5);
76 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
77 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
78 - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third"));  
79 - assert(a.at(4).second.isNull()); 76 + assert(a[0].isName() && (a[0].getName() == "/First"));
  77 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  78 + assert(a[3].isName() && (a[3].getName() == "/Third"));
  79 + assert(a[4].isNull());
80 80
81 a.erase(to_i(a.size()) - 1); 81 a.erase(to_i(a.size()) - 1);
82 assert(a.size() == 4); 82 assert(a.size() == 4);
83 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
84 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
85 - assert(a.at(3).second.isName() && (a.at(3).second.getName() == "/Third")); 83 + assert(a[0].isName() && (a[0].getName() == "/First"));
  84 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  85 + assert(a[3].isName() && (a[3].getName() == "/Third"));
86 86
87 a.erase(to_i(a.size()) - 1); 87 a.erase(to_i(a.size()) - 1);
88 assert(a.size() == 3); 88 assert(a.size() == 3);
89 - assert(a.at(0).second.isName() && (a.at(0).second.getName() == "/First"));  
90 - assert(a.at(1).second.isInteger() && (a.at(1).second.getIntValue() == 1));  
91 - assert(a.at(2).second.isString() && (a.at(2).second.getStringValue() == "potato")); 89 + assert(a[0].isName() && (a[0].getName() == "/First"));
  90 + assert(a[1].isInteger() && (a[1].getIntValue() == 1));
  91 + assert(a[2].isString() && (a[2].getStringValue() == "potato"));
92 92
93 QPDF pdf; 93 QPDF pdf;
94 pdf.emptyPDF(); 94 pdf.emptyPDF();
@@ -98,15 +98,15 @@ main() @@ -98,15 +98,15 @@ main()
98 auto b = qpdf::Array(obj); 98 auto b = qpdf::Array(obj);
99 b.setAt(5, pdf.newIndirectNull()); 99 b.setAt(5, pdf.newIndirectNull());
100 b.setAt(7, "[0 1 2 3]"_qpdf); 100 b.setAt(7, "[0 1 2 3]"_qpdf);
101 - assert(b.at(3).second.isNull());  
102 - assert(b.at(8).second.isNull());  
103 - assert(b.at(5).second.isIndirect()); 101 + assert(b[3].null());
  102 + assert(b[8].null());
  103 + assert(b[5].indirect());
104 assert( 104 assert(
105 QPDFObjectHandle(obj).unparse() == 105 QPDFObjectHandle(obj).unparse() ==
106 "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]"); 106 "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");
107 auto c = QPDFObjectHandle(obj).unsafeShallowCopy(); 107 auto c = QPDFObjectHandle(obj).unsafeShallowCopy();
108 auto d = QPDFObjectHandle(obj).shallowCopy(); 108 auto d = QPDFObjectHandle(obj).shallowCopy();
109 - b.at(7).second.setArrayItem(2, "42"_qpdf); 109 + b.get(7).setArrayItem(2, "42"_qpdf);
110 assert(c.unparse() == "[ null null null null null 3 0 R null [ 0 1 42 3 ] null null ]"); 110 assert(c.unparse() == "[ null null null null null 3 0 R null [ 0 1 42 3 ] null null ]");
111 assert(d.unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]"); 111 assert(d.unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");
112 112