Commit 5e791513c0ad2d0ff68a253f223f753e4523638a
1 parent
ac4b5e65
Refactor `PipelinePopper` to improve encapsulation by moving it into `Pl_stack` as a nested class.
Showing
2 changed files
with
68 additions
and
71 deletions
include/qpdf/QPDFWriter.hh
| @@ -447,7 +447,6 @@ class QPDFWriter | @@ -447,7 +447,6 @@ class QPDFWriter | ||
| 447 | struct NewObject; | 447 | struct NewObject; |
| 448 | class ObjTable; | 448 | class ObjTable; |
| 449 | class NewObjTable; | 449 | class NewObjTable; |
| 450 | - class PipelinePopper; | ||
| 451 | 450 | ||
| 452 | private: | 451 | private: |
| 453 | // flags used by unparseObject | 452 | // flags used by unparseObject |
libqpdf/QPDFWriter.cc
| @@ -52,61 +52,59 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress) | @@ -52,61 +52,59 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress) | ||
| 52 | 52 | ||
| 53 | namespace | 53 | namespace |
| 54 | { | 54 | { |
| 55 | - class Pl_stack; | ||
| 56 | -} | ||
| 57 | - | ||
| 58 | -// A PipelinePopper is normally returned by Pl_stack::activate, or, if necessary, a reference to a | ||
| 59 | -// PipelinePopper instance can be passed into activate. When the PipelinePopper goes out of scope, | ||
| 60 | -// the pipeline stack is popped. This causes finish to be called on the current pipeline and the | ||
| 61 | -// pipeline stack to be popped until the top of stack is a previous active top of stack, and | ||
| 62 | -// restores the pipeline to that point. It deletes any pipelines that it pops. | ||
| 63 | -class QPDFWriter::PipelinePopper | ||
| 64 | -{ | ||
| 65 | - public: | ||
| 66 | - PipelinePopper(Pl_stack& stack) : | ||
| 67 | - stack(&stack) | ||
| 68 | - { | ||
| 69 | - } | ||
| 70 | - PipelinePopper() = default; | ||
| 71 | - PipelinePopper(PipelinePopper const&) = delete; | ||
| 72 | - PipelinePopper(PipelinePopper&& other) noexcept | ||
| 73 | - { | ||
| 74 | - // For MSVC, default pops the stack | ||
| 75 | - if (this != &other) { | ||
| 76 | - stack = other.stack; | ||
| 77 | - stack_id = other.stack_id; | ||
| 78 | - other.stack = nullptr; | ||
| 79 | - other.stack_id = 0; | ||
| 80 | - }; | ||
| 81 | - } | ||
| 82 | - PipelinePopper& operator=(PipelinePopper const&) = delete; | ||
| 83 | - PipelinePopper& | ||
| 84 | - operator=(PipelinePopper&& other) noexcept | 55 | + class Pl_stack |
| 85 | { | 56 | { |
| 86 | - // For MSVC, default pops the stack | ||
| 87 | - if (this != &other) { | ||
| 88 | - stack = other.stack; | ||
| 89 | - stack_id = other.stack_id; | ||
| 90 | - other.stack = nullptr; | ||
| 91 | - other.stack_id = 0; | ||
| 92 | - }; | ||
| 93 | - return *this; | ||
| 94 | - } | 57 | + // A pipeline Popper is normally returned by Pl_stack::activate, or, if necessary, a |
| 58 | + // reference to a Popper instance can be passed into activate. When the Popper goes out of | ||
| 59 | + // scope, the pipeline stack is popped. This causes finish to be called on the current | ||
| 60 | + // pipeline and the pipeline stack to be popped until the top of stack is a previous active | ||
| 61 | + // top of stack and restores the pipeline to that point. It deletes any pipelines that it | ||
| 62 | + // pops. | ||
| 63 | + class Popper | ||
| 64 | + { | ||
| 65 | + friend class Pl_stack; | ||
| 95 | 66 | ||
| 96 | - ~PipelinePopper(); | 67 | + public: |
| 68 | + Popper() = default; | ||
| 69 | + Popper(Popper const&) = delete; | ||
| 70 | + Popper(Popper&& other) noexcept | ||
| 71 | + { | ||
| 72 | + // For MSVC, default pops the stack | ||
| 73 | + if (this != &other) { | ||
| 74 | + stack = other.stack; | ||
| 75 | + stack_id = other.stack_id; | ||
| 76 | + other.stack = nullptr; | ||
| 77 | + other.stack_id = 0; | ||
| 78 | + }; | ||
| 79 | + } | ||
| 80 | + Popper& operator=(Popper const&) = delete; | ||
| 81 | + Popper& | ||
| 82 | + operator=(Popper&& other) noexcept | ||
| 83 | + { | ||
| 84 | + // For MSVC, default pops the stack | ||
| 85 | + if (this != &other) { | ||
| 86 | + stack = other.stack; | ||
| 87 | + stack_id = other.stack_id; | ||
| 88 | + other.stack = nullptr; | ||
| 89 | + other.stack_id = 0; | ||
| 90 | + }; | ||
| 91 | + return *this; | ||
| 92 | + } | ||
| 97 | 93 | ||
| 98 | - // Manually pop pipeline from the pipeline stack. | ||
| 99 | - void pop(); | 94 | + ~Popper(); |
| 100 | 95 | ||
| 101 | - Pl_stack* stack{nullptr}; | ||
| 102 | - unsigned long stack_id{0}; | ||
| 103 | -}; | 96 | + // Manually pop pipeline from the pipeline stack. |
| 97 | + void pop(); | ||
| 104 | 98 | ||
| 105 | -namespace | ||
| 106 | -{ | ||
| 107 | - class Pl_stack | ||
| 108 | - { | ||
| 109 | - using PP = QPDFWriter::PipelinePopper; | 99 | + private: |
| 100 | + Popper(Pl_stack& stack) : | ||
| 101 | + stack(&stack) | ||
| 102 | + { | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + Pl_stack* stack{nullptr}; | ||
| 106 | + unsigned long stack_id{0}; | ||
| 107 | + }; | ||
| 110 | 108 | ||
| 111 | public: | 109 | public: |
| 112 | Pl_stack(pl::Count*& top, std::unique_ptr<Pl_MD5>& md5_pipeline) : | 110 | Pl_stack(pl::Count*& top, std::unique_ptr<Pl_MD5>& md5_pipeline) : |
| @@ -115,7 +113,7 @@ namespace | @@ -115,7 +113,7 @@ namespace | ||
| 115 | { | 113 | { |
| 116 | } | 114 | } |
| 117 | 115 | ||
| 118 | - PP | 116 | + Popper |
| 119 | popper() | 117 | popper() |
| 120 | { | 118 | { |
| 121 | return {*this}; | 119 | return {*this}; |
| @@ -129,41 +127,41 @@ namespace | @@ -129,41 +127,41 @@ namespace | ||
| 129 | stack.emplace_back(std::move(c)); | 127 | stack.emplace_back(std::move(c)); |
| 130 | } | 128 | } |
| 131 | 129 | ||
| 132 | - PP | 130 | + Popper |
| 133 | activate(std::string& str) | 131 | activate(std::string& str) |
| 134 | { | 132 | { |
| 135 | - PP pp{*this}; | 133 | + Popper pp{*this}; |
| 136 | activate(pp, str); | 134 | activate(pp, str); |
| 137 | return pp; | 135 | return pp; |
| 138 | } | 136 | } |
| 139 | 137 | ||
| 140 | void | 138 | void |
| 141 | - activate(PP& pp, std::string& str) | 139 | + activate(Popper& pp, std::string& str) |
| 142 | { | 140 | { |
| 143 | activate(pp, false, &str, nullptr); | 141 | activate(pp, false, &str, nullptr); |
| 144 | } | 142 | } |
| 145 | 143 | ||
| 146 | void | 144 | void |
| 147 | - activate(PP& pp, std::unique_ptr<pl::Link> link) | 145 | + activate(Popper& pp, std::unique_ptr<pl::Link> link) |
| 148 | { | 146 | { |
| 149 | count_buffer.clear(); | 147 | count_buffer.clear(); |
| 150 | activate(pp, false, &count_buffer, std::move(link)); | 148 | activate(pp, false, &count_buffer, std::move(link)); |
| 151 | } | 149 | } |
| 152 | 150 | ||
| 153 | - PP | 151 | + Popper |
| 154 | activate( | 152 | activate( |
| 155 | bool discard = false, | 153 | bool discard = false, |
| 156 | std::string* str = nullptr, | 154 | std::string* str = nullptr, |
| 157 | std::unique_ptr<pl::Link> link = nullptr) | 155 | std::unique_ptr<pl::Link> link = nullptr) |
| 158 | { | 156 | { |
| 159 | - PP pp{*this}; | 157 | + Popper pp{*this}; |
| 160 | activate(pp, discard, str, std::move(link)); | 158 | activate(pp, discard, str, std::move(link)); |
| 161 | return pp; | 159 | return pp; |
| 162 | } | 160 | } |
| 163 | 161 | ||
| 164 | void | 162 | void |
| 165 | activate( | 163 | activate( |
| 166 | - PP& pp, | 164 | + Popper& pp, |
| 167 | bool discard = false, | 165 | bool discard = false, |
| 168 | std::string* str = nullptr, | 166 | std::string* str = nullptr, |
| 169 | std::unique_ptr<pl::Link> link = nullptr) | 167 | std::unique_ptr<pl::Link> link = nullptr) |
| @@ -184,7 +182,7 @@ namespace | @@ -184,7 +182,7 @@ namespace | ||
| 184 | ++next_stack_id; | 182 | ++next_stack_id; |
| 185 | } | 183 | } |
| 186 | void | 184 | void |
| 187 | - activate_md5(PP& pp) | 185 | + activate_md5(Popper& pp) |
| 188 | { | 186 | { |
| 189 | qpdf_assert_debug(!md5_pipeline); | 187 | qpdf_assert_debug(!md5_pipeline); |
| 190 | qpdf_assert_debug(md5_id == 0); | 188 | qpdf_assert_debug(md5_id == 0); |
| @@ -201,8 +199,14 @@ namespace | @@ -201,8 +199,14 @@ namespace | ||
| 201 | } | 199 | } |
| 202 | 200 | ||
| 203 | void | 201 | void |
| 204 | - pop(unsigned long stack_id) | 202 | + clear_buffer() |
| 203 | + { | ||
| 204 | + count_buffer.clear(); | ||
| 205 | + } | ||
| 205 | 206 | ||
| 207 | + private: | ||
| 208 | + void | ||
| 209 | + pop(unsigned long stack_id) | ||
| 206 | { | 210 | { |
| 207 | if (!stack_id) { | 211 | if (!stack_id) { |
| 208 | return; | 212 | return; |
| @@ -212,7 +216,7 @@ namespace | @@ -212,7 +216,7 @@ namespace | ||
| 212 | qpdf_assert_debug(stack.back().get() == top); | 216 | qpdf_assert_debug(stack.back().get() == top); |
| 213 | // It used to be possible for this assertion to fail if writeLinearized exits by | 217 | // It used to be possible for this assertion to fail if writeLinearized exits by |
| 214 | // exception when deterministic ID. There are no longer any cases in which two | 218 | // exception when deterministic ID. There are no longer any cases in which two |
| 215 | - // dynamically allocated PipelinePopper objects ever exist at the same time, so the | 219 | + // dynamically allocated pipeline Popper objects ever exist at the same time, so the |
| 216 | // assertion will fail if they get popped out of order from automatic destruction. | 220 | // assertion will fail if they get popped out of order from automatic destruction. |
| 217 | qpdf_assert_debug(top->id() == stack_id); | 221 | qpdf_assert_debug(top->id() == stack_id); |
| 218 | if (stack_id == md5_id) { | 222 | if (stack_id == md5_id) { |
| @@ -223,13 +227,6 @@ namespace | @@ -223,13 +227,6 @@ namespace | ||
| 223 | top = stack.back().get(); | 227 | top = stack.back().get(); |
| 224 | } | 228 | } |
| 225 | 229 | ||
| 226 | - void | ||
| 227 | - clear_buffer() | ||
| 228 | - { | ||
| 229 | - count_buffer.clear(); | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | - private: | ||
| 233 | std::vector<std::unique_ptr<pl::Count>> stack; | 230 | std::vector<std::unique_ptr<pl::Count>> stack; |
| 234 | pl::Count*& top; | 231 | pl::Count*& top; |
| 235 | std::unique_ptr<Pl_MD5>& md5_pipeline; | 232 | std::unique_ptr<Pl_MD5>& md5_pipeline; |
| @@ -237,9 +234,10 @@ namespace | @@ -237,9 +234,10 @@ namespace | ||
| 237 | unsigned long md5_id{0}; | 234 | unsigned long md5_id{0}; |
| 238 | std::string count_buffer; | 235 | std::string count_buffer; |
| 239 | }; | 236 | }; |
| 237 | + | ||
| 240 | } // namespace | 238 | } // namespace |
| 241 | 239 | ||
| 242 | -QPDFWriter::PipelinePopper::~PipelinePopper() | 240 | +Pl_stack::Popper::~Popper() |
| 243 | { | 241 | { |
| 244 | if (stack) { | 242 | if (stack) { |
| 245 | stack->pop(stack_id); | 243 | stack->pop(stack_id); |
| @@ -247,7 +245,7 @@ QPDFWriter::PipelinePopper::~PipelinePopper() | @@ -247,7 +245,7 @@ QPDFWriter::PipelinePopper::~PipelinePopper() | ||
| 247 | } | 245 | } |
| 248 | 246 | ||
| 249 | void | 247 | void |
| 250 | -QPDFWriter::PipelinePopper::pop() | 248 | +Pl_stack::Popper::pop() |
| 251 | { | 249 | { |
| 252 | if (stack) { | 250 | if (stack) { |
| 253 | stack->pop(stack_id); | 251 | stack->pop(stack_id); |