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