Commit dab919e576152fd6814a464a800186e21c61a2dc
1 parent
00ad6f55
Move QPDFObject::copy to BaseHandle
Showing
4 changed files
with
36 additions
and
26 deletions
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& name) | @@ -289,29 +289,29 @@ Name::normalize(std::string const& 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& visited, bool stop_at_streams) | @@ -1926,7 +1925,7 @@ QPDFObjectHandle::makeDirect(QPDFObjGen::set& 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, {}); |