summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2016-08-26 18:40:48 -0400
committerMathias Stearn <mathias@10gen.com>2016-08-29 15:34:16 -0400
commitd6d263b0c8fe21ac9bfca561515dccbe02f72e64 (patch)
tree60ea8f2057591bb46967276ca7d6f34588446f9c
parent2374ef1a3ac05e3fca39485ef4824f559b1c082c (diff)
downloadmongo-d6d263b0c8fe21ac9bfca561515dccbe02f72e64.tar.gz
SERVER-23100 Allow StringBuilder and str::stream to return StringData views
Avoids unnecessary copies when passing result to a function.
-rw-r--r--src/mongo/bson/bsonobjbuilder.h10
-rw-r--r--src/mongo/bson/util/builder.h9
-rw-r--r--src/mongo/db/namespace_string.cpp5
-rw-r--r--src/mongo/db/pipeline/document_source_out.cpp4
-rw-r--r--src/mongo/util/mongoutils/str.h4
5 files changed, 20 insertions, 12 deletions
diff --git a/src/mongo/bson/bsonobjbuilder.h b/src/mongo/bson/bsonobjbuilder.h
index 224deb1ee6d..72fd2d901af 100644
--- a/src/mongo/bson/bsonobjbuilder.h
+++ b/src/mongo/bson/bsonobjbuilder.h
@@ -428,7 +428,7 @@ public:
return appendCode(fieldName, code.code);
}
- /** Append a std::string element.
+ /** Append a string element.
@param sz size includes terminating null character */
BSONObjBuilder& append(StringData fieldName, const char* str, int sz) {
_b.appendNum((char)String);
@@ -437,15 +437,11 @@ public:
_b.appendBuf(str, sz);
return *this;
}
- /** Append a std::string element */
+ /** Append a string element */
BSONObjBuilder& append(StringData fieldName, const char* str) {
return append(fieldName, str, (int)strlen(str) + 1);
}
- /** Append a std::string element */
- BSONObjBuilder& append(StringData fieldName, const std::string& str) {
- return append(fieldName, str.c_str(), (int)str.size() + 1);
- }
- /** Append a std::string element */
+ /** Append a string element */
BSONObjBuilder& append(StringData fieldName, StringData str) {
_b.appendNum((char)String);
_b.appendStr(fieldName);
diff --git a/src/mongo/bson/util/builder.h b/src/mongo/bson/util/builder.h
index e6d29ceb175..258e63cf52d 100644
--- a/src/mongo/bson/util/builder.h
+++ b/src/mongo/bson/util/builder.h
@@ -446,6 +446,15 @@ public:
return std::string(_buf.buf(), _buf.l);
}
+ /**
+ * Returns a view of this string without copying.
+ *
+ * WARNING: the view expires when this StringBuilder is modified or destroyed.
+ */
+ StringData stringData() const {
+ return StringData(_buf.buf(), _buf.l);
+ }
+
/** size of current std::string */
int len() const {
return _buf.l;
diff --git a/src/mongo/db/namespace_string.cpp b/src/mongo/db/namespace_string.cpp
index 1128552ca67..95d600fb27b 100644
--- a/src/mongo/db/namespace_string.cpp
+++ b/src/mongo/db/namespace_string.cpp
@@ -117,15 +117,14 @@ bool NamespaceString::isListIndexesCursorNS() const {
}
NamespaceString NamespaceString::makeListCollectionsNSS(StringData dbName) {
- NamespaceString nss(dbName, StringData(str::stream() << listCollectionsCursorCol));
+ NamespaceString nss(dbName, listCollectionsCursorCol);
dassert(nss.isValid());
dassert(nss.isListCollectionsCursorNS());
return nss;
}
NamespaceString NamespaceString::makeListIndexesNSS(StringData dbName, StringData collectionName) {
- NamespaceString nss(dbName,
- StringData(str::stream() << listIndexesCursorNSPrefix << collectionName));
+ NamespaceString nss(dbName, str::stream() << listIndexesCursorNSPrefix << collectionName);
dassert(nss.isValid());
dassert(nss.isListIndexesCursorNS());
return nss;
diff --git a/src/mongo/db/pipeline/document_source_out.cpp b/src/mongo/db/pipeline/document_source_out.cpp
index 4bfc5e14247..b4ff0aa19bc 100644
--- a/src/mongo/db/pipeline/document_source_out.cpp
+++ b/src/mongo/db/pipeline/document_source_out.cpp
@@ -131,8 +131,8 @@ boost::optional<Document> DocumentSourceOut::getNext() {
// We will write all results into a temporary collection, then rename the temporary collection
// to be the target collection once we are done.
- _tempNs = NamespaceString(StringData(str::stream() << _outputNs.db() << ".tmp.agg_out."
- << aggOutCounter.addAndFetch(1)));
+ _tempNs = NamespaceString(str::stream() << _outputNs.db() << ".tmp.agg_out."
+ << aggOutCounter.addAndFetch(1));
auto renameCommandObj =
BSON("renameCollection" << _tempNs.ns() << "to" << _outputNs.ns() << "dropTarget" << true);
diff --git a/src/mongo/util/mongoutils/str.h b/src/mongo/util/mongoutils/str.h
index 2aefea6f261..c1967003506 100644
--- a/src/mongo/util/mongoutils/str.h
+++ b/src/mongo/util/mongoutils/str.h
@@ -39,6 +39,7 @@
#include <sstream>
#include <string>
+#include "mongo/base/string_data.h"
#include "mongo/bson/util/builder.h"
namespace mongoutils {
@@ -64,6 +65,9 @@ public:
operator std::string() const {
return ss.str();
}
+ operator mongo::StringData() const {
+ return ss.stringData();
+ }
};
inline bool startsWith(const char* str, const char* prefix) {