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 | 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& 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& 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, {}); | ... | ... |