Commit dab919e576152fd6814a464a800186e21c61a2dc

Authored by m-holger
1 parent 00ad6f55

Move QPDFObject::copy to BaseHandle

include/qpdf/ObjectHandle.hh
... ... @@ -54,6 +54,7 @@ namespace qpdf
54 54  
55 55 // The rest of the header file is for qpdf internal use only.
56 56  
  57 + std::shared_ptr<QPDFObject> copy(bool shallow = false) const;
57 58 inline QPDFObjGen id_gen() const;
58 59 inline bool indirect() const;
59 60 inline bool null() const;
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -289,29 +289,29 @@ Name::normalize(std::string const&amp; name)
289 289 }
290 290  
291 291 std::shared_ptr<QPDFObject>
292   -QPDFObject::copy(bool shallow)
  292 +BaseHandle::copy(bool shallow) const
293 293 {
294   - switch (getResolvedTypeCode()) {
  294 + switch (type_code()) {
295 295 case ::ot_uninitialized:
296 296 throw std::logic_error("QPDFObjectHandle: attempting to copy an uninitialized object");
297 297 return {}; // does not return
298 298 case ::ot_reserved:
299   - return create<QPDF_Reserved>();
  299 + return QPDFObject::create<QPDF_Reserved>();
300 300 case ::ot_null:
301   - return create<QPDF_Null>();
  301 + return QPDFObject::create<QPDF_Null>();
302 302 case ::ot_boolean:
303   - return create<QPDF_Bool>(std::get<QPDF_Bool>(value).val);
  303 + return QPDFObject::create<QPDF_Bool>(std::get<QPDF_Bool>(obj->value).val);
304 304 case ::ot_integer:
305   - return create<QPDF_Integer>(std::get<QPDF_Integer>(value).val);
  305 + return QPDFObject::create<QPDF_Integer>(std::get<QPDF_Integer>(obj->value).val);
306 306 case ::ot_real:
307   - return create<QPDF_Real>(std::get<QPDF_Real>(value).val);
  307 + return QPDFObject::create<QPDF_Real>(std::get<QPDF_Real>(obj->value).val);
308 308 case ::ot_string:
309   - return create<QPDF_String>(std::get<QPDF_String>(value).val);
  309 + return QPDFObject::create<QPDF_String>(std::get<QPDF_String>(obj->value).val);
310 310 case ::ot_name:
311   - return create<QPDF_Name>(std::get<QPDF_Name>(value).name);
  311 + return QPDFObject::create<QPDF_Name>(std::get<QPDF_Name>(obj->value).name);
312 312 case ::ot_array:
313 313 {
314   - auto const& a = std::get<QPDF_Array>(value);
  314 + auto const& a = std::get<QPDF_Array>(obj->value);
315 315 if (shallow) {
316 316 return QPDFObject::create<QPDF_Array>(a);
317 317 } else {
... ... @@ -321,7 +321,7 @@ QPDFObject::copy(bool shallow)
321 321 result.sp = std::make_unique<QPDF_Array::Sparse>();
322 322 result.sp->size = a.sp->size;
323 323 for (auto const& [idx, oh]: a.sp->elements) {
324   - result.sp->elements[idx] = oh.indirect() ? oh : oh.getObj()->copy();
  324 + result.sp->elements[idx] = oh.indirect() ? oh : oh.copy();
325 325 }
326 326 return QPDFObject::create<QPDF_Array>(std::move(result));
327 327 } else {
... ... @@ -329,8 +329,7 @@ QPDFObject::copy(bool shallow)
329 329 result.reserve(a.elements.size());
330 330 for (auto const& element: a.elements) {
331 331 result.emplace_back(
332   - element ? (element.indirect() ? element : element.getObj()->copy())
333   - : element);
  332 + element ? (element.indirect() ? element : element.copy()) : element);
334 333 }
335 334 return QPDFObject::create<QPDF_Array>(std::move(result), false);
336 335 }
... ... @@ -338,13 +337,13 @@ QPDFObject::copy(bool shallow)
338 337 }
339 338 case ::ot_dictionary:
340 339 {
341   - auto const& d = std::get<QPDF_Dictionary>(value);
  340 + auto const& d = std::get<QPDF_Dictionary>(obj->value);
342 341 if (shallow) {
343 342 return QPDFObject::create<QPDF_Dictionary>(d.items);
344 343 } else {
345 344 std::map<std::string, QPDFObjectHandle> new_items;
346 345 for (auto const& [key, val]: d.items) {
347   - new_items[key] = val.indirect() ? val : val.getObj()->copy();
  346 + new_items[key] = val.indirect() ? val : val.copy();
348 347 }
349 348 return QPDFObject::create<QPDF_Dictionary>(new_items);
350 349 }
... ... @@ -354,9 +353,9 @@ QPDFObject::copy(bool shallow)
354 353 throw std::runtime_error("stream objects cannot be cloned");
355 354 return {}; // does not return
356 355 case ::ot_operator:
357   - return create<QPDF_Operator>(std::get<QPDF_Operator>(value).val);
  356 + return QPDFObject::create<QPDF_Operator>(std::get<QPDF_Operator>(obj->value).val);
358 357 case ::ot_inlineimage:
359   - return create<QPDF_InlineImage>(std::get<QPDF_InlineImage>(value).val);
  358 + return QPDFObject::create<QPDF_InlineImage>(std::get<QPDF_InlineImage>(obj->value).val);
360 359 case ::ot_unresolved:
361 360 throw std::logic_error("QPDFObjectHandle: attempting to unparse a reserved object");
362 361 return {}; // does not return
... ... @@ -364,7 +363,7 @@ QPDFObject::copy(bool shallow)
364 363 throw std::logic_error("attempted to shallow copy QPDFObjectHandle from destroyed QPDF");
365 364 return {}; // does not return
366 365 case ::ot_reference:
367   - return qpdf->getObject(og).getObj();
  366 + return obj->qpdf->getObject(obj->og).getObj();
368 367 }
369 368 return {}; // unreachable
370 369 }
... ... @@ -1902,7 +1901,7 @@ QPDFObjectHandle::shallowCopy()
1902 1901 if (!obj) {
1903 1902 throw std::logic_error("operation attempted on uninitialized QPDFObjectHandle");
1904 1903 }
1905   - return {obj->copy()};
  1904 + return {copy()};
1906 1905 }
1907 1906  
1908 1907 QPDFObjectHandle
... ... @@ -1911,7 +1910,7 @@ QPDFObjectHandle::unsafeShallowCopy()
1911 1910 if (!obj) {
1912 1911 throw std::logic_error("operation attempted on uninitialized QPDFObjectHandle");
1913 1912 }
1914   - return {obj->copy(true)};
  1913 + return {copy(true)};
