summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/record_data.h
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2014-11-07 19:42:38 -0500
committerMathias Stearn <mathias@10gen.com>2014-11-10 13:57:10 -0500
commit7fa44159b371c106cd9742174ff13a22aab5ce21 (patch)
treea44f75b1cb2ca56e42ff69e66f04041dd9f99c9d /src/mongo/db/storage/record_data.h
parent0c1c8e9e31bfe24aaf4ad77090dd835eae125265 (diff)
downloadmongo-7fa44159b371c106cd9742174ff13a22aab5ce21.tar.gz
SERVER-16048 Eliminate double copy and most ref-counting with RecordData
Diffstat (limited to 'src/mongo/db/storage/record_data.h')
-rw-r--r--src/mongo/db/storage/record_data.h26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/mongo/db/storage/record_data.h b/src/mongo/db/storage/record_data.h
index e617f342a8c..a819422f0ab 100644
--- a/src/mongo/db/storage/record_data.h
+++ b/src/mongo/db/storage/record_data.h
@@ -30,9 +30,8 @@
#pragma once
-#include <boost/shared_array.hpp>
-
#include "mongo/bson/bsonobj.h"
+#include "mongo/util/shared_buffer.h"
namespace mongo {
@@ -45,10 +44,11 @@ namespace mongo {
class RecordData {
public:
RecordData() : _data( NULL ), _size( 0 ) {}
- RecordData(const char* data, int size): _data(data), _size(size), _dataPtr() { }
+ RecordData(const char* data, int size): _data(data), _size(size) { }
- RecordData(const char* data, int size, const boost::shared_array<char>& dataPtr)
- : _data(data), _size(size), _dataPtr(dataPtr) { }
+ RecordData(SharedBuffer ownedData, int size)
+ : _data(ownedData.get()), _size(size), _ownedData(ownedData.moveFrom()) {
+ }
const char* data() const { return _data; }
@@ -57,15 +57,23 @@ namespace mongo {
/**
* Returns true if this owns its own memory, and false otherwise
*/
- bool isOwned() const { return _dataPtr.get(); }
+ bool isOwned() const { return _ownedData.get(); }
+
+ SharedBuffer releaseBuffer() {
+ return _ownedData.moveFrom();
+ }
+
+ BSONObj toBson() const { return isOwned() ? BSONObj(_ownedData) : BSONObj(_data); }
+
+ BSONObj releaseToBson() { return isOwned() ? BSONObj(releaseBuffer()) : BSONObj(_data); }
- // TODO eliminate double-copying
- BSONObj toBson() const { return isOwned() ? BSONObj(_data).getOwned() : BSONObj(_data); }
+ // TODO uncomment once we require compilers that support overloading for rvalue this.
+ // BSONObj toBson() && { return releaseToBson(); }
private:
const char* _data;
int _size;
- boost::shared_array<char> _dataPtr;
+ SharedBuffer _ownedData;
};
} // namespace mongo