15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <complex>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template<class T, class charT, class traits>
125a83710eSEric Fiselier //   basic_ostream<charT, traits>&
135a83710eSEric Fiselier //   operator<<(basic_ostream<charT, traits>& o, const complex<T>& x);
145a83710eSEric Fiselier 
155a83710eSEric Fiselier #include <complex>
165a83710eSEric Fiselier #include <sstream>
175a83710eSEric Fiselier #include <cassert>
185a83710eSEric Fiselier 
197fc6a556SMarshall Clow #include "test_macros.h"
207fc6a556SMarshall Clow 
21*ec0dc70eSLouis Dionne int main(int, char**) {
22*ec0dc70eSLouis Dionne     // Basic test
235a83710eSEric Fiselier     {
24*ec0dc70eSLouis Dionne         std::complex<double> const c(1, 2);
255a83710eSEric Fiselier         std::ostringstream os;
265a83710eSEric Fiselier         os << c;
275a83710eSEric Fiselier         assert(os.str() == "(1,2)");
28aa0b991dSAntonio Sanchez     }
29*ec0dc70eSLouis Dionne 
30*ec0dc70eSLouis Dionne     // Test with various widths.
31*ec0dc70eSLouis Dionne     // In particular, make sure the width() is 0 after the operation, which
32*ec0dc70eSLouis Dionne     // should be the case because [complex.ops] says about operator<< for complex:
33*ec0dc70eSLouis Dionne     //
34*ec0dc70eSLouis Dionne     //   Effects: Inserts the complex number x onto the stream o as if it
35*ec0dc70eSLouis Dionne     //   were implemented as follows:
36*ec0dc70eSLouis Dionne     //
37*ec0dc70eSLouis Dionne     //     basic_ostringstream<charT, traits> s;
38*ec0dc70eSLouis Dionne     //     s.flags(o.flags());
39*ec0dc70eSLouis Dionne     //     s.imbue(o.getloc());
40*ec0dc70eSLouis Dionne     //     s.precision(o.precision());
41*ec0dc70eSLouis Dionne     //     s << '(' << x.real() << "," << x.imag() << ')';
42*ec0dc70eSLouis Dionne     //     return o << s.str();
43*ec0dc70eSLouis Dionne     //
44*ec0dc70eSLouis Dionne     // Since operator<< for std::string sets o.width(0), operator<< for
45*ec0dc70eSLouis Dionne     // std::complex should do the same.
46aa0b991dSAntonio Sanchez     {
47*ec0dc70eSLouis Dionne         for (int width = 0; width <= 5; ++width) {
48*ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
49*ec0dc70eSLouis Dionne             std::ostringstream os;
50*ec0dc70eSLouis Dionne             os.width(width);
51*ec0dc70eSLouis Dionne             os.fill('_');
52*ec0dc70eSLouis Dionne             os << c;
53*ec0dc70eSLouis Dionne             assert(os.width() == 0);
54*ec0dc70eSLouis Dionne             assert(os.str() == "(1,2)");
55*ec0dc70eSLouis Dionne         }
56*ec0dc70eSLouis Dionne         {
57*ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
58*ec0dc70eSLouis Dionne             std::ostringstream os;
59*ec0dc70eSLouis Dionne             os.width(6);
60*ec0dc70eSLouis Dionne             os.fill('_');
61*ec0dc70eSLouis Dionne             os << c;
62*ec0dc70eSLouis Dionne             assert(os.width() == 0);
63*ec0dc70eSLouis Dionne             assert(os.str() == "_(1,2)");
64*ec0dc70eSLouis Dionne         }
65*ec0dc70eSLouis Dionne         {
66*ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
67*ec0dc70eSLouis Dionne             std::ostringstream os;
68*ec0dc70eSLouis Dionne             os.width(7);
69*ec0dc70eSLouis Dionne             os.fill('_');
70*ec0dc70eSLouis Dionne             os << c;
71*ec0dc70eSLouis Dionne             assert(os.width() == 0);
72*ec0dc70eSLouis Dionne             assert(os.str() == "__(1,2)");
73*ec0dc70eSLouis Dionne         }
74*ec0dc70eSLouis Dionne         {
75*ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
76aa0b991dSAntonio Sanchez             std::ostringstream os;
77aa0b991dSAntonio Sanchez             os.width(8);
78aa0b991dSAntonio Sanchez             os.fill('_');
79aa0b991dSAntonio Sanchez             os << c;
80*ec0dc70eSLouis Dionne             assert(os.width() == 0);
81aa0b991dSAntonio Sanchez             assert(os.str() == "___(1,2)");
82aa0b991dSAntonio Sanchez         }
83*ec0dc70eSLouis Dionne         // Insert something after the complex and make sure the
84*ec0dc70eSLouis Dionne         // stream's width has been reset as expected.
85*ec0dc70eSLouis Dionne         {
86*ec0dc70eSLouis Dionne             std::complex<double> const c(1, 2);
87*ec0dc70eSLouis Dionne             std::ostringstream os;
88*ec0dc70eSLouis Dionne             os.width(8);
89*ec0dc70eSLouis Dionne             os.fill('_');
90*ec0dc70eSLouis Dionne             os << c;
91*ec0dc70eSLouis Dionne             assert(os.width() == 0);
92*ec0dc70eSLouis Dionne 
93*ec0dc70eSLouis Dionne             os << "hello";
94*ec0dc70eSLouis Dionne             assert(os.str() == "___(1,2)hello");
95*ec0dc70eSLouis Dionne         }
96*ec0dc70eSLouis Dionne 
97*ec0dc70eSLouis Dionne         // Test with numbers that result in different output lengths, to
98*ec0dc70eSLouis Dionne         // make sure we handle custom width() correctly.
99*ec0dc70eSLouis Dionne         {
100*ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
101*ec0dc70eSLouis Dionne             std::ostringstream os;
102*ec0dc70eSLouis Dionne             os.width(4);
103*ec0dc70eSLouis Dionne             os.fill('_');
104*ec0dc70eSLouis Dionne             os << c;
105*ec0dc70eSLouis Dionne             assert(os.width() == 0);
106*ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)");
107*ec0dc70eSLouis Dionne         }
108*ec0dc70eSLouis Dionne         {
109*ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
110*ec0dc70eSLouis Dionne             std::ostringstream os;
111*ec0dc70eSLouis Dionne             os.width(12);
112*ec0dc70eSLouis Dionne             os.fill('_');
113*ec0dc70eSLouis Dionne             os << c;
114*ec0dc70eSLouis Dionne             assert(os.width() == 0);
115*ec0dc70eSLouis Dionne             assert(os.str() == "___(123,456)");
116*ec0dc70eSLouis Dionne 
117*ec0dc70eSLouis Dionne             os << "hello";
118*ec0dc70eSLouis Dionne             assert(os.str() == "___(123,456)hello");
119*ec0dc70eSLouis Dionne         }
120*ec0dc70eSLouis Dionne 
121*ec0dc70eSLouis Dionne         // Make sure left fill behaves correctly
122*ec0dc70eSLouis Dionne         {
123*ec0dc70eSLouis Dionne             std::complex<double> const c(123, 456);
124*ec0dc70eSLouis Dionne             std::ostringstream os;
125*ec0dc70eSLouis Dionne             os.width(12);
126*ec0dc70eSLouis Dionne             os.fill('_');
127*ec0dc70eSLouis Dionne             os << std::left << c;
128*ec0dc70eSLouis Dionne             assert(os.width() == 0);
129*ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)___");
130*ec0dc70eSLouis Dionne 
131*ec0dc70eSLouis Dionne             os << "xy";
132*ec0dc70eSLouis Dionne             assert(os.str() == "(123,456)___xy");
133*ec0dc70eSLouis Dionne         }
134*ec0dc70eSLouis Dionne     }
1352df59c50SJF Bastien 
1362df59c50SJF Bastien     return 0;
1375a83710eSEric Fiselier }
138