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,6 +24,7 @@ | ||
| 24 | 24 | ||
| 25 | #include <cstddef> | 25 | #include <cstddef> |
| 26 | #include <memory> | 26 | #include <memory> |
| 27 | +#include <string> | ||
| 27 | 28 | ||
| 28 | class Buffer | 29 | class Buffer |
| 29 | { | 30 | { |
| @@ -35,11 +36,15 @@ class Buffer | @@ -35,11 +36,15 @@ class Buffer | ||
| 35 | // object is destroyed. | 36 | // object is destroyed. |
| 36 | QPDF_DLL | 37 | QPDF_DLL |
| 37 | Buffer(size_t size); | 38 | Buffer(size_t size); |
| 39 | + QPDF_DLL | ||
| 40 | + Buffer(std::string&& content); | ||
| 38 | 41 | ||
| 39 | // Create a Buffer object whose memory is owned by the caller and will not be freed when the | 42 | // Create a Buffer object whose memory is owned by the caller and will not be freed when the |
| 40 | // Buffer is destroyed. | 43 | // Buffer is destroyed. |
| 41 | QPDF_DLL | 44 | QPDF_DLL |
| 42 | Buffer(unsigned char* buf, size_t size); | 45 | Buffer(unsigned char* buf, size_t size); |
| 46 | + QPDF_DLL | ||
| 47 | + Buffer(std::string& content); | ||
| 43 | 48 | ||
| 44 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer(Buffer const&); | 49 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer(Buffer const&); |
| 45 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer& | 50 | [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer& |
| @@ -75,8 +80,10 @@ class Buffer | @@ -75,8 +80,10 @@ class Buffer | ||
| 75 | 80 | ||
| 76 | private: | 81 | private: |
| 77 | Members(size_t size, unsigned char* buf, bool own_memory); | 82 | Members(size_t size, unsigned char* buf, bool own_memory); |
| 83 | + Members(std::string&& content); | ||
| 78 | Members(Members const&) = delete; | 84 | Members(Members const&) = delete; |
| 79 | 85 | ||
| 86 | + std::string str; | ||
| 80 | bool own_memory; | 87 | bool own_memory; |
| 81 | size_t size; | 88 | size_t size; |
| 82 | unsigned char* buf; | 89 | unsigned char* buf; |
libqpdf/Buffer.cc
| @@ -27,6 +27,14 @@ Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) : | @@ -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 | Buffer::Members::~Members() | 38 | Buffer::Members::~Members() |
| 31 | { | 39 | { |
| 32 | if (this->own_memory) { | 40 | if (this->own_memory) { |
| @@ -44,11 +52,21 @@ Buffer::Buffer(size_t size) : | @@ -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 | Buffer::Buffer(unsigned char* buf, size_t size) : | 60 | Buffer::Buffer(unsigned char* buf, size_t size) : |
| 48 | m(new Members(size, buf, false)) | 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 | Buffer::Buffer(Buffer const& rhs) | 70 | Buffer::Buffer(Buffer const& rhs) |
| 53 | { | 71 | { |
| 54 | assert(test_mode); | 72 | assert(test_mode); |
libqpdf/Pl_Buffer.cc
| @@ -42,13 +42,7 @@ Pl_Buffer::getBuffer() | @@ -42,13 +42,7 @@ Pl_Buffer::getBuffer() | ||
| 42 | if (!m->ready) { | 42 | if (!m->ready) { |
| 43 | throw std::logic_error("Pl_Buffer::getBuffer() called when not ready"); | 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 | m->data.clear(); | 46 | m->data.clear(); |
| 53 | return b; | 47 | return b; |
| 54 | } | 48 | } |
libtests/buffer.cc
| @@ -35,6 +35,21 @@ main() | @@ -35,6 +35,21 @@ main() | ||
| 35 | assert(bc2p != bc1p); | 35 | assert(bc2p != bc1p); |
| 36 | assert(bc2p[0] == 'R'); | 36 | assert(bc2p[0] == 'R'); |
| 37 | assert(bc2p[1] == 'W'); | 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 | #ifdef _MSC_VER | 55 | #ifdef _MSC_VER |
| @@ -62,6 +77,37 @@ main() | @@ -62,6 +77,37 @@ main() | ||
| 62 | assert(bc2p != bc1p); | 77 | assert(bc2p != bc1p); |
| 63 | assert(bc2p[0] == 'R'); | 78 | assert(bc2p[0] == 'R'); |
| 64 | assert(bc2p[1] == 'W'); | 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 | #if (defined(__GNUC__) || defined(__clang__)) | 112 | #if (defined(__GNUC__) || defined(__clang__)) |
| 67 | # pragma GCC diagnostic pop | 113 | # pragma GCC diagnostic pop |
| @@ -82,6 +128,19 @@ main() | @@ -82,6 +128,19 @@ main() | ||
| 82 | Buffer bm3 = std::move(bm2); | 128 | Buffer bm3 = std::move(bm2); |
| 83 | unsigned char* bm3p = bm3.getBuffer(); | 129 | unsigned char* bm3p = bm3.getBuffer(); |
| 84 | assert(bm3p == bm2p); | 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 | try { | 146 | try { |