Commit 9f7f9496ed26a5490b9f2b847806282cd1ae1146
1 parent
4c71c868
Add Buffer constructors taking std::string parameters
Showing
4 changed files
with
85 additions
and
7 deletions
include/qpdf/Buffer.hh
| ... | ... | @@ -24,6 +24,7 @@ |
| 24 | 24 | |
| 25 | 25 | #include <cstddef> |
| 26 | 26 | #include <memory> |
| 27 | +#include <string> | |
| 27 | 28 | |
| 28 | 29 | class Buffer |
| 29 | 30 | { |
| ... | ... | @@ -35,11 +36,15 @@ class Buffer |
| 35 | 36 | // object is destroyed. |
| 36 | 37 | QPDF_DLL |
| 37 | 38 | Buffer(size_t size); |
| 39 | + QPDF_DLL | |
| 40 | + Buffer(std::string&& content); | |
| 38 | 41 | |
| 39 | 42 | // Create a Buffer object whose memory is owned by the caller and will not be freed when the |
| 40 | 43 | // Buffer is destroyed. |
| 41 | 44 | QPDF_DLL |
| 42 | 45 | Buffer(unsigned char* buf, size_t size); |
| 46 | + QPDF_DLL | |
| 47 | + Buffer(std::string& content); | |
| 43 | 48 | |
| 44 | 49 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer(Buffer const&); |
| 45 | 50 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer& |
| ... | ... | @@ -75,8 +80,10 @@ class Buffer |
| 75 | 80 | |
| 76 | 81 | private: |
| 77 | 82 | Members(size_t size, unsigned char* buf, bool own_memory); |
| 83 | + Members(std::string&& content); | |
| 78 | 84 | Members(Members const&) = delete; |
| 79 | 85 | |
| 86 | + std::string str; | |
| 80 | 87 | bool own_memory; |
| 81 | 88 | size_t size; |
| 82 | 89 | unsigned char* buf; | ... | ... |
libqpdf/Buffer.cc
| ... | ... | @@ -27,6 +27,14 @@ Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) : |
| 27 | 27 | } |
| 28 | 28 | } |
| 29 | 29 | |
| 30 | +Buffer::Members::Members(std::string&& content) : | |
| 31 | + str(std::move(content)), | |
| 32 | + own_memory(false), | |
| 33 | + size(str.size()), | |
| 34 | + buf(reinterpret_cast<unsigned char*>(str.data())) | |
| 35 | +{ | |
| 36 | +} | |
| 37 | + | |
| 30 | 38 | Buffer::Members::~Members() |
| 31 | 39 | { |
| 32 | 40 | if (this->own_memory) { |
| ... | ... | @@ -44,11 +52,21 @@ Buffer::Buffer(size_t size) : |
| 44 | 52 | { |
| 45 | 53 | } |
| 46 | 54 | |
| 55 | +Buffer::Buffer(std::string&& content) : | |
| 56 | + m(new Members(std::move(content))) | |
| 57 | +{ | |
| 58 | +} | |
| 59 | + | |
| 47 | 60 | Buffer::Buffer(unsigned char* buf, size_t size) : |
| 48 | 61 | m(new Members(size, buf, false)) |
| 49 | 62 | { |
| 50 | 63 | } |
| 51 | 64 | |
| 65 | +Buffer::Buffer(std::string& content) : | |
| 66 | + m(new Members(content.size(), reinterpret_cast<unsigned char*>(content.data()), false)) | |
| 67 | +{ | |
| 68 | +} | |
| 69 | + | |
| 52 | 70 | Buffer::Buffer(Buffer const& rhs) |
| 53 | 71 | { |
| 54 | 72 | assert(test_mode); | ... | ... |
libqpdf/Pl_Buffer.cc
| ... | ... | @@ -42,13 +42,7 @@ Pl_Buffer::getBuffer() |
| 42 | 42 | if (!m->ready) { |
| 43 | 43 | throw std::logic_error("Pl_Buffer::getBuffer() called when not ready"); |
| 44 | 44 | } |
| 45 | - | |
| 46 | - auto size = m->data.size(); | |
| 47 | - auto* b = new Buffer(size); | |
| 48 | - if (size > 0) { | |
| 49 | - unsigned char* p = b->getBuffer(); | |
| 50 | - memcpy(p, m->data.data(), size); | |
| 51 | - } | |
| 45 | + auto* b = new Buffer(std::move(m->data)); | |
| 52 | 46 | m->data.clear(); |
| 53 | 47 | return b; |
| 54 | 48 | } | ... | ... |
libtests/buffer.cc
| ... | ... | @@ -35,6 +35,21 @@ main() |
| 35 | 35 | assert(bc2p != bc1p); |
| 36 | 36 | assert(bc2p[0] == 'R'); |
| 37 | 37 | assert(bc2p[1] == 'W'); |
| 38 | + | |
| 39 | + // Test Buffer(std:string&&) | |
| 40 | + Buffer bc3("QW"); | |
| 41 | + unsigned char* bc3p = bc3.getBuffer(); | |
| 42 | + Buffer bc4(bc3.copy()); | |
| 43 | + bc3p[0] = 'R'; | |
| 44 | + unsigned char* bc4p = bc4.getBuffer(); | |
| 45 | + assert(bc4p != bc3p); | |
| 46 | + assert(bc4p[0] == 'Q'); | |
| 47 | + assert(bc4p[1] == 'W'); | |
| 48 | + bc4 = bc3.copy(); | |
| 49 | + bc4p = bc4.getBuffer(); | |
| 50 | + assert(bc4p != bc3p); | |
| 51 | + assert(bc4p[0] == 'R'); | |
| 52 | + assert(bc4p[1] == 'W'); | |
| 38 | 53 | } |
| 39 | 54 | |
| 40 | 55 | #ifdef _MSC_VER |
| ... | ... | @@ -62,6 +77,37 @@ main() |
| 62 | 77 | assert(bc2p != bc1p); |
| 63 | 78 | assert(bc2p[0] == 'R'); |
| 64 | 79 | assert(bc2p[1] == 'W'); |
| 80 | + | |
| 81 | + // Test Buffer(std:string&&) | |
| 82 | + Buffer bc3("QW"); | |
| 83 | + unsigned char* bc3p = bc3.getBuffer(); | |
| 84 | + Buffer bc4(bc3); | |
| 85 | + bc3p[0] = 'R'; | |
| 86 | + unsigned char* bc4p = bc4.getBuffer(); | |
| 87 | + assert(bc4p != bc3p); | |
| 88 | + assert(bc4p[0] == 'Q'); | |
| 89 | + assert(bc4p[1] == 'W'); | |
| 90 | + bc4 = bc3; | |
| 91 | + bc4p = bc4.getBuffer(); | |
| 92 | + assert(bc4p != bc3p); | |
| 93 | + assert(bc2p[0] == 'R'); | |
| 94 | + assert(bc2p[1] == 'W'); | |
| 95 | + | |
| 96 | + // Test Buffer(std:string&) | |
| 97 | + std::string s{"QW"}; | |
| 98 | + Buffer bc5(s); | |
| 99 | + unsigned char* bc5p = bc5.getBuffer(); | |
| 100 | + Buffer bc6(bc5); | |
| 101 | + bc5p[0] = 'R'; | |
| 102 | + unsigned char* bc6p = bc6.getBuffer(); | |
| 103 | + assert(bc6p != bc5p); | |
| 104 | + assert(bc6p[0] == 'Q'); | |
| 105 | + assert(bc6p[1] == 'W'); | |
| 106 | + bc6 = bc5; | |
| 107 | + bc6p = bc6.getBuffer(); | |
| 108 | + assert(bc6p != bc5p); | |
| 109 | + assert(bc2p[0] == 'R'); | |
| 110 | + assert(bc2p[1] == 'W'); | |
| 65 | 111 | } |
| 66 | 112 | #if (defined(__GNUC__) || defined(__clang__)) |
| 67 | 113 | # pragma GCC diagnostic pop |
| ... | ... | @@ -82,6 +128,19 @@ main() |
| 82 | 128 | Buffer bm3 = std::move(bm2); |
| 83 | 129 | unsigned char* bm3p = bm3.getBuffer(); |
| 84 | 130 | assert(bm3p == bm2p); |
| 131 | + | |
| 132 | + // Test Buffer(dtd::string&&) | |
| 133 | + Buffer bm4("QW"); | |
| 134 | + unsigned char* bm4p = bm4.getBuffer(); | |
| 135 | + Buffer bm5(std::move(bm4)); | |
| 136 | + bm4p[0] = 'R'; | |
| 137 | + unsigned char* bm5p = bm5.getBuffer(); | |
| 138 | + assert(bm5p == bm4p); | |
| 139 | + assert(bm5p[0] == 'R'); | |
| 140 | + | |
| 141 | + Buffer bm6 = std::move(bm5); | |
| 142 | + unsigned char* bm6p = bm6.getBuffer(); | |
| 143 | + assert(bm6p == bm5p); | |
| 85 | 144 | } |
| 86 | 145 | |
| 87 | 146 | try { | ... | ... |