diff --git a/include/qpdf/Buffer.hh b/include/qpdf/Buffer.hh index cce0f95..e3f6841 100644 --- a/include/qpdf/Buffer.hh +++ b/include/qpdf/Buffer.hh @@ -66,6 +66,11 @@ class Buffer QPDF_DLL Buffer copy() const; + // Move the content of the Buffer. After calling this method, the Buffer will be empty if the + // buffer owns its memory. Otherwise, the Buffer will be unchanged. + QPDF_DLL + std::string move(); + private: class Members; diff --git a/libqpdf/Buffer.cc b/libqpdf/Buffer.cc index db4e886..14f64f2 100644 --- a/libqpdf/Buffer.cc +++ b/libqpdf/Buffer.cc @@ -2,8 +2,6 @@ #include -#include - class Buffer::Members { friend class Buffer; @@ -96,3 +94,17 @@ Buffer::copy() const } return {std::string(m->buf, m->size)}; } + +std::string +Buffer::move() +{ + if (m->size == 0) { + return {}; + } + if (!m->str.empty()) { + m->size = 0; + m->buf = nullptr; + return std::move(m->str); + } + return {m->buf, m->size}; +} diff --git a/libtests/buffer.cc b/libtests/buffer.cc index 295597c..9792713 100644 --- a/libtests/buffer.cc +++ b/libtests/buffer.cc @@ -35,6 +35,12 @@ main() assert(bc2p[0] == 'R'); assert(bc2p[1] == 'W'); + // Test move method + auto s1 = bc1.move(); + assert(bc1.getBuffer() == nullptr); + assert(bc1.getSize() == 0); + assert(s1 == "RW"); + // Test Buffer(std:string&&) Buffer bc3("QW"); unsigned char* bc3p = bc3.getBuffer();