aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2016-07-13 06:03:37 -0400
committerShea Levy <shea@shealevy.com>2016-07-13 06:03:37 -0400
commitb33e85229d3ac78242d8bc597cfdaa282486743f (patch)
tree9d09256f79aa610b4c2d344e640b3e9fc6237cad
parentcb5e7254b66a06b78a5659551a6f28fc67e52267 (diff)
Make Buffered{Source,Sink} move-safe
-rw-r--r--src/libutil/serialise.cc27
-rw-r--r--src/libutil/serialise.hh12
2 files changed, 12 insertions, 27 deletions
diff --git a/src/libutil/serialise.cc b/src/libutil/serialise.cc
index 5c45c890f..776308cdf 100644
--- a/src/libutil/serialise.cc
+++ b/src/libutil/serialise.cc
@@ -8,18 +8,9 @@
namespace nix {
-BufferedSink::~BufferedSink()
-{
- /* We can't call flush() here, because C++ for some insane reason
- doesn't allow you to call virtual methods from a destructor. */
- assert(!bufPos);
- delete[] buffer;
-}
-
-
void BufferedSink::operator () (const unsigned char * data, size_t len)
{
- if (!buffer) buffer = new unsigned char[bufSize];
+ if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]);
while (len) {
/* Optimisation: bypass the buffer if the data exceeds the
@@ -32,7 +23,7 @@ void BufferedSink::operator () (const unsigned char * data, size_t len)
/* Otherwise, copy the bytes to the buffer. Flush the buffer
when it's full. */
size_t n = bufPos + len > bufSize ? bufSize - bufPos : len;
- memcpy(buffer + bufPos, data, n);
+ memcpy(buffer.get() + bufPos, data, n);
data += n; bufPos += n; len -= n;
if (bufPos == bufSize) flush();
}
@@ -44,7 +35,7 @@ void BufferedSink::flush()
if (bufPos == 0) return;
size_t n = bufPos;
bufPos = 0; // don't trigger the assert() in ~BufferedSink()
- write(buffer, n);
+ write(buffer.get(), n);
}
@@ -95,21 +86,15 @@ void Source::operator () (unsigned char * data, size_t len)
}
-BufferedSource::~BufferedSource()
-{
- delete[] buffer;
-}
-
-
size_t BufferedSource::read(unsigned char * data, size_t len)
{
- if (!buffer) buffer = new unsigned char[bufSize];
+ if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]);
- if (!bufPosIn) bufPosIn = readUnbuffered(buffer, bufSize);
+ if (!bufPosIn) bufPosIn = readUnbuffered(buffer.get(), bufSize);
/* Copy out the data in the buffer. */
size_t n = len > bufPosIn - bufPosOut ? bufPosIn - bufPosOut : len;
- memcpy(data, buffer + bufPosOut, n);
+ memcpy(data, buffer.get() + bufPosOut, n);
bufPosOut += n;
if (bufPosIn == bufPosOut) bufPosIn = bufPosOut = 0;
return n;
diff --git a/src/libutil/serialise.hh b/src/libutil/serialise.hh
index 892ec4aa3..0139bed1c 100644
--- a/src/libutil/serialise.hh
+++ b/src/libutil/serialise.hh
@@ -1,5 +1,7 @@
#pragma once
+#include <memory>
+
#include "types.hh"
#include "util.hh"
@@ -25,11 +27,10 @@ struct Sink
struct BufferedSink : Sink
{
size_t bufSize, bufPos;
- unsigned char * buffer;
+ std::unique_ptr<unsigned char[]> buffer;
BufferedSink(size_t bufSize = 32 * 1024)
- : bufSize(bufSize), bufPos(0), buffer(0) { }
- ~BufferedSink();
+ : bufSize(bufSize), bufPos(0), buffer(nullptr) { }
void operator () (const unsigned char * data, size_t len) override;
@@ -67,11 +68,10 @@ struct Source
struct BufferedSource : Source
{
size_t bufSize, bufPosIn, bufPosOut;
- unsigned char * buffer;
+ std::unique_ptr<unsigned char[]> buffer;
BufferedSource(size_t bufSize = 32 * 1024)
- : bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(0) { }
- ~BufferedSource();
+ : bufSize(bufSize), bufPosIn(0), bufPosOut(0), buffer(nullptr) { }
size_t read(unsigned char * data, size_t len) override;