1915 1914 }
1916 1915  
1917 1916 void
... ... @@ -1926,7 +1925,7 @@ QPDFObjectHandle::makeDirect(QPDFObjGen::set&amp; visited, bool stop_at_streams)
1926 1925 }
1927 1926  
1928 1927 if (isBool() || isInteger() || isName() || isNull() || isReal() || isString()) {
1929   - this->obj = obj->copy(true);
  1928 + this->obj = copy(true);
1930 1929 } else if (auto a = as_array(strict)) {
1931 1930 std::vector<QPDFObjectHandle> items;
1932 1931 for (auto const& item: a) {
... ...
libqpdf/qpdf/QPDFObject_private.hh
... ... @@ -50,7 +50,9 @@ class QPDF_Array final
50 50  
51 51 private:
52 52 friend class QPDFObject;
  53 + friend class qpdf::BaseHandle;
53 54 friend class qpdf::Array;
  55 +
54 56 QPDF_Array(std::vector<QPDFObjectHandle> const& items) :
55 57 elements(items)
56 58 {
... ... @@ -75,6 +77,7 @@ class QPDF_Array final
75 77 class QPDF_Bool final
76 78 {
77 79 friend class QPDFObject;
  80 + friend class qpdf::BaseHandle;
78 81 friend class QPDFObjectHandle;
79 82  
80 83 explicit QPDF_Bool(bool val) :
... ... @@ -92,6 +95,7 @@ class QPDF_Dictionary final
92 95 {
93 96 friend class QPDFObject;
94 97 friend class qpdf::BaseDictionary;
  98 + friend class qpdf::BaseHandle;
95 99  
96 100 QPDF_Dictionary(std::map<std::string, QPDFObjectHandle> const& items) :
97 101 items(items)
... ... @@ -105,6 +109,7 @@ class QPDF_Dictionary final
105 109 class QPDF_InlineImage final
106 110 {
107 111 friend class QPDFObject;
  112 + friend class qpdf::BaseHandle;
108 113  
109 114 explicit QPDF_InlineImage(std::string val) :
110 115 val(std::move(val))
... ... @@ -116,6 +121,7 @@ class QPDF_InlineImage final
116 121 class QPDF_Integer final
117 122 {
118 123 friend class QPDFObject;
  124 + friend class qpdf::BaseHandle;
119 125 friend class QPDFObjectHandle;
120 126  
121 127 QPDF_Integer(long long val) :
... ... @@ -128,6 +134,7 @@ class QPDF_Integer final
128 134 class QPDF_Name final
129 135 {
130 136 friend class QPDFObject;
  137 + friend class qpdf::BaseHandle;
131 138  
132 139 explicit QPDF_Name(std::string name) :
133 140 name(std::move(name))
... ... @@ -139,6 +146,7 @@ class QPDF_Name final
139 146 class QPDF_Null final
140 147 {
141 148 friend class QPDFObject;
  149 + friend class qpdf::BaseHandle;
142 150  
143 151 public:
144 152 static inline std::shared_ptr<QPDFObject> create(
... ... @@ -150,6 +158,7 @@ class QPDF_Null final
150 158 class QPDF_Operator final
151 159 {
152 160 friend class QPDFObject;
  161 + friend class qpdf::BaseHandle;
153 162  
154 163 QPDF_Operator(std::string val) :
155 164 val(std::move(val))
... ... @@ -162,6 +171,7 @@ class QPDF_Operator final
162 171 class QPDF_Real final
163 172 {
164 173 friend class QPDFObject;
  174 + friend class qpdf::BaseHandle;
165 175  
166 176 QPDF_Real(std::string val) :
167 177 val(std::move(val))
... ... @@ -235,6 +245,7 @@ class QPDF_Stream final
235 245 class QPDF_String final
236 246 {
237 247 friend class QPDFObject;
  248 + friend class qpdf::BaseHandle;
238 249 friend class QPDFWriter;
239 250  
240 251 public:
... ... @@ -284,7 +295,6 @@ class QPDFObject
284 295 qpdf, og, std::forward<T>(T(std::forward<Args>(args)...)));
285 296 }
286 297  
287   - std::shared_ptr<QPDFObject> copy(bool shallow = false);
288 298 std::string unparse();
289 299 void write_json(int json_version, JSON::Writer& p);
290 300 void disconnect();
... ...
libtests/sparse_array.cc
... ... @@ -96,11 +96,11 @@ main()
96 96 assert(b.at(8).second.isNull());
97 97 assert(b.at(5).second.isIndirect());
98 98 assert(obj->unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");
99   - auto c = obj->copy(true);
100   - auto d = obj->copy(false);
  99 + auto c = QPDFObjectHandle(obj).unsafeShallowCopy();
  100 + auto d = QPDFObjectHandle(obj).shallowCopy();
101 101 b.at(7).second.setArrayItem(2, "42"_qpdf);
102   - assert(c->unparse() == "[ null null null null null 3 0 R null [ 0 1 42 3 ] null null ]");
103   - assert(d->unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");
  102 + assert(c.unparse() == "[ null null null null null 3 0 R null [ 0 1 42 3 ] null null ]");
  103 + assert(d.unparse() == "[ null null null null null 3 0 R null [ 0 1 2 3 ] null null ]");
104 104  
105 105 try {
106 106 b.setAt(3, {});
... ...