Commit 6df06185213fad16f6a758014acd0ecd7b1cc751

Authored by m-holger
1 parent 9ff713f4

Add `Buffer::move()` to transfer ownership of buffer content

Refactor `Buffer`: implement `move()` method to enable efficient transfer of content to a string, leaving the buffer empty. Include unit tests for `move()` functionality to ensure correctness. Remove redundant `#include <cstring>` for cleanup.
include/qpdf/Buffer.hh
@@ -66,6 +66,11 @@ class Buffer @@ -66,6 +66,11 @@ class Buffer
66 QPDF_DLL 66 QPDF_DLL
67 Buffer copy() const; 67 Buffer copy() const;
68 68
  69 + // Move the content of the Buffer. After calling this method, the Buffer will be empty if the
  70 + // buffer owns its memory. Otherwise, the Buffer will be unchanged.
  71 + QPDF_DLL
  72 + std::string move();
  73 +
69 private: 74 private:
70 class Members; 75 class Members;
71 76
libqpdf/Buffer.cc
@@ -2,8 +2,6 @@ @@ -2,8 +2,6 @@
2 2
3 #include <qpdf/Buffer.hh> 3 #include <qpdf/Buffer.hh>
4 4
5 -#include <cstring>  
6 -  
7 class Buffer::Members 5 class Buffer::Members
8 { 6 {
9 friend class Buffer; 7 friend class Buffer;
@@ -96,3 +94,17 @@ Buffer::copy() const @@ -96,3 +94,17 @@ Buffer::copy() const
96 } 94 }
97 return {std::string(m->buf, m->size)}; 95 return {std::string(m->buf, m->size)};
98 } 96 }
  97 +
  98 +std::string
  99 +Buffer::move()
  100 +{
  101 + if (m->size == 0) {
  102 + return {};
  103 + }
  104 + if (!m->str.empty()) {
  105 + m->size = 0;
  106 + m->buf = nullptr;
  107 + return std::move(m->str);
  108 + }
  109 + return {m->buf, m->size};
  110 +}
libtests/buffer.cc
@@ -35,6 +35,12 @@ main() @@ -35,6 +35,12 @@ main()
35 assert(bc2p[0] == 'R'); 35 assert(bc2p[0] == 'R');
36 assert(bc2p[1] == 'W'); 36 assert(bc2p[1] == 'W');
37 37
  38 + // Test move method
  39 + auto s1 = bc1.move();
  40 + assert(bc1.getBuffer() == nullptr);
  41 + assert(bc1.getSize() == 0);
  42 + assert(s1 == "RW");
  43 +
38 // Test Buffer(std:string&&) 44 // Test Buffer(std:string&&)
39 Buffer bc3("QW"); 45 Buffer bc3("QW");
40 unsigned char* bc3p = bc3.getBuffer(); 46 unsigned char* bc3p = bc3.getBuffer();