Commit 9f7f9496ed26a5490b9f2b847806282cd1ae1146

Authored by m-holger
1 parent 4c71c868

Add Buffer constructors taking std::string parameters

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 {