1// 2000-02-10 2// Petter Urkedal <petter@matfys.lth.se> 3 4// Copyright (C) 2000, 2003 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 2, 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 COPYING. If not, write to the Free 19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 20// USA. 21 22 23#include <iostream> 24#include <string> 25#include <sstream> 26#include <complex> 27#include <testsuite_hooks.h> 28#include <cmath> 29 30template<typename R> 31inline bool flteq(R x, R y) 32{ 33 if (x == R(0)) return y == R(0); 34 else return std::fabs(x-y) < 1e-6*std::fabs(x); 35} 36 37template<typename R> 38int 39test_good(std::string str, R x, R y) 40{ 41 bool test __attribute__((unused)) = true; 42 std::complex<R> z; 43 char ch; 44 std::istringstream iss(str); 45 iss >> z >> ch; 46 VERIFY( iss.good() ); 47 VERIFY( flteq(z.real(), x) ); 48 VERIFY( flteq(z.imag(), y) ); 49 VERIFY( ch == '#' ); 50 return 0; 51} 52 53template<typename R> 54int 55test_fail(std::string str) 56{ 57 bool test __attribute__((unused)) = true; 58 std::complex<R> z; 59 std::istringstream iss(str); 60 iss >> z; 61 VERIFY( iss.fail() && !iss.bad() ); 62 return 0; 63} 64 65template<typename R> 66int 67testall() 68{ 69 test_good<R>("(-1.1,3.7)#", -1.1, 3.7); 70 test_good<R>("( .7e6 , \n-3.1)#", .7e6, -3.1); 71 test_good<R>("(\t0,-1)#", 0.0, -1.0); 72 test_good<R>("(-3.14)#", -3.14, 0.0); 73 test_good<R>("-.1#", -.1, 0.0); 74 test_good<R>(" ( -2.7e3 )#", -2.7e3, 0.0); 75 test_good<R>(" -.1#", -.1, 0.0); 76 test_fail<R>("(a,1)"); 77 test_fail<R>("(,1)"); 78 test_fail<R>("(1,a)"); 79 test_fail<R>("(1, )"); 80 test_fail<R>("|1,1)"); 81 test_fail<R>("(1|1)"); 82 test_fail<R>("(1,1|"); 83 return 0; 84} 85 86// libstdc++/2970 87void test01() 88{ 89 using namespace std; 90 bool test __attribute__((unused)) = true; 91 92 complex<float> cf01(-1.1, -333.2); 93 stringstream ss; 94 ss << cf01; 95 string str = ss.str(); 96 VERIFY( str == "(-1.1,-333.2)" ); 97} 98 99// libstdc++/2985 100struct gnu_char_traits : public std::char_traits<char> 101{ }; 102 103typedef std::basic_ostringstream<char, gnu_char_traits> gnu_sstream; 104template class std::basic_string<char, gnu_char_traits, std::allocator<char> >; 105 106void test02() 107{ 108 bool test __attribute__((unused)) = true; 109 110 // Construct locale with specialized facets. 111 typedef gnu_sstream::__num_put_type numput_type; 112 typedef gnu_sstream::__num_get_type numget_type; 113 std::locale loc_c = std::locale::classic(); 114 std::locale loc_1(loc_c, new numput_type); 115 std::locale loc_2(loc_1, new numget_type); 116 VERIFY( std::has_facet<numput_type>(loc_2) ); 117 VERIFY( std::has_facet<numget_type>(loc_2) ); 118 119 gnu_sstream sstr; 120 sstr.imbue(loc_2); 121 122 123 std::complex<double> x(3, 4); 124 sstr << x; 125 VERIFY( sstr.str() == "(3,4)" ); 126} 127 128int 129main() 130{ 131 testall<float>(); 132 testall<double>(); 133 testall<long double>(); 134 135 test01(); 136 test02(); 137 138 return 0; 139} 140 141 142 143 144