Commit f0a8178091dfc87bbf9a6751f8fedf007e8eb144

Authored by m-holger
Committed by Jay Berkenbilt
1 parent 5aa8225f

Refactor QPDFObject creation and cloning

Move responsibility for creating shared pointers to objects and cloning from QPDFObjectHandle to QPDFObject.
include/qpdf/QPDFObject.hh
@@ -63,6 +63,7 @@ class QPDFObject @@ -63,6 +63,7 @@ class QPDFObject
63 static constexpr object_type_e ot_inlineimage = ::ot_inlineimage; 63 static constexpr object_type_e ot_inlineimage = ::ot_inlineimage;
64 64
65 virtual ~QPDFObject() = default; 65 virtual ~QPDFObject() = default;
  66 + virtual std::shared_ptr<QPDFObject> shallowCopy() = 0;
66 virtual std::string unparse() = 0; 67 virtual std::string unparse() = 0;
67 virtual JSON getJSON(int json_version) = 0; 68 virtual JSON getJSON(int json_version) = 0;
68 69
@@ -102,6 +103,7 @@ class QPDFObject @@ -102,6 +103,7 @@ class QPDFObject
102 releaseResolved() 103 releaseResolved()
103 { 104 {
104 } 105 }
  106 + static std::shared_ptr<QPDFObject> do_create(QPDFObject*);
105 107
106 private: 108 private:
107 QPDFObject(QPDFObject const&) = delete; 109 QPDFObject(QPDFObject const&) = delete;
include/qpdf/QPDFObjectHandle.hh
@@ -1551,7 +1551,7 @@ class QPDFObjectHandle @@ -1551,7 +1551,7 @@ class QPDFObjectHandle
1551 1551
1552 private: 1552 private:
1553 QPDFObjectHandle(QPDF*, int objid, int generation); 1553 QPDFObjectHandle(QPDF*, int objid, int generation);
1554 - QPDFObjectHandle(QPDFObject*); 1554 + QPDFObjectHandle(std::shared_ptr<QPDFObject> const&);
1555 1555
1556 enum parser_state_e { 1556 enum parser_state_e {
1557 st_top, 1557 st_top,
libqpdf/QPDF.cc
@@ -1989,7 +1989,7 @@ QPDF::resolve(int objid, int generation) @@ -1989,7 +1989,7 @@ QPDF::resolve(int objid, int generation)
1989 this->m->file->getLastOffset(), 1989 this->m->file->getLastOffset(),
1990 ("loop detected resolving object " + QUtil::int_to_string(objid) + 1990 ("loop detected resolving object " + QUtil::int_to_string(objid) +
1991 " " + QUtil::int_to_string(generation))); 1991 " " + QUtil::int_to_string(generation)));
1992 - return std::shared_ptr<QPDFObject>(new QPDF_Null); 1992 + return QPDF_Null::create();
1993 } 1993 }
1994 ResolveRecorder rr(this, og); 1994 ResolveRecorder rr(this, og);
1995 1995
libqpdf/QPDFObject.cc
@@ -6,6 +6,13 @@ QPDFObject::QPDFObject() : @@ -6,6 +6,13 @@ QPDFObject::QPDFObject() :
6 { 6 {
7 } 7 }
8 8
  9 +std::shared_ptr<QPDFObject>
  10 +QPDFObject::do_create(QPDFObject* object)
  11 +{
  12 + std::shared_ptr<QPDFObject> obj(object);
  13 + return obj;
  14 +}
  15 +
