]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/27_io/basic_ostream/inserters_other/wchar_t/4.cc
re PR c++/59378 (Internal compiler error when using __builtin_shuffle in a template...
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 27_io / basic_ostream / inserters_other / wchar_t / 4.cc
1 // Copyright (C) 2005-2013 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // 27.6.2.5.4 basic_ostream character inserters
19
20 #include <ostream>
21 #include <sstream>
22 #include <testsuite_hooks.h>
23
24 class test_buffer_1 : public std::wstreambuf
25 {
26 public:
27 test_buffer_1(const std::wstring& s)
28 : str(s), it(str.begin()) { }
29
30 protected:
31 virtual int_type
32 underflow()
33 { return (it != str.end() ? *it : WEOF); }
34
35 virtual int_type
36 uflow()
37 { return (it != str.end() ? *it++ : WEOF); }
38
39 private:
40 const std::wstring str;
41 std::wstring::const_iterator it;
42 };
43
44
45 class test_buffer_2 : public std::wstreambuf
46 {
47 public:
48 test_buffer_2(const std::wstring& s)
49 : str(s), it(str.begin()) { }
50
51 protected:
52 virtual int_type
53 underflow()
54 { return (it != str.end() ? *it : WEOF); }
55
56 virtual int_type
57 uflow()
58 { return (it != str.end() ? *it++ : WEOF); }
59
60 virtual std::streamsize
61 showmanyc()
62 { return std::distance(it, str.end()); }
63
64 private:
65 const std::wstring str;
66 std::wstring::const_iterator it;
67 };
68
69
70 class test_buffer_3 : public std::wstreambuf
71 {
72 public:
73 test_buffer_3(const std::wstring& s)
74 : str(s), it(str.begin()) { }
75
76 protected:
77 virtual int_type
78 underflow()
79 { return (it != str.end() ? *it : WEOF); }
80
81 virtual int_type
82 uflow()
83 { return (it != str.end() ? *it++ : WEOF); }
84
85 virtual std::streamsize
86 showmanyc()
87 {
88 std::streamsize ret = std::distance(it, str.end());
89 return ret > 0 ? ret : -1;
90 }
91
92 private:
93 const std::wstring str;
94 std::wstring::const_iterator it;
95 };
96
97 class test_buffer_4 : public std::wstreambuf
98 {
99 public:
100 test_buffer_4(const std::wstring& s)
101 : str(s), it(str.begin())
102 {
103 if (it != str.end())
104 {
105 buf[0] = *it++;
106 setg(buf, buf, buf+1);
107 }
108 }
109
110 protected:
111 virtual int_type
112 underflow()
113 { return (it != str.end() ? *it : WEOF); }
114
115 virtual int_type
116 uflow()
117 { return (it != str.end() ? *it++ : WEOF); }
118
119 virtual std::streamsize
120 showmanyc()
121 {
122 std::streamsize ret = std::distance(it, str.end());
123 return ret > 0 ? ret : -1;
124 }
125
126 private:
127 const std::wstring str;
128 std::wstring::const_iterator it;
129 wchar_t buf[1];
130 };
131
132 void test(const std::wstring& str, std::wstreambuf& buf)
133 {
134 bool test __attribute__((unused)) = true;
135
136 std::wostringstream out;
137 std::wistream in(&buf);
138
139 out << in.rdbuf();
140
141 if (out.str() != str)
142 VERIFY( false );
143 }
144
145 // libstdc++/6745
146 // libstdc++/8071
147 // libstdc++/8127
148 // Jonathan Lennox <lennox@cs.columbia.edu>
149 void test05()
150 {
151 std::wstring string_a(L"Hello, world!");
152 std::wstring string_b(L"");
153
154 test_buffer_1 buf1a(string_a);
155 test_buffer_1 buf1b(string_b);
156
157 test_buffer_2 buf2a(string_a);
158 test_buffer_2 buf2b(string_b);
159
160 test_buffer_3 buf3a(string_a);
161 test_buffer_3 buf3b(string_b);
162
163 test_buffer_4 buf4a(string_a);
164 test_buffer_4 buf4b(string_b);
165
166 test(string_a, buf1a);
167 test(string_b, buf1b);
168
169 test(string_a, buf2a);
170 test(string_b, buf2b);
171
172 test(string_a, buf3a);
173 test(string_b, buf3b);
174
175 test(string_a, buf4a);
176 test(string_b, buf4b);
177 }
178
179 int
180 main()
181 {
182 test05();
183 return 0;
184 }