diff options
author | Billy Donahue <billy.donahue@mongodb.com> | 2019-07-10 16:03:28 -0400 |
---|---|---|
committer | Billy Donahue <billy.donahue@mongodb.com> | 2019-07-11 01:27:24 -0400 |
commit | 7f89b539052ba710714c2cd09fd7276a293dd6cc (patch) | |
tree | 885a7fdb20922c529888e3817422f6d9ae86dd7a /src/mongo/base | |
parent | 9e9c82143a58754275751282f15d2942ea23dea4 (diff) | |
download | mongo-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.cpp | 4 | ||||
-rw-r--r-- | src/mongo/base/string_data_test.cpp | 39 |
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 |