9 void 16 void
10 QPDFObject::setDescription(QPDF* qpdf, std::string const& description) 17 QPDFObject::setDescription(QPDF* qpdf, std::string const& description)
11 { 18 {
libqpdf/QPDFObjectHandle.cc
@@ -235,7 +235,7 @@ QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) : @@ -235,7 +235,7 @@ QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, int objid, int generation) :
235 { 235 {
236 } 236 }
237 237
238 -QPDFObjectHandle::QPDFObjectHandle(QPDFObject* data) : 238 +QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr<QPDFObject> const& data) :
239 initialized(true), 239 initialized(true),
240 qpdf(0), 240 qpdf(0),
241 objid(0), 241 objid(0),
@@ -2335,7 +2335,7 @@ QPDFObjectHandle::parseInternal( @@ -2335,7 +2335,7 @@ QPDFObjectHandle::parseInternal(
2335 if (old_state == st_array) { 2335 if (old_state == st_array) {
2336 // There's no newArray(SparseOHArray) since 2336 // There's no newArray(SparseOHArray) since
2337 // SparseOHArray is not part of the public API. 2337 // SparseOHArray is not part of the public API.
2338 - object = QPDFObjectHandle(new QPDF_Array(olist)); 2338 + object = QPDFObjectHandle(QPDF_Array::create(olist));
2339 setObjectDescriptionFromInput( 2339 setObjectDescriptionFromInput(
2340 object, context, object_description, input, offset); 2340 object, context, object_description, input, offset);
2341 // The `offset` points to the next of "[". Set the 2341 // The `offset` points to the next of "[". Set the
@@ -2499,25 +2499,25 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation) @@ -2499,25 +2499,25 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, int objid, int generation)
2499 QPDFObjectHandle 2499 QPDFObjectHandle
2500 QPDFObjectHandle::newBool(bool value) 2500 QPDFObjectHandle::newBool(bool value)
2501 { 2501 {
2502 - return QPDFObjectHandle(new QPDF_Bool(value)); 2502 + return QPDFObjectHandle(QPDF_Bool::create(value));
2503 } 2503 }
2504 2504
2505 QPDFObjectHandle 2505 QPDFObjectHandle
2506 QPDFObjectHandle::newNull() 2506 QPDFObjectHandle::newNull()
2507 { 2507 {
2508 - return QPDFObjectHandle(new QPDF_Null()); 2508 + return QPDFObjectHandle(QPDF_Null::create());
2509 } 2509 }
2510 2510
2511 QPDFObjectHandle 2511 QPDFObjectHandle
2512 QPDFObjectHandle::newInteger(long long value) 2512 QPDFObjectHandle::newInteger(long long value)
2513 { 2513 {
2514 - return QPDFObjectHandle(new QPDF_Integer(value)); 2514 + return QPDFObjectHandle(QPDF_Integer::create(value));
2515 } 2515 }
2516 2516
2517 QPDFObjectHandle 2517 QPDFObjectHandle
2518 QPDFObjectHandle::newReal(std::string const& value) 2518 QPDFObjectHandle::newReal(std::string const& value)
2519 { 2519 {
2520 - return QPDFObjectHandle(new QPDF_Real(value)); 2520 + return QPDFObjectHandle(QPDF_Real::create(value));
2521 } 2521 }
2522 2522
2523 QPDFObjectHandle 2523 QPDFObjectHandle
@@ -2525,37 +2525,37 @@ QPDFObjectHandle::newReal( @@ -2525,37 +2525,37 @@ QPDFObjectHandle::newReal(
2525 double value, int decimal_places, bool trim_trailing_zeroes) 2525 double value, int decimal_places, bool trim_trailing_zeroes)
2526 { 2526 {
2527 return QPDFObjectHandle( 2527 return QPDFObjectHandle(
2528 - new QPDF_Real(value, decimal_places, trim_trailing_zeroes)); 2528 + QPDF_Real::create(value, decimal_places, trim_trailing_zeroes));
2529 } 2529 }
2530 2530
2531 QPDFObjectHandle 2531 QPDFObjectHandle
2532 QPDFObjectHandle::newName(std::string const& name) 2532 QPDFObjectHandle::newName(std::string const& name)
2533 { 2533 {
2534 - return QPDFObjectHandle(new QPDF_Name(name)); 2534 + return QPDFObjectHandle(QPDF_Name::create(name));
2535 } 2535 }
2536 2536
2537 QPDFObjectHandle 2537 QPDFObjectHandle
2538 QPDFObjectHandle::newString(std::string const& str) 2538 QPDFObjectHandle::newString(std::string const& str)
2539 { 2539 {
2540 - return QPDFObjectHandle(new QPDF_String(str)); 2540 + return QPDFObjectHandle(QPDF_String::create(str));
2541 } 2541 }
2542 2542
2543 QPDFObjectHandle 2543 QPDFObjectHandle
2544 QPDFObjectHandle::newUnicodeString(std::string const& utf8_str) 2544 QPDFObjectHandle::newUnicodeString(std::string const& utf8_str)
2545 { 2545 {
2546 - return QPDFObjectHandle(QPDF_String::new_utf16(utf8_str)); 2546 + return QPDFObjectHandle(QPDF_String::create_utf16(utf8_str));
2547 } 2547 }
2548 2548
2549 QPDFObjectHandle 2549 QPDFObjectHandle
2550 QPDFObjectHandle::newOperator(std::string const& value) 2550 QPDFObjectHandle::newOperator(std::string const& value)
2551 { 2551 {
2552 - return QPDFObjectHandle(new QPDF_Operator(value)); 2552 + return QPDFObjectHandle(QPDF_Operator::create(value));
2553 } 2553 }
2554 2554
2555 QPDFObjectHandle 2555 QPDFObjectHandle
2556 QPDFObjectHandle::newInlineImage(std::string const& value) 2556 QPDFObjectHandle::newInlineImage(std::string const& value)
2557 { 2557 {
2558 - return QPDFObjectHandle(new QPDF_InlineImage(value)); 2558 + return QPDFObjectHandle(QPDF_InlineImage::create(value));
2559 } 2559 }
2560 2560
2561 QPDFObjectHandle 2561 QPDFObjectHandle
@@ -2567,7 +2567,7 @@ QPDFObjectHandle::newArray() @@ -2567,7 +2567,7 @@ QPDFObjectHandle::newArray()
2567 QPDFObjectHandle 2567 QPDFObjectHandle
2568 QPDFObjectHandle::newArray(std::vector<QPDFObjectHandle> const& items) 2568 QPDFObjectHandle::newArray(std::vector<QPDFObjectHandle> const& items)
2569 { 2569 {
2570 - return QPDFObjectHandle(new QPDF_Array(items)); 2570 + return QPDFObjectHandle(QPDF_Array::create(items));
2571 } 2571 }
2572 2572
2573 QPDFObjectHandle 2573 QPDFObjectHandle
@@ -2635,7 +2635,7 @@ QPDFObjectHandle @@ -2635,7 +2635,7 @@ QPDFObjectHandle
2635 QPDFObjectHandle::newDictionary( 2635 QPDFObjectHandle::newDictionary(
2636 std::map<std::string, QPDFObjectHandle> const& items) 2636 std::map<std::string, QPDFObjectHandle> const& items)
2637 { 2637 {
2638 - return QPDFObjectHandle(new QPDF_Dictionary(items)); 2638 + return QPDFObjectHandle(QPDF_Dictionary::create(items));
2639 } 2639 }
2640 2640
2641 QPDFObjectHandle 2641 QPDFObjectHandle
@@ -2647,8 +2647,8 @@ QPDFObjectHandle::newStream( @@ -2647,8 +2647,8 @@ QPDFObjectHandle::newStream(
2647 qpdf_offset_t offset, 2647 qpdf_offset_t offset,
2648 size_t length) 2648 size_t length)
2649 { 2649 {
2650 - QPDFObjectHandle result = QPDFObjectHandle(  
2651 - new QPDF_Stream(qpdf, objid, generation, stream_dict, offset, length)); 2650 + QPDFObjectHandle result = QPDFObjectHandle(QPDF_Stream::create(
  2651 + qpdf, objid, generation, stream_dict, offset, length));
2652 if (offset) { 2652 if (offset) {
2653 result.setParsedOffset(offset); 2653 result.setParsedOffset(offset);
2654 } 2654 }
@@ -2665,8 +2665,7 @@ QPDFObjectHandle::newStream(QPDF* qpdf) @@ -2665,8 +2665,7 @@ QPDFObjectHandle::newStream(QPDF* qpdf)
2665 QTC::TC("qpdf", "QPDFObjectHandle newStream"); 2665 QTC::TC("qpdf", "QPDFObjectHandle newStream");
2666 QPDFObjectHandle stream_dict = newDictionary(); 2666 QPDFObjectHandle stream_dict = newDictionary();
2667 QPDFObjectHandle result = qpdf->makeIndirectObject( 2667 QPDFObjectHandle result = qpdf->makeIndirectObject(
2668 - QPDFObjectHandle(new QPDF_Stream(qpdf, 0, 0, stream_dict, 0, 0)));  
2669 - // Indirect objects are guaranteed to be initialized 2668 + QPDFObjectHandle(QPDF_Stream::create(qpdf, 0, 0, stream_dict, 0, 0)));
2670 result.dereference(); 2669 result.dereference();
2671 QPDF_Stream* stream = dynamic_cast<QPDF_Stream*>(result.obj.get()); 2670 QPDF_Stream* stream = dynamic_cast<QPDF_Stream*>(result.obj.get());
2672 stream->setObjGen(result.getObjectID(), result.getGeneration()); 2671 stream->setObjGen(result.getObjectID(), result.getGeneration());
@@ -2706,7 +2705,7 @@ QPDFObjectHandle::newReserved(QPDF* qpdf) @@ -2706,7 +2705,7 @@ QPDFObjectHandle::newReserved(QPDF* qpdf)
2706 QPDFObjectHandle 2705 QPDFObjectHandle
2707 QPDFObjectHandle::makeReserved() 2706 QPDFObjectHandle::makeReserved()
2708 { 2707 {
2709 - return QPDFObjectHandle(new QPDF_Reserved()); 2708 + return QPDFObjectHandle(QPDF_Reserved::create());
2710 } 2709 }
2711 2710
2712 void 2711 void
@@ -2753,17 +2752,9 @@ QPDFObjectHandle::shallowCopyInternal( @@ -2753,17 +2752,9 @@ QPDFObjectHandle::shallowCopyInternal(
2753 throw std::runtime_error("attempt to make a shallow copy of a stream"); 2752 throw std::runtime_error("attempt to make a shallow copy of a stream");
2754 } 2753 }
2755 2754
2756 - if (isArray()) {  
2757 - QTC::TC("qpdf", "QPDFObjectHandle shallow copy array");  
2758 - // No newArray for shallow copying the sparse array  
2759 - QPDF_Array* arr = dynamic_cast<QPDF_Array*>(obj.get());  
2760 - new_obj =  
2761 - QPDFObjectHandle(new QPDF_Array(arr->getElementsForShallowCopy()));  
2762 - } else if (isDictionary()) {  
2763 - QTC::TC("qpdf", "QPDFObjectHandle shallow copy dictionary");  
2764 - new_obj = newDictionary(getDictAsMap()); 2755 + if (isArray() || isDictionary()) {
  2756 + new_obj = QPDFObjectHandle(obj->shallowCopy());
2765 } else { 2757 } else {
2766 - QTC::TC("qpdf", "QPDFObjectHandle shallow copy scalar");  
2767 new_obj = *this; 2758 new_obj = *this;
2768 } 2759 }
2769 2760
@@ -2812,27 +2803,14 @@ QPDFObjectHandle::copyObject( @@ -2812,27 +2803,14 @@ QPDFObjectHandle::copyObject(
2812 2803
2813 std::shared_ptr<QPDFObject> new_obj; 2804 std::shared_ptr<QPDFObject> new_obj;
2814 2805
2815 - if (isBool()) {  
2816 - QTC::TC("qpdf", "QPDFObjectHandle clone bool");  
2817 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Bool(getBoolValue()));  
2818 - } else if (isNull()) {  
2819 - QTC::TC("qpdf", "QPDFObjectHandle clone null");  
2820 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Null());  
2821 - } else if (isInteger()) {  
2822 - QTC::TC("qpdf", "QPDFObjectHandle clone integer");  
2823 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Integer(getIntValue()));  
2824 - } else if (isReal()) {  
2825 - QTC::TC("qpdf", "QPDFObjectHandle clone real");  
2826 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Real(getRealValue()));  
2827 - } else if (isName()) {  
2828 - QTC::TC("qpdf", "QPDFObjectHandle clone name");  
2829 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Name(getName()));  
2830 - } else if (isString()) {  
2831 - QTC::TC("qpdf", "QPDFObjectHandle clone string");  
2832 - new_obj =  
2833 - std::shared_ptr<QPDFObject>(new QPDF_String(getStringValue())); 2806 + if (isBool() ||
  2807 + isInteger() ||
  2808 + isName() ||
  2809 + isNull() ||
  2810 + isReal() ||
  2811 + isString()) {
  2812 + new_obj = obj->shallowCopy();
2834 } else if (isArray()) { 2813 } else if (isArray()) {
2835 - QTC::TC("qpdf", "QPDFObjectHandle clone array");  
2836 std::vector<QPDFObjectHandle> items; 2814 std::vector<QPDFObjectHandle> items;
2837 int n = getArrayNItems(); 2815 int n = getArrayNItems();
2838 for (int i = 0; i < n; ++i) { 2816 for (int i = 0; i < n; ++i) {
@@ -2843,9 +2821,8 @@ QPDFObjectHandle::copyObject( @@ -2843,9 +2821,8 @@ QPDFObjectHandle::copyObject(
2843 visited, cross_indirect, first_level_only, stop_at_streams); 2821 visited, cross_indirect, first_level_only, stop_at_streams);
2844 } 2822 }
2845 } 2823 }
2846 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Array(items)); 2824 + new_obj = QPDF_Array::create(items);
2847 } else if (isDictionary()) { 2825 } else if (isDictionary()) {
2848 - QTC::TC("qpdf", "QPDFObjectHandle clone dictionary");  
2849 std::map<std::string, QPDFObjectHandle> items; 2826 std::map<std::string, QPDFObjectHandle> items;
2850 for (auto const& key: getKeys()) { 2827 for (auto const& key: getKeys()) {
2851 items[key] = getKey(key); 2828 items[key] = getKey(key);
@@ -2855,7 +2832,7 @@ QPDFObjectHandle::copyObject( @@ -2855,7 +2832,7 @@ QPDFObjectHandle::copyObject(
2855 visited, cross_indirect, first_level_only, stop_at_streams); 2832 visited, cross_indirect, first_level_only, stop_at_streams);
2856 } 2833 }
2857 } 2834 }
2858 - new_obj = std::shared_ptr<QPDFObject>(new QPDF_Dictionary(items)); 2835 + new_obj = QPDF_Dictionary::create(items);
2859 } else { 2836 } else {
2860 throw std::logic_error("QPDFObjectHandle::makeDirectInternal: " 2837 throw std::logic_error("QPDFObjectHandle::makeDirectInternal: "
2861 "unknown object type"); 2838 "unknown object type");
@@ -3144,7 +3121,7 @@ QPDFObjectHandle::dereference() @@ -3144,7 +3121,7 @@ QPDFObjectHandle::dereference()
3144 if (obj.get() == 0) { 3121 if (obj.get() == 0) {
3145 // QPDF::resolve never returns an uninitialized object, but 3122 // QPDF::resolve never returns an uninitialized object, but
3146 // check just in case. 3123 // check just in case.
3147 - this->obj = std::shared_ptr<QPDFObject>(new QPDF_Null()); 3124 + this->obj = QPDF_Null::create();
3148 } else if (dynamic_cast<QPDF_Reserved*>(obj.get())) { 3125 } else if (dynamic_cast<QPDF_Reserved*>(obj.get())) {
3149 // Do not resolve 3126 // Do not resolve
3150 this->reserved = true; 3127 this->reserved = true;
libqpdf/QPDF_Array.cc
@@ -14,6 +14,24 @@ QPDF_Array::QPDF_Array(SparseOHArray const&amp; items) : @@ -14,6 +14,24 @@ QPDF_Array::QPDF_Array(SparseOHArray const&amp; items) :
14 { 14 {
15 } 15 }
16 16
  17 +std::shared_ptr<QPDFObject>
  18 +QPDF_Array::create(std::vector<QPDFObjectHandle> const& items)
  19 +{
  20 + return do_create(new QPDF_Array(items));
  21 +}
  22 +
  23 +std::shared_ptr<QPDFObject>
  24 +QPDF_Array::create(SparseOHArray const& items)
  25 +{
  26 + return do_create(new QPDF_Array(items));
  27 +}
  28 +
  29 +std::shared_ptr<QPDFObject>
  30 +QPDF_Array::shallowCopy()
  31 +{
  32 + return create(elements);
  33 +}
  34 +
17 void 35 void
18 QPDF_Array::releaseResolved() 36 QPDF_Array::releaseResolved()
19 { 37 {
@@ -121,12 +139,6 @@ QPDF_Array::eraseItem(int at) @@ -121,12 +139,6 @@ QPDF_Array::eraseItem(int at)
121 this->elements.erase(QIntC::to_size(at)); 139 this->elements.erase(QIntC::to_size(at));
122 } 140 }
123 141
124 -SparseOHArray const&  
125 -QPDF_Array::getElementsForShallowCopy() const  
126 -{  
127 - return this->elements;  
128 -}  
129 -  
130 void 142 void
131 QPDF_Array::addExplicitElementsToList(std::list<QPDFObjectHandle>& l) const 143 QPDF_Array::addExplicitElementsToList(std::list<QPDFObjectHandle>& l) const
132 { 144 {
libqpdf/QPDF_Bool.cc
@@ -5,6 +5,18 @@ QPDF_Bool::QPDF_Bool(bool val) : @@ -5,6 +5,18 @@ QPDF_Bool::QPDF_Bool(bool val) :
5 { 5 {
6 } 6 }
7 7
  8 +std::shared_ptr<QPDFObject>
  9 +QPDF_Bool::create(bool value)
  10 +{
  11 + return do_create(new QPDF_Bool(value));
  12 +}
  13 +
  14 +std::shared_ptr<QPDFObject>
  15 +QPDF_Bool::shallowCopy()
  16 +{
  17 + return create(val);
  18 +}
  19 +
8 std::string 20 std::string
9 QPDF_Bool::unparse() 21 QPDF_Bool::unparse()
10 { 22 {
libqpdf/QPDF_Dictionary.cc
@@ -9,6 +9,18 @@ QPDF_Dictionary::QPDF_Dictionary( @@ -9,6 +9,18 @@ QPDF_Dictionary::QPDF_Dictionary(
9 { 9 {
10 } 10 }
11 11
  12 +std::shared_ptr<QPDFObject>
  13 +QPDF_Dictionary::create(std::map<std::string, QPDFObjectHandle> const& items)
  14 +{
  15 + return do_create(new QPDF_Dictionary(items));
  16 +}
  17 +
  18 +std::shared_ptr<QPDFObject>
  19 +QPDF_Dictionary::shallowCopy()
  20 +{
  21 + return create(items);
  22 +}
  23 +
12 void 24 void
13 QPDF_Dictionary::releaseResolved() 25 QPDF_Dictionary::releaseResolved()
14 { 26 {
libqpdf/QPDF_InlineImage.cc
1 #include <qpdf/QPDF_InlineImage.hh> 1 #include <qpdf/QPDF_InlineImage.hh>
2 2
3 -#include <qpdf/QUtil.hh>  
4 -  
5 QPDF_InlineImage::QPDF_InlineImage(std::string const& val) : 3 QPDF_InlineImage::QPDF_InlineImage(std::string const& val) :
6 val(val) 4 val(val)
7 { 5 {
8 } 6 }
9 7
  8 +std::shared_ptr<QPDFObject>
  9 +QPDF_InlineImage::create(std::string const& val)
  10 +{
  11 + return do_create(new QPDF_InlineImage(val));
  12 +}
  13 +
  14 +std::shared_ptr<QPDFObject>
  15 +QPDF_InlineImage::shallowCopy()
  16 +{
  17 + return create(val);
  18 +}
  19 +
10 std::string 20 std::string
11 QPDF_InlineImage::unparse() 21 QPDF_InlineImage::unparse()
12 { 22 {
libqpdf/QPDF_Integer.cc
@@ -7,6 +7,18 @@ QPDF_Integer::QPDF_Integer(long long val) : @@ -7,6 +7,18 @@ QPDF_Integer::QPDF_Integer(long long val) :
7 { 7 {
8 } 8 }
9 9
  10 +std::shared_ptr<QPDFObject>
  11 +QPDF_Integer::create(long long value)
  12 +{
  13 + return do_create(new QPDF_Integer(value));
  14 +}
  15 +
  16 +std::shared_ptr<QPDFObject>
  17 +QPDF_Integer::shallowCopy()
  18 +{
  19 + return create(val);
  20 +}
  21 +
10 std::string 22 std::string
11 QPDF_Integer::unparse() 23 QPDF_Integer::unparse()
12 { 24 {
libqpdf/QPDF_Name.cc
@@ -9,6 +9,18 @@ QPDF_Name::QPDF_Name(std::string const&amp; name) : @@ -9,6 +9,18 @@ QPDF_Name::QPDF_Name(std::string const&amp; name) :
9 { 9 {
10 } 10 }
11 11
  12 +std::shared_ptr<QPDFObject>
  13 +QPDF_Name::create(std::string const& name)
  14 +{
  15 + return do_create(new QPDF_Name(name));
  16 +}
  17 +
  18 +std::shared_ptr<QPDFObject>
  19 +QPDF_Name::shallowCopy()
  20 +{
  21 + return create(name);
  22 +}
  23 +
12 std::string 24 std::string
13 QPDF_Name::normalizeName(std::string const& name) 25 QPDF_Name::normalizeName(std::string const& name)
14 { 26 {
libqpdf/QPDF_Null.cc
1 #include <qpdf/QPDF_Null.hh> 1 #include <qpdf/QPDF_Null.hh>
2 2
  3 +std::shared_ptr<QPDFObject>
  4 +QPDF_Null::create()
  5 +{
  6 + return do_create(new QPDF_Null());
  7 +}
  8 +
  9 +std::shared_ptr<QPDFObject>
  10 +QPDF_Null::shallowCopy()
  11 +{
  12 + return create();
  13 +}
  14 +
3 std::string 15 std::string
4 QPDF_Null::unparse() 16 QPDF_Null::unparse()
5 { 17 {
libqpdf/QPDF_Operator.cc
1 #include <qpdf/QPDF_Operator.hh> 1 #include <qpdf/QPDF_Operator.hh>
2 2
3 -#include <qpdf/QUtil.hh>  
4 -  
5 QPDF_Operator::QPDF_Operator(std::string const& val) : 3 QPDF_Operator::QPDF_Operator(std::string const& val) :
6 val(val) 4 val(val)
7 { 5 {
8 } 6 }
9 7
  8 +std::shared_ptr<QPDFObject>
  9 +QPDF_Operator::create(std::string const& val)
  10 +{
  11 + return do_create(new QPDF_Operator(val));
  12 +}
  13 +
  14 +std::shared_ptr<QPDFObject>
  15 +QPDF_Operator::shallowCopy()
  16 +{
  17 + return create(val);
  18 +}
  19 +
10 std::string 20 std::string
11 QPDF_Operator::unparse() 21 QPDF_Operator::unparse()
12 { 22 {
libqpdf/QPDF_Real.cc
@@ -13,6 +13,25 @@ QPDF_Real::QPDF_Real( @@ -13,6 +13,25 @@ QPDF_Real::QPDF_Real(
13 { 13 {
14 } 14 }
15 15
  16 +std::shared_ptr<QPDFObject>
  17 +QPDF_Real::create(std::string const& val)
  18 +{
  19 + return do_create(new QPDF_Real(val));
  20 +}
  21 +
  22 +std::shared_ptr<QPDFObject>
  23 +QPDF_Real::create(double value, int decimal_places, bool trim_trailing_zeroes)
  24 +{
  25 + return do_create(
  26 + new QPDF_Real(value, decimal_places, trim_trailing_zeroes));
  27 +}
  28 +
  29 +std::shared_ptr<QPDFObject>
  30 +QPDF_Real::shallowCopy()
  31 +{
  32 + return create(val);
  33 +}
  34 +
16 std::string 35 std::string
17 QPDF_Real::unparse() 36 QPDF_Real::unparse()
18 { 37 {
libqpdf/QPDF_Reserved.cc
@@ -2,6 +2,18 @@ @@ -2,6 +2,18 @@
2 2
3 #include <stdexcept> 3 #include <stdexcept>
4 4
  5 +std::shared_ptr<QPDFObject>
  6 +QPDF_Reserved::create()
  7 +{
  8 + return do_create(new QPDF_Reserved());
  9 +}
  10 +
  11 +std::shared_ptr<QPDFObject>
  12 +QPDF_Reserved::shallowCopy()
  13 +{
  14 + return create();
  15 +}
  16 +
5 std::string 17 std::string
6 QPDF_Reserved::unparse() 18 QPDF_Reserved::unparse()
7 { 19 {
libqpdf/QPDF_Stream.cc
@@ -134,6 +134,25 @@ QPDF_Stream::QPDF_Stream( @@ -134,6 +134,25 @@ QPDF_Stream::QPDF_Stream(
134 QUtil::int_to_string(this->generation)); 134 QUtil::int_to_string(this->generation));
135 } 135 }
136 136
  137 +std::shared_ptr<QPDFObject>
  138 +QPDF_Stream::create(
  139 + QPDF* qpdf,
  140 + int objid,
  141 + int generation,
  142 + QPDFObjectHandle stream_dict,
  143 + qpdf_offset_t offset,
  144 + size_t length)
  145 +{
  146 + return do_create(
  147 + new QPDF_Stream(qpdf, objid, generation, stream_dict, offset,length));
  148 +}
  149 +
  150 +std::shared_ptr<QPDFObject>
  151 +QPDF_Stream::shallowCopy()
  152 +{
  153 + throw std::logic_error("stream objects cannot be cloned");
  154 +}
  155 +
137 void 156 void
138 QPDF_Stream::registerStreamFilter( 157 QPDF_Stream::registerStreamFilter(
139 std::string const& filter_name, 158 std::string const& filter_name,
libqpdf/QPDF_String.cc
1 #include <qpdf/QPDF_String.hh> 1 #include <qpdf/QPDF_String.hh>
2 2
3 -#include <qpdf/QTC.hh>  
4 #include <qpdf/QUtil.hh> 3 #include <qpdf/QUtil.hh>
5 4
6 // DO NOT USE ctype -- it is locale dependent for some things, and 5 // DO NOT USE ctype -- it is locale dependent for some things, and
@@ -26,14 +25,26 @@ QPDF_String::QPDF_String(std::string const&amp; val) : @@ -26,14 +25,26 @@ QPDF_String::QPDF_String(std::string const&amp; val) :
26 { 25 {
27 } 26 }
28 27
29 -QPDF_String*  
30 -QPDF_String::new_utf16(std::string const& utf8_val) 28 +std::shared_ptr<QPDFObject>
  29 +QPDF_String::create(std::string const& val)
  30 +{
  31 + return do_create(new QPDF_String(val));
  32 +}
  33 +
  34 +std::shared_ptr<QPDFObject>
  35 +QPDF_String::create_utf16(std::string const& utf8_val)
31 { 36 {
32 std::string result; 37 std::string result;
33 if (!QUtil::utf8_to_pdf_doc(utf8_val, result, '?')) { 38 if (!QUtil::utf8_to_pdf_doc(utf8_val, result, '?')) {
34 result = QUtil::utf8_to_utf16(utf8_val); 39 result = QUtil::utf8_to_utf16(utf8_val);
35 } 40 }
36 - return new QPDF_String(result); 41 + return do_create(new QPDF_String(result));
  42 +}
  43 +
  44 +std::shared_ptr<QPDFObject>
  45 +QPDF_String::shallowCopy()
  46 +{
  47 + return create(val);
37 } 48 }
38 49
39 std::string 50 std::string
libqpdf/qpdf/QPDF_Array.hh
@@ -10,9 +10,10 @@ @@ -10,9 +10,10 @@
10 class QPDF_Array: public QPDFObject 10 class QPDF_Array: public QPDFObject
11 { 11 {
12 public: 12 public:
13 - QPDF_Array(std::vector<QPDFObjectHandle> const& items);  
14 - QPDF_Array(SparseOHArray const& items);  
15 virtual ~QPDF_Array() = default; 13 virtual ~QPDF_Array() = default;
  14 + static std::shared_ptr<QPDFObject> create(std::vector<QPDFObjectHandle> const& items);
  15 + static std::shared_ptr<QPDFObject> create(SparseOHArray const& items);
  16 + virtual std::shared_ptr<QPDFObject> shallowCopy();
16 virtual std::string unparse(); 17 virtual std::string unparse();
17 virtual JSON getJSON(int json_version); 18 virtual JSON getJSON(int json_version);
18 virtual QPDFObject::object_type_e getTypeCode() const; 19 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -31,13 +32,14 @@ class QPDF_Array: public QPDFObject @@ -31,13 +32,14 @@ class QPDF_Array: public QPDFObject
31 // Helper methods for QPDF and QPDFObjectHandle -- these are 32 // Helper methods for QPDF and QPDFObjectHandle -- these are
32 // public methods since the whole class is not part of the public 33 // public methods since the whole class is not part of the public
33 // API. Otherwise, these would be wrapped in accessor classes. 34 // API. Otherwise, these would be wrapped in accessor classes.
34 - SparseOHArray const& getElementsForShallowCopy() const;  
35 void addExplicitElementsToList(std::list<QPDFObjectHandle>&) const; 35 void addExplicitElementsToList(std::list<QPDFObjectHandle>&) const;
36 36
37 protected: 37 protected:
38 virtual void releaseResolved(); 38 virtual void releaseResolved();
39 39
40 private: 40 private:
  41 + QPDF_Array(std::vector<QPDFObjectHandle> const& items);
  42 + QPDF_Array(SparseOHArray const& items);
41 SparseOHArray elements; 43 SparseOHArray elements;
42 }; 44 };
43 45
libqpdf/qpdf/QPDF_Bool.hh
@@ -6,8 +6,9 @@ @@ -6,8 +6,9 @@
6 class QPDF_Bool: public QPDFObject 6 class QPDF_Bool: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_Bool(bool val);  
10 virtual ~QPDF_Bool() = default; 9 virtual ~QPDF_Bool() = default;
  10 + static std::shared_ptr<QPDFObject> create(bool val);
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
11 virtual std::string unparse(); 12 virtual std::string unparse();
12 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
13 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -15,6 +16,7 @@ class QPDF_Bool: public QPDFObject @@ -15,6 +16,7 @@ class QPDF_Bool: public QPDFObject
15 bool getVal() const; 16 bool getVal() const;
16 17
17 private: 18 private:
  19 + QPDF_Bool(bool val);
18 bool val; 20 bool val;
19 }; 21 };
20 22
libqpdf/qpdf/QPDF_Dictionary.hh
@@ -11,8 +11,9 @@ @@ -11,8 +11,9 @@
11 class QPDF_Dictionary: public QPDFObject 11 class QPDF_Dictionary: public QPDFObject
12 { 12 {
13 public: 13 public:
14 - QPDF_Dictionary(std::map<std::string, QPDFObjectHandle> const& items);  
15 virtual ~QPDF_Dictionary() = default; 14 virtual ~QPDF_Dictionary() = default;
  15 + static std::shared_ptr<QPDFObject> create(std::map<std::string, QPDFObjectHandle> const& items);
  16 + virtual std::shared_ptr<QPDFObject> shallowCopy();
16 virtual std::string unparse(); 17 virtual std::string unparse();
17 virtual JSON getJSON(int json_version); 18 virtual JSON getJSON(int json_version);
18 virtual QPDFObject::object_type_e getTypeCode() const; 19 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -36,6 +37,7 @@ class QPDF_Dictionary: public QPDFObject @@ -36,6 +37,7 @@ class QPDF_Dictionary: public QPDFObject
36 virtual void releaseResolved(); 37 virtual void releaseResolved();
37 38
38 private: 39 private:
  40 + QPDF_Dictionary(std::map<std::string, QPDFObjectHandle> const& items);
39 std::map<std::string, QPDFObjectHandle> items; 41 std::map<std::string, QPDFObjectHandle> items;
40 }; 42 };
41 43
libqpdf/qpdf/QPDF_InlineImage.hh
@@ -6,8 +6,9 @@ @@ -6,8 +6,9 @@
6 class QPDF_InlineImage: public QPDFObject 6 class QPDF_InlineImage: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_InlineImage(std::string const& val);  
10 virtual ~QPDF_InlineImage() = default; 9 virtual ~QPDF_InlineImage() = default;
  10 + static std::shared_ptr<QPDFObject> create(std::string const& val);
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
11 virtual std::string unparse(); 12 virtual std::string unparse();
12 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
13 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -15,6 +16,7 @@ class QPDF_InlineImage: public QPDFObject @@ -15,6 +16,7 @@ class QPDF_InlineImage: public QPDFObject
15 std::string getVal() const; 16 std::string getVal() const;
16 17
17 private: 18 private:
  19 + QPDF_InlineImage(std::string const& val);
18 std::string val; 20 std::string val;
19 }; 21 };
20 22
libqpdf/qpdf/QPDF_Integer.hh
@@ -6,8 +6,9 @@ @@ -6,8 +6,9 @@
6 class QPDF_Integer: public QPDFObject 6 class QPDF_Integer: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_Integer(long long val);  
10 virtual ~QPDF_Integer() = default; 9 virtual ~QPDF_Integer() = default;
  10 + static std::shared_ptr<QPDFObject> create(long long value);
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
11 virtual std::string unparse(); 12 virtual std::string unparse();
12 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
13 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -15,6 +16,7 @@ class QPDF_Integer: public QPDFObject @@ -15,6 +16,7 @@ class QPDF_Integer: public QPDFObject
15 long long getVal() const; 16 long long getVal() const;
16 17
17 private: 18 private:
  19 + QPDF_Integer(long long val);
18 long long val; 20 long long val;
19 }; 21 };
20 22
libqpdf/qpdf/QPDF_Name.hh
@@ -6,8 +6,9 @@ @@ -6,8 +6,9 @@
6 class QPDF_Name: public QPDFObject 6 class QPDF_Name: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_Name(std::string const& name);  
10 virtual ~QPDF_Name() = default; 9 virtual ~QPDF_Name() = default;
  10 + static std::shared_ptr<QPDFObject> create(std::string const& name);
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
11 virtual std::string unparse(); 12 virtual std::string unparse();
12 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
13 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -18,6 +19,7 @@ class QPDF_Name: public QPDFObject @@ -18,6 +19,7 @@ class QPDF_Name: public QPDFObject
18 static std::string normalizeName(std::string const& name); 19 static std::string normalizeName(std::string const& name);
19 20
20 private: 21 private:
  22 + QPDF_Name(std::string const& name);
21 std::string name; 23 std::string name;
22 }; 24 };
23 25
libqpdf/qpdf/QPDF_Null.hh
@@ -7,10 +7,14 @@ class QPDF_Null: public QPDFObject @@ -7,10 +7,14 @@ class QPDF_Null: public QPDFObject
7 { 7 {
8 public: 8 public:
9 virtual ~QPDF_Null() = default; 9 virtual ~QPDF_Null() = default;
  10 + static std::shared_ptr<QPDFObject> create();
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
10 virtual std::string unparse(); 12 virtual std::string unparse();
11 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
12 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
13 virtual char const* getTypeName() const; 15 virtual char const* getTypeName() const;
  16 + private:
  17 + QPDF_Null() = default;
14 }; 18 };
15 19
16 #endif // QPDF_NULL_HH 20 #endif // QPDF_NULL_HH
libqpdf/qpdf/QPDF_Operator.hh
@@ -6,8 +6,9 @@ @@ -6,8 +6,9 @@
6 class QPDF_Operator: public QPDFObject 6 class QPDF_Operator: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_Operator(std::string const& val);  
10 virtual ~QPDF_Operator() = default; 9 virtual ~QPDF_Operator() = default;
  10 + static std::shared_ptr<QPDFObject> create(std::string const& val);
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
11 virtual std::string unparse(); 12 virtual std::string unparse();
12 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
13 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -15,6 +16,7 @@ class QPDF_Operator: public QPDFObject @@ -15,6 +16,7 @@ class QPDF_Operator: public QPDFObject
15 std::string getVal() const; 16 std::string getVal() const;
16 17
17 private: 18 private:
  19 + QPDF_Operator(std::string const& val);
18 std::string val; 20 std::string val;
19 }; 21 };
20 22
libqpdf/qpdf/QPDF_Real.hh
@@ -6,9 +6,11 @@ @@ -6,9 +6,11 @@
6 class QPDF_Real: public QPDFObject 6 class QPDF_Real: public QPDFObject
7 { 7 {
8 public: 8 public:
9 - QPDF_Real(std::string const& val);  
10 - QPDF_Real(double value, int decimal_places, bool trim_trailing_zeroes);  
11 virtual ~QPDF_Real() = default; 9 virtual ~QPDF_Real() = default;
  10 + static std::shared_ptr<QPDFObject> create(std::string const& val);
  11 + static std::shared_ptr<QPDFObject> create(
  12 + double value, int decimal_places, bool trim_trailing_zeroes);
  13 + virtual std::shared_ptr<QPDFObject> shallowCopy();
12 virtual std::string unparse(); 14 virtual std::string unparse();
13 virtual JSON getJSON(int json_version); 15 virtual JSON getJSON(int json_version);
14 virtual QPDFObject::object_type_e getTypeCode() const; 16 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -16,6 +18,8 @@ class QPDF_Real: public QPDFObject @@ -16,6 +18,8 @@ class QPDF_Real: public QPDFObject
16 std::string getVal(); 18 std::string getVal();
17 19
18 private: 20 private:
  21 + QPDF_Real(std::string const& val);
  22 + QPDF_Real(double value, int decimal_places, bool trim_trailing_zeroes);
19 // Store reals as strings to avoid roundoff errors. 23 // Store reals as strings to avoid roundoff errors.
20 std::string val; 24 std::string val;
21 }; 25 };
libqpdf/qpdf/QPDF_Reserved.hh
@@ -7,10 +7,14 @@ class QPDF_Reserved: public QPDFObject @@ -7,10 +7,14 @@ class QPDF_Reserved: public QPDFObject
7 { 7 {
8 public: 8 public:
9 virtual ~QPDF_Reserved() = default; 9 virtual ~QPDF_Reserved() = default;
  10 + static std::shared_ptr<QPDFObject> create();
  11 + virtual std::shared_ptr<QPDFObject> shallowCopy();
10 virtual std::string unparse(); 12 virtual std::string unparse();
11 virtual JSON getJSON(int json_version); 13 virtual JSON getJSON(int json_version);
12 virtual QPDFObject::object_type_e getTypeCode() const; 14 virtual QPDFObject::object_type_e getTypeCode() const;
13 virtual char const* getTypeName() const; 15 virtual char const* getTypeName() const;
  16 + private:
  17 + QPDF_Reserved() = default;
14 }; 18 };
15 19
16 #endif // QPDF_RESERVED_HH 20 #endif // QPDF_RESERVED_HH
libqpdf/qpdf/QPDF_Stream.hh
@@ -16,14 +16,15 @@ class QPDF; @@ -16,14 +16,15 @@ class QPDF;
16 class QPDF_Stream: public QPDFObject 16 class QPDF_Stream: public QPDFObject
17 { 17 {
18 public: 18 public:
19 - QPDF_Stream( 19 + virtual ~QPDF_Stream() = default;
  20 + static std::shared_ptr<QPDFObject> create(
20 QPDF*, 21 QPDF*,
21 int objid, 22 int objid,
22 int generation, 23 int generation,
23 QPDFObjectHandle stream_dict, 24 QPDFObjectHandle stream_dict,
24 qpdf_offset_t offset, 25 qpdf_offset_t offset,
25 size_t length); 26 size_t length);
26 - virtual ~QPDF_Stream() = default; 27 + virtual std::shared_ptr<QPDFObject> shallowCopy();
27 virtual std::string unparse(); 28 virtual std::string unparse();
28 virtual JSON getJSON(int json_version); 29 virtual JSON getJSON(int json_version);
29 virtual QPDFObject::object_type_e getTypeCode() const; 30 virtual QPDFObject::object_type_e getTypeCode() const;
@@ -83,6 +84,13 @@ class QPDF_Stream: public QPDFObject @@ -83,6 +84,13 @@ class QPDF_Stream: public QPDFObject
83 virtual void releaseResolved(); 84 virtual void releaseResolved();
84 85
85 private: 86 private:
  87 + QPDF_Stream(
  88 + QPDF*,
  89 + int objid,
  90 + int generation,
  91 + QPDFObjectHandle stream_dict,
  92 + qpdf_offset_t offset,
  93 + size_t length);
86 static std::map<std::string, std::string> filter_abbreviations; 94 static std::map<std::string, std::string> filter_abbreviations;
87 static std:: 95 static std::
88 map<std::string, std::function<std::shared_ptr<QPDFStreamFilter>()>> 96 map<std::string, std::function<std::shared_ptr<QPDFStreamFilter>()>>
libqpdf/qpdf/QPDF_String.hh
@@ -7,10 +7,13 @@ @@ -7,10 +7,13 @@
7 7
8 class QPDF_String: public QPDFObject 8 class QPDF_String: public QPDFObject
9 { 9 {
  10 + friend class QPDFWriter;
  11 +
10 public: 12 public:
11 - QPDF_String(std::string const& val);  
12 - static QPDF_String* new_utf16(std::string const& utf8_val);  
13 virtual ~QPDF_String() = default; 13 virtual ~QPDF_String() = default;
  14 + static std::shared_ptr<QPDFObject> create(std::string const& val);
  15 + static std::shared_ptr<QPDFObject> create_utf16(std::string const& utf8_val);
  16 + virtual std::shared_ptr<QPDFObject> shallowCopy();
14 virtual std::string unparse(); 17 virtual std::string unparse();
15 virtual QPDFObject::object_type_e getTypeCode() const; 18 virtual QPDFObject::object_type_e getTypeCode() const;
16 virtual char const* getTypeName() const; 19 virtual char const* getTypeName() const;
@@ -20,6 +23,7 @@ class QPDF_String: public QPDFObject @@ -20,6 +23,7 @@ class QPDF_String: public QPDFObject
20 std::string getUTF8Val() const; 23 std::string getUTF8Val() const;
21 24
22 private: 25 private:
  26 + QPDF_String(std::string const& val);
23 bool useHexString() const; 27 bool useHexString() const;
24 std::string val; 28 std::string val;
25 }; 29 };
qpdf/qpdf.testcov
@@ -70,14 +70,6 @@ QPDFTokenizer null in name 0 @@ -70,14 +70,6 @@ QPDFTokenizer null in name 0
70 QPDFTokenizer bad name 0 70 QPDFTokenizer bad name 0
71 QPDF_Stream invalid filter 0 71 QPDF_Stream invalid filter 0
72 QPDF UseOutlines but no Outlines 0 72 QPDF UseOutlines but no Outlines 0
73 -QPDFObjectHandle clone bool 0  
74 -QPDFObjectHandle clone null 0  
75 -QPDFObjectHandle clone integer 0  
76 -QPDFObjectHandle clone real 0  
77 -QPDFObjectHandle clone name 0  
78 -QPDFObjectHandle clone string 0  
79 -QPDFObjectHandle clone array 0  
80 -QPDFObjectHandle clone dictionary 0  
81 QPDFObjectHandle makeDirect loop 0 73 QPDFObjectHandle makeDirect loop 0
82 QPDFObjectHandle copy stream 1 74 QPDFObjectHandle copy stream 1
83 QPDF default for xref stream field 0 0 75 QPDF default for xref stream field 0 0
@@ -199,9 +191,6 @@ QPDF updateAllPagesCache 0 @@ -199,9 +191,6 @@ QPDF updateAllPagesCache 0
199 QPDF insert non-indirect page 0 191 QPDF insert non-indirect page 0
200 QPDF insert indirect page 0 192 QPDF insert indirect page 0
201 QPDFObjectHandle ERR shallow copy stream 0 193 QPDFObjectHandle ERR shallow copy stream 0
202 -QPDFObjectHandle shallow copy array 0  
203 -QPDFObjectHandle shallow copy dictionary 0  
204 -QPDFObjectHandle shallow copy scalar 0  
205 QPDFObjectHandle newStream with string 0 194 QPDFObjectHandle newStream with string 0
206 QPDF unknown key not inherited 0 195 QPDF unknown key not inherited 0
207 QPDF_Stream provider length not provided 0 196 QPDF_Stream provider length not provided 0