1 //===----------------------------------------------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // test:
11
12 // template <class charT, class traits, class Allocator>
13 // basic_string<charT, traits, Allocator>
14 // to_string(charT zero = charT('0'), charT one = charT('1')) const;
15 //
16 // template <class charT, class traits>
17 // basic_string<charT, traits, allocator<charT> > to_string() const;
18 //
19 // template <class charT>
20 // basic_string<charT, char_traits<charT>, allocator<charT> > to_string() const;
21 //
22 // basic_string<char, char_traits<char>, allocator<char> > to_string() const;
23
24 #include <bitset>
25 #include <string>
26 #include <cstdlib>
27 #include <cassert>
28
29 #include "test_macros.h"
30
31 #if defined(TEST_COMPILER_CLANG)
32 #pragma clang diagnostic ignored "-Wtautological-compare"
33 #elif defined(TEST_COMPILER_C1XX)
34 #pragma warning(disable: 6294) // Ill-defined for-loop: initial condition does not satisfy test. Loop body not executed.
35 #endif
36
37 template <std::size_t N>
38 std::bitset<N>
make_bitset()39 make_bitset()
40 {
41 std::bitset<N> v;
42 for (std::size_t i = 0; i < N; ++i)
43 v[i] = static_cast<bool>(std::rand() & 1);
44 return v;
45 }
46
47 template <std::size_t N>
test_to_string()48 void test_to_string()
49 {
50 {
51 std::bitset<N> v = make_bitset<N>();
52 {
53 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >();
54 for (std::size_t i = 0; i < N; ++i)
55 if (v[i])
56 assert(s[N - 1 - i] == '1');
57 else
58 assert(s[N - 1 - i] == '0');
59 }
60 {
61 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >();
62 for (std::size_t i = 0; i < N; ++i)
63 if (v[i])
64 assert(s[N - 1 - i] == '1');
65 else
66 assert(s[N - 1 - i] == '0');
67 }
68 {
69 std::string s = v.template to_string<char>();
70 for (std::size_t i = 0; i < N; ++i)
71 if (v[i])
72 assert(s[N - 1 - i] == '1');
73 else
74 assert(s[N - 1 - i] == '0');
75 }
76 {
77 std::string s = v.to_string();
78 for (std::size_t i = 0; i < N; ++i)
79 if (v[i])
80 assert(s[N - 1 - i] == '1');
81 else
82 assert(s[N - 1 - i] == '0');
83 }
84 }
85 {
86 std::bitset<N> v = make_bitset<N>();
87 {
88 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0');
89 for (std::size_t i = 0; i < N; ++i)
90 if (v[i])
91 assert(s[N - 1 - i] == '1');
92 else
93 assert(s[N - 1 - i] == '0');
94 }
95 {
96 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0');
97 for (std::size_t i = 0; i < N; ++i)
98 if (v[i])
99 assert(s[N - 1 - i] == '1');
100 else
101 assert(s[N - 1 - i] == '0');
102 }
103 {
104 std::string s = v.template to_string<char>('0');
105 for (std::size_t i = 0; i < N; ++i)
106 if (v[i])
107 assert(s[N - 1 - i] == '1');
108 else
109 assert(s[N - 1 - i] == '0');
110 }
111 {
112 std::string s = v.to_string('0');
113 for (std::size_t i = 0; i < N; ++i)
114 if (v[i])
115 assert(s[N - 1 - i] == '1');
116 else
117 assert(s[N - 1 - i] == '0');
118 }
119 }
120 {
121 std::bitset<N> v = make_bitset<N>();
122 {
123 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0', '1');
124 for (std::size_t i = 0; i < N; ++i)
125 if (v[i])
126 assert(s[N - 1 - i] == '1');
127 else
128 assert(s[N - 1 - i] == '0');
129 }
130 {
131 std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0', '1');
132 for (std::size_t i = 0; i < N; ++i)
133 if (v[i])
134 assert(s[N - 1 - i] == '1');
135 else
136 assert(s[N - 1 - i] == '0');
137 }
138 {
139 std::string s = v.template to_string<char>('0', '1');
140 for (std::size_t i = 0; i < N; ++i)
141 if (v[i])
142 assert(s[N - 1 - i] == '1');
143 else
144 assert(s[N - 1 - i] == '0');
145 }
146 {
147 std::string s = v.to_string('0', '1');
148 for (std::size_t i = 0; i < N; ++i)
149 if (v[i])
150 assert(s[N - 1 - i] == '1');
151 else
152 assert(s[N - 1 - i] == '0');
153 }
154 }
155 }
156
main()157 int main()
158 {
159 test_to_string<0>();
160 test_to_string<1>();
161 test_to_string<31>();
162 test_to_string<32>();
163 test_to_string<33>();
164 test_to_string<63>();
165 test_to_string<64>();
166 test_to_string<65>();
167 test_to_string<1000>();
168 }
169