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