summaryrefslogtreecommitdiff
path: root/src/mongo/base
diff options
context:
space:
mode:
authorBilly Donahue <billy.donahue@mongodb.com>2019-07-10 16:03:28 -0400
committerBilly Donahue <billy.donahue@mongodb.com>2019-07-11 01:27:24 -0400
commit7f89b539052ba710714c2cd09fd7276a293dd6cc (patch)
tree885a7fdb20922c529888e3817422f6d9ae86dd7a /src/mongo/base
parent9e9c82143a58754275751282f15d2942ea23dea4 (diff)
downloadmongo-7f89b539052ba710714c2cd09fd7276a293dd6cc.tar.gz
SERVER-32434 operator<<(ostream,StringData)
use boost::string_view for operator<<
Diffstat (limited to 'src/mongo/base')
-rw-r--r--src/mongo/base/string_data.cpp4
-rw-r--r--src/mongo/base/string_data_test.cpp39
2 files changed, 42 insertions, 1 deletions
diff --git a/src/mongo/base/string_data.cpp b/src/mongo/base/string_data.cpp
index 303dd3496a1..e87fdb8b63a 100644
--- a/src/mongo/base/string_data.cpp
+++ b/src/mongo/base/string_data.cpp
@@ -31,10 +31,12 @@
#include <ostream>
+#include <boost/utility/string_view.hpp>
+
namespace mongo {
std::ostream& operator<<(std::ostream& stream, StringData value) {
- return stream.write(value.rawData(), value.size());
+ return stream << boost::string_view(value.rawData(), value.size());
}
} // namespace mongo
diff --git a/src/mongo/base/string_data_test.cpp b/src/mongo/base/string_data_test.cpp
index b0cfac8467a..53994e29efb 100644
--- a/src/mongo/base/string_data_test.cpp
+++ b/src/mongo/base/string_data_test.cpp
@@ -28,6 +28,9 @@
*/
#include <algorithm>
+#include <functional>
+#include <iomanip>
+#include <sstream>
#include <string>
#include <vector>
@@ -325,4 +328,40 @@ TEST(StringDataFmt, Fmt) {
ASSERT_EQUALS("-{}-"_format("abc"_sd), "-abc-");
}
+TEST(Ostream, StringDataMatchesStdString) {
+ const std::string s = "xyz";
+ struct TestCase {
+ int line;
+ std::function<void(std::ostream&)> manip;
+ };
+ const TestCase testCases[] = {
+ {__LINE__, [](std::ostream& os) {}},
+ {__LINE__, [](std::ostream& os) { os << std::setw(5); }},
+ {__LINE__, [](std::ostream& os) { os << std::left << std::setw(5); }},
+ {__LINE__, [](std::ostream& os) { os << std::right << std::setw(5); }},
+ {__LINE__, [](std::ostream& os) { os << std::setfill('.') << std::left << std::setw(5); }},
+ {__LINE__, [](std::ostream& os) { os << std::setfill('.') << std::right << std::setw(5); }},
+ };
+ for (const auto& testCase : testCases) {
+ const std::string location = std::string(" at line:") + std::to_string(testCase.line);
+ struct Experiment {
+ Experiment(std::function<void(std::ostream&)> f) : putter(f) {}
+ std::function<void(std::ostream&)> putter;
+ std::ostringstream os;
+ };
+ Experiment expected{[&](std::ostream& os) { os << s; }};
+ Experiment actual{[&](std::ostream& os) { os << StringData(s); }};
+ for (auto& x : {&expected, &actual}) {
+ x->os << ">>";
+ testCase.manip(x->os);
+ x->putter(x->os);
+ }
+ // ASSERT_EQ(expected.os.str(), actual.os.str()) << location;
+ for (auto& x : {&expected, &actual}) {
+ x->os << "<<";
+ }
+ ASSERT_EQ(expected.os.str(), actual.os.str()) << location;
+ }
+}
+
} // namespace mongo