Commit 989259892774095f387678ddcf7b5f540ef1f427
1 parent
1a05b099
Refactor stream handling for clarity and efficiency
Replaced shared_ptr with unique_ptr for pipeline management, reducing overhead and improving ownership semantics. Simplified conditional checks and modernized code to enhance readability by removing redundant variables and adjusting pointer usages. This refactor ensures better maintainability and minor performance gains in stream processing.
Showing
1 changed file
with
25 additions
and
25 deletions
libqpdf/QPDF_Stream.cc
| ... | ... | @@ -447,18 +447,17 @@ Stream::pipeStreamData( |
| 447 | 447 | bool specialized_compression = false; |
| 448 | 448 | bool lossy_compression = false; |
| 449 | 449 | bool ignored; |
| 450 | - if (filterp == nullptr) { | |
| 450 | + if (!filterp) { | |
| 451 | 451 | filterp = &ignored; |
| 452 | 452 | } |
| 453 | 453 | bool& filter = *filterp; |
| 454 | - filter = (!((encode_flags == 0) && (decode_level == qpdf_dl_none))); | |
| 455 | - bool success = true; | |
| 454 | + filter = encode_flags || decode_level != qpdf_dl_none; | |
| 456 | 455 | if (filter) { |
| 457 | 456 | filter = filterable(filters, specialized_compression, lossy_compression); |
| 458 | 457 | if ((decode_level < qpdf_dl_all) && lossy_compression) { |
| 459 | 458 | filter = false; |
| 460 | 459 | } |
| 461 | - if ((decode_level < qpdf_dl_specialized) && specialized_compression) { | |
| 460 | + if (decode_level < qpdf_dl_specialized && specialized_compression) { | |
| 462 | 461 | filter = false; |
| 463 | 462 | } |
| 464 | 463 | QTC::TC( |
| ... | ... | @@ -470,7 +469,7 @@ Stream::pipeStreamData( |
| 470 | 469 | : 3); |
| 471 | 470 | } |
| 472 | 471 | |
| 473 | - if (pipeline == nullptr) { | |
| 472 | + if (!pipeline) { | |
| 474 | 473 | QTC::TC("qpdf", "QPDF_Stream pipeStreamData with null pipeline"); |
| 475 | 474 | // Return value is whether we can filter in this case. |
| 476 | 475 | return filter; |
| ... | ... | @@ -479,40 +478,37 @@ Stream::pipeStreamData( |
| 479 | 478 | // Construct the pipeline in reverse order. Force pipelines we create to be deleted when this |
| 480 | 479 | // function finishes. Pipelines created by QPDFStreamFilter objects will be deleted by those |
| 481 | 480 | // objects. |
| 482 | - std::vector<std::shared_ptr<Pipeline>> to_delete; | |
| 481 | + std::vector<std::unique_ptr<Pipeline>> to_delete; | |
| 483 | 482 | |
| 484 | - std::shared_ptr<ContentNormalizer> normalizer; | |
| 485 | - std::shared_ptr<Pipeline> new_pipeline; | |
| 483 | + ContentNormalizer normalizer; | |
| 486 | 484 | if (filter) { |
| 487 | 485 | if (encode_flags & qpdf_ef_compress) { |
| 488 | - new_pipeline = | |
| 489 | - std::make_shared<Pl_Flate>("compress stream", pipeline, Pl_Flate::a_deflate); | |
| 490 | - to_delete.push_back(new_pipeline); | |
| 486 | + auto new_pipeline = | |
| 487 | + std::make_unique<Pl_Flate>("compress stream", pipeline, Pl_Flate::a_deflate); | |
| 491 | 488 | pipeline = new_pipeline.get(); |
| 489 | + to_delete.push_back(std::move(new_pipeline)); | |
| 492 | 490 | } |
| 493 | 491 | |
| 494 | 492 | if (encode_flags & qpdf_ef_normalize) { |
| 495 | - normalizer = std::make_shared<ContentNormalizer>(); | |
| 496 | - new_pipeline = | |
| 497 | - std::make_shared<Pl_QPDFTokenizer>("normalizer", normalizer.get(), pipeline); | |
| 498 | - to_delete.push_back(new_pipeline); | |
| 493 | + auto new_pipeline = | |
| 494 | + std::make_unique<Pl_QPDFTokenizer>("normalizer", &normalizer, pipeline); | |
| 499 | 495 | pipeline = new_pipeline.get(); |
| 496 | + to_delete.push_back(std::move(new_pipeline)); | |
| 500 | 497 | } |
| 501 | 498 | |
| 502 | 499 | for (auto iter = s->token_filters.rbegin(); iter != s->token_filters.rend(); ++iter) { |
| 503 | - new_pipeline = | |
| 504 | - std::make_shared<Pl_QPDFTokenizer>("token filter", (*iter).get(), pipeline); | |
| 505 | - to_delete.push_back(new_pipeline); | |
| 500 | + auto new_pipeline = | |
| 501 | + std::make_unique<Pl_QPDFTokenizer>("token filter", (*iter).get(), pipeline); | |
| 506 | 502 | pipeline = new_pipeline.get(); |
| 503 | + to_delete.push_back(std::move(new_pipeline)); | |
| 507 | 504 | } |
| 508 | 505 | |
| 509 | 506 | for (auto f_iter = filters.rbegin(); f_iter != filters.rend(); ++f_iter) { |
| 510 | - auto decode_pipeline = (*f_iter)->getDecodePipeline(pipeline); | |
| 511 | - if (decode_pipeline) { | |
| 507 | + if (auto decode_pipeline = (*f_iter)->getDecodePipeline(pipeline)) { | |
| 512 | 508 | pipeline = decode_pipeline; |
| 513 | 509 | } |
| 514 | 510 | auto* flate = dynamic_cast<Pl_Flate*>(pipeline); |
| 515 | - if (flate != nullptr) { | |
| 511 | + if (flate) { | |
| 516 | 512 | flate->setWarnCallback([this](char const* msg, int code) { warn(msg); }); |
| 517 | 513 | } |
| 518 | 514 | } |
| ... | ... | @@ -523,6 +519,7 @@ Stream::pipeStreamData( |
| 523 | 519 | pipeline->write(s->stream_data->getBuffer(), s->stream_data->getSize()); |
| 524 | 520 | pipeline->finish(); |
| 525 | 521 | } else if (s->stream_provider.get()) { |
| 522 | + bool success = true; | |
| 526 | 523 | Pl_Count count("stream provider count", pipeline); |
| 527 | 524 | if (s->stream_provider->supportsRetry()) { |
| 528 | 525 | if (!s->stream_provider->provideStreamData( |
| ... | ... | @@ -552,6 +549,9 @@ Stream::pipeStreamData( |
| 552 | 549 | QTC::TC("qpdf", "QPDF_Stream provider length not provided"); |
| 553 | 550 | s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length)); |
| 554 | 551 | } |
| 552 | + if (!success) { | |
| 553 | + return false; | |
| 554 | + } | |
| 555 | 555 | } else if (obj->getParsedOffset() == 0) { |
| 556 | 556 | QTC::TC("qpdf", "QPDF_Stream pipe no stream data"); |
| 557 | 557 | throw std::logic_error("pipeStreamData called for stream with no data"); |
| ... | ... | @@ -568,13 +568,13 @@ Stream::pipeStreamData( |
| 568 | 568 | suppress_warnings, |
| 569 | 569 | will_retry)) { |
| 570 | 570 | filter = false; |
| 571 | - success = false; | |
| 571 | + return false; | |
| 572 | 572 | } |
| 573 | 573 | } |
| 574 | 574 | |
| 575 | - if (filter && (!suppress_warnings) && normalizer.get() && normalizer->anyBadTokens()) { | |
| 575 | + if (filter && !suppress_warnings && normalizer.anyBadTokens()) { | |
| 576 | 576 | warn("content normalization encountered bad tokens"); |
| 577 | - if (normalizer->lastTokenWasBad()) { | |
| 577 | + if (normalizer.lastTokenWasBad()) { | |
| 578 | 578 | QTC::TC("qpdf", "QPDF_Stream bad token at end during normalize"); |
| 579 | 579 | warn( |
| 580 | 580 | "normalized content ended with a bad token; you may be able to resolve this by " |
| ... | ... | @@ -587,7 +587,7 @@ Stream::pipeStreamData( |
| 587 | 587 | "in the manual."); |
| 588 | 588 | } |
| 589 | 589 | |
| 590 | - return success; | |
| 590 | + return true; | |
| 591 | 591 | } |
| 592 | 592 | |
| 593 | 593 | void | ... | ... |