[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