[libcxx-commits] [libcxx] ec0dc70 - [libc++] Add more tests for operator<< on std::complex
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Oct 19 10:25:54 PDT 2020
Author: Louis Dionne
Date: 2020-10-19T13:23:59-04:00
New Revision: ec0dc70efca825199cc5955cf813170a12e5c6a9
URL: https://github.com/llvm/llvm-project/commit/ec0dc70efca825199cc5955cf813170a12e5c6a9
DIFF: https://github.com/llvm/llvm-project/commit/ec0dc70efca825199cc5955cf813170a12e5c6a9.diff
LOG: [libc++] Add more tests for operator<< on std::complex
Added:
Modified:
libcxx/include/complex
libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/include/complex b/libcxx/include/complex
index 36c66db50e68..ec35f8ab27c3 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -227,14 +227,6 @@ template<class T> complex<T> sqrt (const complex<T>&);
template<class T> complex<T> tan (const complex<T>&);
template<class T> complex<T> tanh (const complex<T>&);
-template<class T, class charT, class traits>
- basic_istream<charT, traits>&
- operator>>(basic_istream<charT, traits>& is, complex<T>& x);
-
-template<class T, class charT, class traits>
- basic_ostream<charT, traits>&
- operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
-
} // std
*/
diff --git a/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp b/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp
index cfdedda52e60..690a16b800ee 100644
--- a/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp
+++ b/libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp
@@ -18,22 +18,120 @@
#include "test_macros.h"
-int main(int, char**)
-{
+int main(int, char**) {
+ // Basic test
{
- std::complex<double> c(1, 2);
+ std::complex<double> const c(1, 2);
std::ostringstream os;
os << c;
assert(os.str() == "(1,2)");
}
+
+ // Test with various widths.
+ // In particular, make sure the width() is 0 after the operation, which
+ // should be the case because [complex.ops] says about operator<< for complex:
+ //
+ // Effects: Inserts the complex number x onto the stream o as if it
+ // were implemented as follows:
+ //
+ // basic_ostringstream<charT, traits> s;
+ // s.flags(o.flags());
+ // s.imbue(o.getloc());
+ // s.precision(o.precision());
+ // s << '(' << x.real() << "," << x.imag() << ')';
+ // return o << s.str();
+ //
+ // Since operator<< for std::string sets o.width(0), operator<< for
+ // std::complex should do the same.
{
- std::complex<double> c(1, 2);
- std::ostringstream os;
- os.width(8);
- os.fill('_');
- os << c;
- assert(os.str() == "___(1,2)");
+ for (int width = 0; width <= 5; ++width) {
+ std::complex<double> const c(1, 2);
+ std::ostringstream os;
+ os.width(width);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "(1,2)");
+ }
+ {
+ std::complex<double> const c(1, 2);
+ std::ostringstream os;
+ os.width(6);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "_(1,2)");
+ }
+ {
+ std::complex<double> const c(1, 2);
+ std::ostringstream os;
+ os.width(7);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "__(1,2)");
+ }
+ {
+ std::complex<double> const c(1, 2);
+ std::ostringstream os;
+ os.width(8);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "___(1,2)");
+ }
+ // Insert something after the complex and make sure the
+ // stream's width has been reset as expected.
+ {
+ std::complex<double> const c(1, 2);
+ std::ostringstream os;
+ os.width(8);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+
+ os << "hello";
+ assert(os.str() == "___(1,2)hello");
+ }
+
+ // Test with numbers that result in
diff erent output lengths, to
+ // make sure we handle custom width() correctly.
+ {
+ std::complex<double> const c(123, 456);
+ std::ostringstream os;
+ os.width(4);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "(123,456)");
+ }
+ {
+ std::complex<double> const c(123, 456);
+ std::ostringstream os;
+ os.width(12);
+ os.fill('_');
+ os << c;
+ assert(os.width() == 0);
+ assert(os.str() == "___(123,456)");
+
+ os << "hello";
+ assert(os.str() == "___(123,456)hello");
+ }
+
+ // Make sure left fill behaves correctly
+ {
+ std::complex<double> const c(123, 456);
+ std::ostringstream os;
+ os.width(12);
+ os.fill('_');
+ os << std::left << c;
+ assert(os.width() == 0);
+ assert(os.str() == "(123,456)___");
+
+ os << "xy";
+ assert(os.str() == "(123,456)___xy");
+ }
}
- return 0;
+ return 0;
}
More information about the libcxx-commits
mailing list