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 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 {
... ...