Commit ba0ef7a124e9aecc2d0113598c851bae4710b887

Authored by Jay Berkenbilt
1 parent a68703b0

Replace PointerHolder with std::shared_ptr in the rest of the code

Increase to POINTERHOLDER_TRANSITION=3

patrepl s/PointerHolder/std::shared_ptr/g **/*.cc **/*.hh
patrepl s/make_pointer_holder/std::make_shared/g **/*.cc
patrepl s/make_array_pointer_holder/QUtil::make_shared_array/g **/*.cc
patrepl s,qpdf/std::shared_ptr,qpdf/PointerHolder, **/*.cc **/*.hh
git restore include/qpdf/PointerHolder.hh
git restore libtests/pointer_holder.cc
cleanpatch
./format-code
CMakeLists.txt
... ... @@ -108,7 +108,7 @@ if(NOT (BUILD_STATIC_LIBS OR BUILD_SHARED_LIBS))
108 108 FATAL_ERROR "At least one of static or shared libraries must be built")
109 109 endif()
110 110  
111   -add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:POINTERHOLDER_TRANSITION=2>)
  111 +add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:POINTERHOLDER_TRANSITION=3>)
112 112  
113 113 enable_testing()
114 114 set(RUN_QTEST perl ${qpdf_SOURCE_DIR}/run-qtest)
... ...
examples/pdf-create.cc
... ... @@ -176,7 +176,7 @@ add_page(
176 176 // with /FlateDecode if we don't provide any other form of
177 177 // compression.
178 178 ImageProvider* p = new ImageProvider(color_space, filter);
179   - PointerHolder<QPDFObjectHandle::StreamDataProvider> provider(p);
  179 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> provider(p);
180 180 size_t width = p->getWidth();
181 181 size_t height = p->getHeight();
182 182 QPDFObjectHandle image = QPDFObjectHandle::newStream(&pdf);
... ... @@ -296,10 +296,10 @@ check(
296 296 // Check image data
297 297 auto actual_data = image.getStreamData(qpdf_dl_all);
298 298 ImageProvider* p = new ImageProvider(desired_color_space, "null");
299   - PointerHolder<QPDFObjectHandle::StreamDataProvider> provider(p);
  299 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> provider(p);
300 300 Pl_Buffer b_p("get image data");
301 301 provider->provideStreamData(0, 0, &b_p);
302   - PointerHolder<Buffer> desired_data(b_p.getBuffer());
  302 + std::shared_ptr<Buffer> desired_data(b_p.getBuffer());
303 303  
304 304 if (desired_data->getSize() != actual_data->getSize()) {
305 305 std::cout << "page " << pageno << ": image data length mismatch"
... ...
examples/pdf-custom-filter.cc
... ... @@ -205,7 +205,7 @@ class StreamReplacer: public QPDFObjectHandle::StreamDataProvider
205 205  
206 206 void registerStream(
207 207 QPDFObjectHandle stream,
208   - PointerHolder<QPDFObjectHandle::StreamDataProvider> self);
  208 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> self);
209 209  
210 210 private:
211 211 bool maybeReplace(
... ... @@ -283,7 +283,7 @@ StreamReplacer::maybeReplace(
283 283 // make all its decisions from the stream dictionary. However,
284 284 // it's a good idea to make sure we can retrieve the filtered data
285 285 // if we are going to need it later.
286   - PointerHolder<Buffer> out;
  286 + std::shared_ptr<Buffer> out;
287 287 try {
288 288 out = stream.getStreamData();
289 289 } catch (...) {
... ... @@ -321,7 +321,7 @@ StreamReplacer::maybeReplace(
321 321 void
322 322 StreamReplacer::registerStream(
323 323 QPDFObjectHandle stream,
324   - PointerHolder<QPDFObjectHandle::StreamDataProvider> self)
  324 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> self)
325 325 {
326 326 QPDFObjGen og(stream.getObjGen());
327 327  
... ... @@ -409,10 +409,10 @@ process(
409 409 qpdf.processFile(infilename);
410 410  
411 411 // Create a single StreamReplacer instance. The interface requires
412   - // a PointerHolder in various places, so allocate a StreamReplacer
413   - // and stash it in a PointerHolder.
  412 + // a std::shared_ptr in various places, so allocate a StreamReplacer
  413 + // and stash it in a std::shared_ptr.
414 414 StreamReplacer* replacer = new StreamReplacer(&qpdf);
415   - PointerHolder<QPDFObjectHandle::StreamDataProvider> p(replacer);
  415 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> p(replacer);
416 416  
417 417 for (auto& o : qpdf.getAllObjects()) {
418 418 if (o.isStream()) {
... ...
examples/pdf-filter-tokens.cc
... ... @@ -207,10 +207,11 @@ main(int argc, char* argv[])
207 207 // details.
208 208 QPDFPageObjectHelper& page(*iter);
209 209 page.addContentTokenFilter(
210   - PointerHolder<QPDFObjectHandle::TokenFilter>(
  210 + std::shared_ptr<QPDFObjectHandle::TokenFilter>(
211 211 new StringReverser));
212 212 page.addContentTokenFilter(
213   - PointerHolder<QPDFObjectHandle::TokenFilter>(new ColorToGray));
  213 + std::shared_ptr<QPDFObjectHandle::TokenFilter>(
  214 + new ColorToGray));
214 215 }
215 216  
216 217 QPDFWriter w(pdf, outfilename);
... ...
examples/pdf-invert-images.cc
... ... @@ -41,7 +41,7 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider
41 41  
42 42 void registerImage(
43 43 QPDFObjectHandle image,
44   - PointerHolder<QPDFObjectHandle::StreamDataProvider> self);
  44 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> self);
45 45  
46 46 private:
47 47 std::map<QPDFObjGen, QPDFObjectHandle> copied_images;
... ... @@ -50,14 +50,14 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider
50 50 void
51 51 ImageInverter::registerImage(
52 52 QPDFObjectHandle image,
53   - PointerHolder<QPDFObjectHandle::StreamDataProvider> self)
  53 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> self)
54 54 {
55 55 // replaceStreamData requires a pointer holder to the stream data
56 56 // provider, but there's no way for us to generate one ourselves,
57 57 // so we have to have it handed to us. Don't be tempted to have
58   - // the class contain a PointerHolder to itself as a member. Doing
  58 + // the class contain a std::shared_ptr to itself as a member. Doing
59 59 // this will prevent the class from ever being deleted since the
60   - // reference count will never drop to zero (and PointerHolder
  60 + // reference count will never drop to zero (and std::shared_ptr
61 61 // doesn't have weak references).
62 62  
63 63 QPDFObjGen og(image.getObjGen());
... ... @@ -90,7 +90,7 @@ ImageInverter::provideStreamData(int objid, int generation, Pipeline* pipeline)
90 90 // image data. Then invert the image data and write the inverted
91 91 // data to the pipeline.
92 92 QPDFObjGen og(objid, generation);
93   - PointerHolder<Buffer> data =
  93 + std::shared_ptr<Buffer> data =
94 94 this->copied_images[og].getStreamData(qpdf_dl_all);
95 95 size_t size = data->getSize();
96 96 unsigned char* buf = data->getBuffer();
... ... @@ -128,7 +128,7 @@ main(int argc, char* argv[])
128 128 qpdf.processFile(infilename, password);
129 129  
130 130 ImageInverter* inv = new ImageInverter;
131   - auto p = PointerHolder<QPDFObjectHandle::StreamDataProvider>(inv);
  131 + auto p = std::shared_ptr<QPDFObjectHandle::StreamDataProvider>(inv);
132 132  
133 133 // For each page...
134 134 std::vector<QPDFPageObjectHelper> pages =
... ...
fuzz/qpdf_fuzzer.cc
... ... @@ -34,9 +34,9 @@ class FuzzHelper
34 34 void run();
35 35  
36 36 private:
37   - PointerHolder<QPDF> getQpdf();
38   - PointerHolder<QPDFWriter> getWriter(PointerHolder<QPDF>);
39   - void doWrite(PointerHolder<QPDFWriter> w);
  37 + std::shared_ptr<QPDF> getQpdf();
  38 + std::shared_ptr<QPDFWriter> getWriter(std::shared_ptr<QPDF>);
  39 + void doWrite(std::shared_ptr<QPDFWriter> w);
40 40 void testWrite();
41 41 void testPages();
42 42 void testOutlines();
... ... @@ -52,27 +52,27 @@ FuzzHelper::FuzzHelper(unsigned char const* data, size_t size) :
52 52 {
53 53 }
54 54  
55   -PointerHolder<QPDF>
  55 +std::shared_ptr<QPDF>
56 56 FuzzHelper::getQpdf()
57 57 {
58   - auto is = PointerHolder<InputSource>(
  58 + auto is = std::shared_ptr<InputSource>(
59 59 new BufferInputSource("fuzz input", &this->input_buffer));
60   - auto qpdf = make_pointer_holder<QPDF>();
  60 + auto qpdf = std::make_shared<QPDF>();
61 61 qpdf->processInputSource(is);
62 62 return qpdf;
63 63 }
64 64  
65   -PointerHolder<QPDFWriter>
66   -FuzzHelper::getWriter(PointerHolder<QPDF> qpdf)
  65 +std::shared_ptr<QPDFWriter>
  66 +FuzzHelper::getWriter(std::shared_ptr<QPDF> qpdf)
67 67 {
68   - auto w = make_pointer_holder<QPDFWriter>(*qpdf);
  68 + auto w = std::make_shared<QPDFWriter>(*qpdf);
69 69 w->setOutputPipeline(&this->discard);
70 70 w->setDecodeLevel(qpdf_dl_all);
71 71 return w;
72 72 }
73 73  
74 74 void
75   -FuzzHelper::doWrite(PointerHolder<QPDFWriter> w)
  75 +FuzzHelper::doWrite(std::shared_ptr<QPDFWriter> w)
76 76 {
77 77 try {
78 78 w->write();
... ... @@ -88,8 +88,8 @@ FuzzHelper::testWrite()
88 88 {
89 89 // Write in various ways to exercise QPDFWriter
90 90  
91   - PointerHolder<QPDF> q;
92   - PointerHolder<QPDFWriter> w;
  91 + std::shared_ptr<QPDF> q;
  92 + std::shared_ptr<QPDFWriter> w;
93 93  
94 94 q = getQpdf();
95 95 w = getWriter(q);
... ... @@ -126,7 +126,7 @@ FuzzHelper::testPages()
126 126 {
127 127 // Parse all content streams, and exercise some helpers that
128 128 // operate on pages.
129   - PointerHolder<QPDF> q = getQpdf();
  129 + std::shared_ptr<QPDF> q = getQpdf();
130 130 QPDFPageDocumentHelper pdh(*q);
131 131 QPDFPageLabelDocumentHelper pldh(*q);
132 132 QPDFOutlineDocumentHelper odh(*q);
... ... @@ -168,7 +168,7 @@ FuzzHelper::testPages()
168 168 void
169 169 FuzzHelper::testOutlines()
170 170 {
171   - PointerHolder<QPDF> q = getQpdf();
  171 + std::shared_ptr<QPDF> q = getQpdf();
172 172 std::list<std::vector<QPDFOutlineObjectHelper>> queue;
173 173 QPDFOutlineDocumentHelper odh(*q);
174 174 queue.push_back(odh.getTopLevelOutlines());
... ...
fuzz/standalone_fuzz_target_runner.cc
... ... @@ -8,7 +8,7 @@ int
8 8 main(int argc, char** argv)
9 9 {
10 10 for (int i = 1; i < argc; i++) {
11   - PointerHolder<char> file_buf;
  11 + std::shared_ptr<char> file_buf;
12 12 size_t size = 0;
13 13 QUtil::read_file_into_memory(argv[i], file_buf, size);
14 14 LLVMFuzzerTestOneInput(
... ...
libtests/input_source.cc
... ... @@ -5,11 +5,11 @@
5 5 #include <cstring>
6 6 #include <iostream>
7 7  
8   -static PointerHolder<Buffer>
  8 +static std::shared_ptr<Buffer>
9 9 get_buffer()
10 10 {
11 11 size_t size = 3172;
12   - PointerHolder<Buffer> b(new Buffer(size));
  12 + std::shared_ptr<Buffer> b(new Buffer(size));
13 13 unsigned char* p = b->getBuffer();
14 14 for (size_t i = 0; i < size; ++i) {
15 15 p[i] = static_cast<unsigned char>(i & 0xff);
... ... @@ -20,7 +20,7 @@ get_buffer()
20 20 class Finder: public InputSource::Finder
21 21 {
22 22 public:
23   - Finder(PointerHolder<InputSource> is, std::string const& after) :
  23 + Finder(std::shared_ptr<InputSource> is, std::string const& after) :
24 24 is(is),
25 25 after(after)
26 26 {
... ... @@ -31,7 +31,7 @@ class Finder: public InputSource::Finder
31 31 virtual bool check();
32 32  
33 33 private:
34   - PointerHolder<InputSource> is;
  34 + std::shared_ptr<InputSource> is;
35 35 std::string after;
36 36 };
37 37  
... ... @@ -57,14 +57,14 @@ check(char const* description, bool expected, bool actual)
57 57 int
58 58 main()
59 59 {
60   - PointerHolder<Buffer> b1 = get_buffer();
  60 + std::shared_ptr<Buffer> b1 = get_buffer();
61 61 unsigned char* b = b1->getBuffer();
62 62 // Straddle block boundaries
63 63 memcpy(b + 1022, "potato", 6);
64 64 // Overlap so that the first check() would advance past the start
65 65 // of the next match
66 66 memcpy(b + 2037, "potato potato salad ", 20);
67   - auto is = PointerHolder<InputSource>(
  67 + auto is = std::shared_ptr<InputSource>(
68 68 new BufferInputSource("test buffer input source", b1.get()));
69 69 Finder f1(is, "salad");
70 70 check("find potato salad", true, is->findFirst("potato", 0, 0, f1));
... ...
libtests/json_parse.cc
... ... @@ -11,7 +11,7 @@ main(int argc, char* argv[])
11 11 }
12 12 char const* filename = argv[1];
13 13 try {
14   - PointerHolder<char> buf;
  14 + std::shared_ptr<char> buf;
15 15 size_t size;
16 16 QUtil::read_file_into_memory(filename, buf, size);
17 17 std::string s(buf.get(), size);
... ...
libtests/qutil.cc
... ... @@ -529,7 +529,7 @@ read_from_file_test()
529 529 fclose(fp);
530 530 }
531 531  
532   - PointerHolder<char> buf;
  532 + std::shared_ptr<char> buf;
533 533 size_t size = 0;
534 534 QUtil::read_file_into_memory("other-file", buf, size);
535 535 std::cout << "read " << size << " bytes" << std::endl;
... ... @@ -595,7 +595,7 @@ assert_no_file(char const* filename)
595 595 void
596 596 rename_delete_test()
597 597 {
598   - PointerHolder<char> buf;
  598 + std::shared_ptr<char> buf;
599 599 size_t size = 0;
600 600  
601 601 try {
... ...
qpdf/test_driver.cc
... ... @@ -49,7 +49,7 @@ usage()
49 49 class Provider: public QPDFObjectHandle::StreamDataProvider
50 50 {
51 51 public:
52   - Provider(PointerHolder<Buffer> b) :
  52 + Provider(std::shared_ptr<Buffer> b) :
53 53 b(b),
54 54 bad_length(false)
55 55 {
... ... @@ -74,7 +74,7 @@ class Provider: public QPDFObjectHandle::StreamDataProvider
74 74 }
75 75  
76 76 private:
77   - PointerHolder<Buffer> b;
  77 + std::shared_ptr<Buffer> b;
78 78 bool bad_length;
79 79 };
80 80  
... ... @@ -151,7 +151,7 @@ class TokenFilter: public QPDFObjectHandle::TokenFilter
151 151 static std::string
152 152 getPageContents(QPDFObjectHandle page)
153 153 {
154   - PointerHolder<Buffer> b1 = page.getKey("/Contents").getStreamData();
  154 + std::shared_ptr<Buffer> b1 = page.getKey("/Contents").getStreamData();
155 155 return std::string(
156 156 reinterpret_cast<char*>(b1->getBuffer()), b1->getSize()) +
157 157 "\0";
... ... @@ -271,14 +271,14 @@ test_0_1(QPDF&amp; pdf, char const* arg2)
271 271 std::cout << "Raw stream data:" << std::endl;
272 272 std::cout.flush();
273 273 QUtil::binary_stdout();
274   - auto out = make_pointer_holder<Pl_StdioFile>("raw", stdout);
  274 + auto out = std::make_shared<Pl_StdioFile>("raw", stdout);
275 275 qtest.pipeStreamData(out.get(), 0, qpdf_dl_none);
276 276  
277 277 std::cout << std::endl << "Uncompressed stream data:" << std::endl;
278 278 if (qtest.pipeStreamData(0, 0, qpdf_dl_all)) {
279 279 std::cout.flush();
280 280 QUtil::binary_stdout();
281   - out = make_pointer_holder<Pl_StdioFile>("filtered", stdout);
  281 + out = std::make_shared<Pl_StdioFile>("filtered", stdout);
282 282 qtest.pipeStreamData(out.get(), 0, qpdf_dl_all);
283 283 std::cout << std::endl << "End of stream data" << std::endl;
284 284 } else {
... ... @@ -316,7 +316,7 @@ test_2(QPDF&amp; pdf, char const* arg2)
316 316 QPDFObjectHandle page = kids.getArrayItem(1); // second page
317 317 QPDFObjectHandle contents = page.getKey("/Contents");
318 318 QUtil::binary_stdout();
319   - auto out = make_pointer_holder<Pl_StdioFile>("filtered", stdout);
  319 + auto out = std::make_shared<Pl_StdioFile>("filtered", stdout);
320 320 contents.pipeStreamData(out.get(), 0, qpdf_dl_generalized);
321 321 }
322 322  
... ... @@ -329,8 +329,7 @@ test_3(QPDF&amp; pdf, char const* arg2)
329 329 std::cout << "-- stream " << i << " --" << std::endl;
330 330 std::cout.flush();
331 331 QUtil::binary_stdout();
332   - auto out =
333   - make_pointer_holder<Pl_StdioFile>("tokenized stream", stdout);
  332 + auto out = std::make_shared<Pl_StdioFile>("tokenized stream", stdout);
334 333 stream.pipeStreamData(
335 334 out.get(), qpdf_ef_normalize, qpdf_dl_generalized);
336 335 }
... ... @@ -503,7 +502,7 @@ test_8(QPDF&amp; pdf, char const* arg2)
503 502 // This is a bogus way to use StreamDataProvider, but it does
504 503 // adequately test its functionality.
505 504 Provider* provider = new Provider(b);
506   - auto p = PointerHolder<QPDFObjectHandle::StreamDataProvider>(provider);
  505 + auto p = std::shared_ptr<QPDFObjectHandle::StreamDataProvider>(provider);
507 506 qstream.replaceStreamData(
508 507 p,
509 508 QPDFObjectHandle::newName("/FlateDecode"),
... ... @@ -532,7 +531,7 @@ test_9(QPDF&amp; pdf, char const* arg2)
532 531 {
533 532 QPDFObjectHandle root = pdf.getRoot();
534 533 // Explicitly exercise the Buffer version of newStream
535   - auto buf = make_pointer_holder<Buffer>(20U);
  534 + auto buf = std::make_shared<Buffer>(20U);
536 535 unsigned char* bp = buf->getBuffer();
537 536 memcpy(bp, "data for new stream\n", 20); // no null!
538 537 QPDFObjectHandle qstream = QPDFObjectHandle::newStream(&pdf, buf);
... ... @@ -581,8 +580,8 @@ test_11(QPDF&amp; pdf, char const* arg2)
581 580 {
582 581 QPDFObjectHandle root = pdf.getRoot();
583 582 QPDFObjectHandle qstream = root.getKey("/QStream");
584   - PointerHolder<Buffer> b1 = qstream.getStreamData();
585   - PointerHolder<Buffer> b2 = qstream.getRawStreamData();
  583 + std::shared_ptr<Buffer> b1 = qstream.getStreamData();
  584 + std::shared_ptr<Buffer> b2 = qstream.getRawStreamData();
586 585 if ((b1->getSize() == 7) && (memcmp(b1->getBuffer(), "potato\n", 7) == 0)) {
587 586 std::cout << "filtered stream data okay" << std::endl;
588 587 }
... ... @@ -815,7 +814,7 @@ test_17(QPDF&amp; pdf, char const* arg2)
815 814 QPDFObjectHandle(pages.at(1)).getKey("/Contents").getObjGen());
816 815 pdf.removePage(pages.at(0));
817 816 assert(pages.size() == 2);
818   - PointerHolder<Buffer> b =
  817 + std::shared_ptr<Buffer> b =
819 818 QPDFObjectHandle(pages.at(0)).getKey("/Contents").getStreamData();
820 819 std::string contents = std::string(
821 820 reinterpret_cast<char const*>(b->getBuffer()), b->getSize());
... ... @@ -1039,7 +1038,7 @@ test_27(QPDF&amp; pdf, char const* arg2)
1039 1038 // also exercise setImmediateCopyFrom.
1040 1039  
1041 1040 // Create a provider. The provider stays in scope.
1042   - PointerHolder<QPDFObjectHandle::StreamDataProvider> p1;
  1041 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> p1;
1043 1042 {
1044 1043 // Local scope
1045 1044 Pl_Buffer pl("buffer");
... ... @@ -1065,7 +1064,7 @@ test_27(QPDF&amp; pdf, char const* arg2)
1065 1064 // Make sure some source PDFs are out of scope when we
1066 1065 // write.
1067 1066  
1068   - PointerHolder<QPDFObjectHandle::StreamDataProvider> p2;
  1067 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> p2;
1069 1068 // Create another provider. This one will go out of scope
1070 1069 // along with its containing qpdf, which has
1071 1070 // setImmediateCopyFrom(true).
... ... @@ -1266,7 +1265,7 @@ test_35(QPDF&amp; pdf, char const* arg2)
1266 1265 {
1267 1266 // Extract attachments
1268 1267  
1269   - std::map<std::string, PointerHolder<Buffer>> attachments;
  1268 + std::map<std::string, std::shared_ptr<Buffer>> attachments;
1270 1269 QPDFObjectHandle root = pdf.getRoot();
1271 1270 QPDFObjectHandle names = root.getKey("/Names");
1272 1271 QPDFObjectHandle embeddedFiles = names.getKey("/EmbeddedFiles");
... ... @@ -1282,7 +1281,7 @@ test_35(QPDF&amp; pdf, char const* arg2)
1282 1281 attachments[filename] = stream.getStreamData();
1283 1282 }
1284 1283 }
1285   - for (std::map<std::string, PointerHolder<Buffer>>::iterator iter =
  1284 + for (std::map<std::string, std::shared_ptr<Buffer>>::iterator iter =
1286 1285 attachments.begin();
1287 1286 iter != attachments.end();
1288 1287 ++iter) {
... ... @@ -1421,7 +1420,7 @@ test_41(QPDF&amp; pdf, char const* arg2)
1421 1420 iter != pages.end();
1422 1421 ++iter) {
1423 1422 (*iter).addContentTokenFilter(
1424   - PointerHolder<QPDFObjectHandle::TokenFilter>(new TokenFilter()));
  1423 + std::shared_ptr<QPDFObjectHandle::TokenFilter>(new TokenFilter()));
1425 1424 }
1426 1425 QPDFWriter w(pdf, "a.pdf");
1427 1426 w.setQDFMode(true);
... ... @@ -2468,12 +2467,12 @@ test_68(QPDF&amp; pdf, char const* arg2)
2468 2467 } catch (std::exception& e) {
2469 2468 std::cout << "get unfilterable stream: " << e.what() << std::endl;
2470 2469 }
2471   - PointerHolder<Buffer> b1 = qstream.getStreamData(qpdf_dl_all);
  2470 + std::shared_ptr<Buffer> b1 = qstream.getStreamData(qpdf_dl_all);
2472 2471 if ((b1->getSize() > 10) &&
2473 2472 (memcmp(b1->getBuffer(), "wwwwwwwww", 9) == 0)) {
2474 2473 std::cout << "filtered stream data okay" << std::endl;
2475 2474 }
2476   - PointerHolder<Buffer> b2 = qstream.getRawStreamData();
  2475 + std::shared_ptr<Buffer> b2 = qstream.getRawStreamData();
2477 2476 if ((b2->getSize() > 10) &&
2478 2477 (memcmp(
2479 2478 b2->getBuffer(), "\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46", 10) ==
... ... @@ -2578,11 +2577,11 @@ test_72(QPDF&amp; pdf, char const* arg2)
2578 2577 Pl_Buffer b("buffer");
2579 2578 if (i == 0) {
2580 2579 fx1.addContentTokenFilter(
2581   - PointerHolder<QPDFObjectHandle::TokenFilter>(
  2580 + std::shared_ptr<QPDFObjectHandle::TokenFilter>(
2582 2581 new TokenFilter()));
2583 2582 } else {
2584 2583 fx1.getObjectHandle().addTokenFilter(
2585   - PointerHolder<QPDFObjectHandle::TokenFilter>(
  2584 + std::shared_ptr<QPDFObjectHandle::TokenFilter>(
2586 2585 new TokenFilter()));
2587 2586 }
2588 2587 fx1.pipeContents(&b);
... ... @@ -2999,7 +2998,7 @@ test_83(QPDF&amp; pdf, char const* arg2)
2999 2998 // partial = true, we just use qpdf --job-json-file.
3000 2999  
3001 3000 QPDFJob j;
3002   - PointerHolder<char> file_buf;
  3001 + std::shared_ptr<char> file_buf;
3003 3002 size_t size;
3004 3003 QUtil::read_file_into_memory(arg2, file_buf, size);
3005 3004 try {
... ... @@ -3201,7 +3200,7 @@ runtest(int n, char const* filename1, char const* arg2)
3201 3200 }
3202 3201  
3203 3202 QPDF pdf;
3204   - PointerHolder<char> file_buf;
  3203 + std::shared_ptr<char> file_buf;
3205 3204 FILE* filep = 0;
3206 3205 if (n == 0) {
3207 3206 pdf.setAttemptRecovery(false);
... ...
qpdf/test_large_file.cc
... ... @@ -231,7 +231,7 @@ create_pdf(char const* filename)
231 231 image_dict.replaceKey("/Width", newInteger(width));
232 232 image_dict.replaceKey("/Height", newInteger(height));
233 233 ImageProvider* p = new ImageProvider(pageno);
234   - PointerHolder<QPDFObjectHandle::StreamDataProvider> provider(p);
  234 + std::shared_ptr<QPDFObjectHandle::StreamDataProvider> provider(p);
235 235 image.replaceStreamData(
236 236 provider, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull());
237 237  
... ... @@ -265,7 +265,7 @@ create_pdf(char const* filename)
265 265 static void
266 266 check_page_contents(size_t pageno, QPDFObjectHandle page)
267 267 {
268   - PointerHolder<Buffer> buf = page.getKey("/Contents").getStreamData();
  268 + std::shared_ptr<Buffer> buf = page.getKey("/Contents").getStreamData();
269 269 std::string actual_contents =
270 270 std::string(reinterpret_cast<char*>(buf->getBuffer()), buf->getSize());
271 271 std::string expected_contents = generate_page_contents(pageno);
... ...
qpdf/test_tokenizer.cc
... ... @@ -25,7 +25,7 @@ usage()
25 25 class Finder: public InputSource::Finder
26 26 {
27 27 public:
28   - Finder(PointerHolder<InputSource> is, std::string const& str) :
  28 + Finder(std::shared_ptr<InputSource> is, std::string const& str) :
29 29 is(is),
30 30 str(str)
31 31 {
... ... @@ -36,7 +36,7 @@ class Finder: public InputSource::Finder
36 36 virtual bool check();
37 37  
38 38 private:
39   - PointerHolder<InputSource> is;
  39 + std::shared_ptr<InputSource> is;
40 40 std::string str;
41 41 };
42 42  
... ... @@ -117,7 +117,7 @@ sanitize(std::string const&amp; value)
117 117 static void
118 118 try_skipping(
119 119 QPDFTokenizer& tokenizer,
120   - PointerHolder<InputSource> is,
  120 + std::shared_ptr<InputSource> is,
121 121 size_t max_len,
122 122 char const* what,
123 123 Finder& f)
... ... @@ -132,7 +132,7 @@ try_skipping(
132 132  
133 133 static void
134 134 dump_tokens(
135   - PointerHolder<InputSource> is,
  135 + std::shared_ptr<InputSource> is,
136 136 std::string const& label,
137 137 size_t max_len,
138 138 bool include_ignorable,
... ... @@ -191,12 +191,12 @@ dump_tokens(
191 191 static void
192 192 process(char const* filename, bool include_ignorable, size_t max_len)
193 193 {
194   - PointerHolder<InputSource> is;
  194 + std::shared_ptr<InputSource> is;
195 195  
196 196 // Tokenize file, skipping streams
197 197 FileInputSource* fis = new FileInputSource();
198 198 fis->setFilename(filename);
199   - is = PointerHolder<InputSource>(fis);
  199 + is = std::shared_ptr<InputSource>(fis);
200 200 dump_tokens(is, "FILE", max_len, include_ignorable, true, false);
201 201  
202 202 // Tokenize content streams, skipping inline images
... ... @@ -214,7 +214,7 @@ process(char const* filename, bool include_ignorable, size_t max_len)
214 214 auto content_data = plb.getBufferSharedPointer();
215 215 BufferInputSource* bis =
216 216 new BufferInputSource("content data", content_data.get());
217   - is = PointerHolder<InputSource>(bis);
  217 + is = std::shared_ptr<InputSource>(bis);
218 218 dump_tokens(
219 219 is,
220 220 "PAGE " + QUtil::int_to_string(pageno),
... ... @@ -231,11 +231,11 @@ process(char const* filename, bool include_ignorable, size_t max_len)
231 231 ++iter) {
232 232 if ((*iter).isStream() && (*iter).getDict().getKey("/Type").isName() &&
233 233 (*iter).getDict().getKey("/Type").getName() == "/ObjStm") {
234   - PointerHolder<Buffer> b =
  234 + std::shared_ptr<Buffer> b =
235 235 (*iter).getStreamData(qpdf_dl_specialized);
236 236 BufferInputSource* bis =
237 237 new BufferInputSource("object stream data", b.get());
238   - is = PointerHolder<InputSource>(bis);
  238 + is = std::shared_ptr<InputSource>(bis);
239 239 dump_tokens(
240 240 is,
241 241 "OBJECT STREAM " + QUtil::int_to_string((*iter).getObjectID()),
... ...
zlib-flate/zlib-flate.cc
... ... @@ -59,8 +59,8 @@ main(int argc, char* argv[])
59 59  
60 60 QUtil::binary_stdout();
61 61 QUtil::binary_stdin();
62   - auto out = make_pointer_holder<Pl_StdioFile>("stdout", stdout);
63   - auto flate = make_pointer_holder<Pl_Flate>("flate", out.get(), action);
  62 + auto out = std::make_shared<Pl_StdioFile>("stdout", stdout);
  63 + auto flate = std::make_shared<Pl_Flate>("flate", out.get(), action);
64 64 bool warn = false;
65 65 flate->setWarnCallback([&warn](char const* msg, int code) {
66 66 warn = true;
... ...