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 9*88ffc727SLouis Dionne // UNSUPPORTED: libcpp-has-no-localization 10*88ffc727SLouis Dionne 115a83710eSEric Fiselier // <complex> 125a83710eSEric Fiselier 135a83710eSEric Fiselier // template<class T, class charT, class traits> 145a83710eSEric Fiselier // basic_ostream<charT, traits>& 155a83710eSEric Fiselier // operator<<(basic_ostream<charT, traits>& o, const complex<T>& x); 165a83710eSEric Fiselier 175a83710eSEric Fiselier #include <complex> 185a83710eSEric Fiselier #include <sstream> 195a83710eSEric Fiselier #include <cassert> 205a83710eSEric Fiselier 217fc6a556SMarshall Clow #include "test_macros.h" 227fc6a556SMarshall Clow 23ec0dc70eSLouis Dionne int main(int, char**) { 24ec0dc70eSLouis Dionne // Basic test 255a83710eSEric Fiselier { 26ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 275a83710eSEric Fiselier std::ostringstream os; 285a83710eSEric Fiselier os << c; 295a83710eSEric Fiselier assert(os.str() == "(1,2)"); 30aa0b991dSAntonio Sanchez } 31ec0dc70eSLouis Dionne 32ec0dc70eSLouis Dionne // Test with various widths. 33ec0dc70eSLouis Dionne // In particular, make sure the width() is 0 after the operation, which 34ec0dc70eSLouis Dionne // should be the case because [complex.ops] says about operator<< for complex: 35ec0dc70eSLouis Dionne // 36ec0dc70eSLouis Dionne // Effects: Inserts the complex number x onto the stream o as if it 37ec0dc70eSLouis Dionne // were implemented as follows: 38ec0dc70eSLouis Dionne // 39ec0dc70eSLouis Dionne // basic_ostringstream<charT, traits> s; 40ec0dc70eSLouis Dionne // s.flags(o.flags()); 41ec0dc70eSLouis Dionne // s.imbue(o.getloc()); 42ec0dc70eSLouis Dionne // s.precision(o.precision()); 43ec0dc70eSLouis Dionne // s << '(' << x.real() << "," << x.imag() << ')'; 44ec0dc70eSLouis Dionne // return o << s.str(); 45ec0dc70eSLouis Dionne // 46ec0dc70eSLouis Dionne // Since operator<< for std::string sets o.width(0), operator<< for 47ec0dc70eSLouis Dionne // std::complex should do the same. 48aa0b991dSAntonio Sanchez { 49ec0dc70eSLouis Dionne for (int width = 0; width <= 5; ++width) { 50ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 51ec0dc70eSLouis Dionne std::ostringstream os; 52ec0dc70eSLouis Dionne os.width(width); 53ec0dc70eSLouis Dionne os.fill('_'); 54ec0dc70eSLouis Dionne os << c; 55ec0dc70eSLouis Dionne assert(os.width() == 0); 56ec0dc70eSLouis Dionne assert(os.str() == "(1,2)"); 57ec0dc70eSLouis Dionne } 58ec0dc70eSLouis Dionne { 59ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 60ec0dc70eSLouis Dionne std::ostringstream os; 61ec0dc70eSLouis Dionne os.width(6); 62ec0dc70eSLouis Dionne os.fill('_'); 63ec0dc70eSLouis Dionne os << c; 64ec0dc70eSLouis Dionne assert(os.width() == 0); 65ec0dc70eSLouis Dionne assert(os.str() == "_(1,2)"); 66ec0dc70eSLouis Dionne } 67ec0dc70eSLouis Dionne { 68ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 69ec0dc70eSLouis Dionne std::ostringstream os; 70ec0dc70eSLouis Dionne os.width(7); 71ec0dc70eSLouis Dionne os.fill('_'); 72ec0dc70eSLouis Dionne os << c; 73ec0dc70eSLouis Dionne assert(os.width() == 0); 74ec0dc70eSLouis Dionne assert(os.str() == "__(1,2)"); 75ec0dc70eSLouis Dionne } 76ec0dc70eSLouis Dionne { 77ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 78aa0b991dSAntonio Sanchez std::ostringstream os; 79aa0b991dSAntonio Sanchez os.width(8); 80aa0b991dSAntonio Sanchez os.fill('_'); 81aa0b991dSAntonio Sanchez os << c; 82ec0dc70eSLouis Dionne assert(os.width() == 0); 83aa0b991dSAntonio Sanchez assert(os.str() == "___(1,2)"); 84aa0b991dSAntonio Sanchez } 85ec0dc70eSLouis Dionne // Insert something after the complex and make sure the 86ec0dc70eSLouis Dionne // stream's width has been reset as expected. 87ec0dc70eSLouis Dionne { 88ec0dc70eSLouis Dionne std::complex<double> const c(1, 2); 89ec0dc70eSLouis Dionne std::ostringstream os; 90ec0dc70eSLouis Dionne os.width(8); 91ec0dc70eSLouis Dionne os.fill('_'); 92ec0dc70eSLouis Dionne os << c; 93ec0dc70eSLouis Dionne assert(os.width() == 0); 94ec0dc70eSLouis Dionne 95ec0dc70eSLouis Dionne os << "hello"; 96ec0dc70eSLouis Dionne assert(os.str() == "___(1,2)hello"); 97ec0dc70eSLouis Dionne } 98ec0dc70eSLouis Dionne 99ec0dc70eSLouis Dionne // Test with numbers that result in different output lengths, to 100ec0dc70eSLouis Dionne // make sure we handle custom width() correctly. 101ec0dc70eSLouis Dionne { 102ec0dc70eSLouis Dionne std::complex<double> const c(123, 456); 103ec0dc70eSLouis Dionne std::ostringstream os; 104ec0dc70eSLouis Dionne os.width(4); 105ec0dc70eSLouis Dionne os.fill('_'); 106ec0dc70eSLouis Dionne os << c; 107ec0dc70eSLouis Dionne assert(os.width() == 0); 108ec0dc70eSLouis Dionne assert(os.str() == "(123,456)"); 109ec0dc70eSLouis Dionne } 110ec0dc70eSLouis Dionne { 111ec0dc70eSLouis Dionne std::complex<double> const c(123, 456); 112ec0dc70eSLouis Dionne std::ostringstream os; 113ec0dc70eSLouis Dionne os.width(12); 114ec0dc70eSLouis Dionne os.fill('_'); 115ec0dc70eSLouis Dionne os << c; 116ec0dc70eSLouis Dionne assert(os.width() == 0); 117ec0dc70eSLouis Dionne assert(os.str() == "___(123,456)"); 118ec0dc70eSLouis Dionne 119ec0dc70eSLouis Dionne os << "hello"; 120ec0dc70eSLouis Dionne assert(os.str() == "___(123,456)hello"); 121ec0dc70eSLouis Dionne } 122ec0dc70eSLouis Dionne 123ec0dc70eSLouis Dionne // Make sure left fill behaves correctly 124ec0dc70eSLouis Dionne { 125ec0dc70eSLouis Dionne std::complex<double> const c(123, 456); 126ec0dc70eSLouis Dionne std::ostringstream os; 127ec0dc70eSLouis Dionne os.width(12); 128ec0dc70eSLouis Dionne os.fill('_'); 129ec0dc70eSLouis Dionne os << std::left << c; 130ec0dc70eSLouis Dionne assert(os.width() == 0); 131ec0dc70eSLouis Dionne assert(os.str() == "(123,456)___"); 132ec0dc70eSLouis Dionne 133ec0dc70eSLouis Dionne os << "xy"; 134ec0dc70eSLouis Dionne assert(os.str() == "(123,456)___xy"); 135ec0dc70eSLouis Dionne } 136ec0dc70eSLouis Dionne } 1372df59c50SJF Bastien 1382df59c50SJF Bastien return 0; 1395a83710eSEric Fiselier } 140