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