1// 2000-02-10 2// Petter Urkedal <petter@matfys.lth.se> 3 4// Copyright (C) 2000, 2003, 2009 Free Software Foundation 5// 6// This file is part of the GNU ISO C++ Library. This library is free 7// software; you can redistribute it and/or modify it under the 8// terms of the GNU General Public License as published by the 9// Free Software Foundation; either version 3, or (at your option) 10// any later version. 11 12// This library is distributed in the hope that it will be useful, 13// but WITHOUT ANY WARRANTY; without even the implied warranty of 14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15// GNU General Public License for more details. 16 17// You should have received a copy of the GNU General Public License along 18// with this library; see the file COPYING3. If not see 19// <http://www.gnu.org/licenses/>. 20 21 22#include <iostream> 23#include <string> 24#include <sstream> 25#include <complex> 26#include <testsuite_hooks.h> 27#include <cmath> 28 29template<typename R> 30inline bool flteq(R x, R y) 31{ 32 if (x == R(0)) return y == R(0); 33 else return std::fabs(x-y) < 1e-6*std::fabs(x); 34} 35 36template<typename R> 37int 38test_good(std::string str, R x, R y) 39{ 40 bool test __attribute__((unused)) = true; 41 std::complex<R> z; 42 char ch; 43 std::istringstream iss(str); 44 iss >> z >> ch; 45 VERIFY( iss.good() ); 46 VERIFY( flteq(z.real(), x) ); 47 VERIFY( flteq(z.imag(), y) ); 48 VERIFY( ch == '#' ); 49 return 0; 50} 51 52template<typename R> 53int 54test_fail(std::string str) 55{ 56 bool test __attribute__((unused)) = true; 57 std::complex<R> z; 58 std::istringstream iss(str); 59 iss >> z; 60 VERIFY( iss.fail() && !iss.bad() ); 61 return 0; 62} 63 64template<typename R> 65int 66testall() 67{ 68 test_good<R>("(-1.1,3.7)#", -1.1, 3.7); 69 test_good<R>("( .7e6 , \n-3.1)#", .7e6, -3.1); 70 test_good<R>("(\t0,-1)#", 0.0, -1.0); 71 test_good<R>("(-3.14)#", -3.14, 0.0); 72 test_good<R>("-.1#", -.1, 0.0); 73 test_good<R>(" ( -2.7e3 )#", -2.7e3, 0.0); 74 test_good<R>(" -.1#", -.1, 0.0); 75 test_fail<R>("(a,1)"); 76 test_fail<R>("(,1)"); 77 test_fail<R>("(1,a)"); 78 test_fail<R>("(1, )"); 79 test_fail<R>("|1,1)"); 80 test_fail<R>("(1|1)"); 81 test_fail<R>("(1,1|"); 82 return 0; 83} 84 85// libstdc++/2970 86void test01() 87{ 88 using namespace std; 89 bool test __attribute__((unused)) = true; 90 91 complex<float> cf01(-1.1, -333.2); 92 stringstream ss; 93 ss << cf01; 94 string str = ss.str(); 95 VERIFY( str == "(-1.1,-333.2)" ); 96} 97 98// libstdc++/2985 99struct gnu_char_traits : public std::char_traits<char> 100{ }; 101 102typedef std::basic_ostringstream<char, gnu_char_traits> gnu_sstream; 103template class std::basic_string<char, gnu_char_traits, std::allocator<char> >; 104 105void test02() 106{ 107 bool test __attribute__((unused)) = true; 108 109 // Construct locale with specialized facets. 110 typedef gnu_sstream::__num_put_type numput_type; 111 typedef gnu_sstream::__num_get_type numget_type; 112 std::locale loc_c = std::locale::classic(); 113 std::locale loc_1(loc_c, new numput_type); 114 std::locale loc_2(loc_1, new numget_type); 115 VERIFY( std::has_facet<numput_type>(loc_2) ); 116 VERIFY( std::has_facet<numget_type>(loc_2) ); 117 118 gnu_sstream sstr; 119 sstr.imbue(loc_2); 120 121 122 std::complex<double> x(3, 4); 123 sstr << x; 124 VERIFY( sstr.str() == "(3,4)" ); 125} 126 127int 128main() 129{ 130 testall<float>(); 131 testall<double>(); 132 testall<long double>(); 133 134 test01(); 135 test02(); 136 137 return 0; 138} 139