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 #pragma clang diagnostic ignored "-Wtautological-compare"
30 
31 template <std::size_t N>
32 std::bitset<N>
make_bitset()33 make_bitset()
34 {
35     std::bitset<N> v;
36     for (std::size_t i = 0; i < N; ++i)
37         v[i] = static_cast<bool>(std::rand() & 1);
38     return v;
39 }
40 
41 template <std::size_t N>
test_to_string()42 void test_to_string()
43 {
44 {
45     std::bitset<N> v = make_bitset<N>();
46     {
47     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >();
48     for (std::size_t i = 0; i < N; ++i)
49         if (v[i])
50             assert(s[N - 1 - i] == '1');
51         else
52             assert(s[N - 1 - i] == '0');
53     }
54     {
55     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >();
56     for (std::size_t i = 0; i < N; ++i)
57         if (v[i])
58             assert(s[N - 1 - i] == '1');
59         else
60             assert(s[N - 1 - i] == '0');
61     }
62     {
63     std::string s = v.template to_string<char>();
64     for (std::size_t i = 0; i < N; ++i)
65         if (v[i])
66             assert(s[N - 1 - i] == '1');
67         else
68             assert(s[N - 1 - i] == '0');
69     }
70     {
71     std::string s = v.to_string();
72     for (std::size_t i = 0; i < N; ++i)
73         if (v[i])
74             assert(s[N - 1 - i] == '1');
75         else
76             assert(s[N - 1 - i] == '0');
77     }
78 }
79 {
80     std::bitset<N> v = make_bitset<N>();
81     {
82     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0');
83     for (std::size_t i = 0; i < N; ++i)
84         if (v[i])
85             assert(s[N - 1 - i] == '1');
86         else
87             assert(s[N - 1 - i] == '0');
88     }
89     {
90     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0');
91     for (std::size_t i = 0; i < N; ++i)
92         if (v[i])
93             assert(s[N - 1 - i] == '1');
94         else
95             assert(s[N - 1 - i] == '0');
96     }
97     {
98     std::string s = v.template to_string<char>('0');
99     for (std::size_t i = 0; i < N; ++i)
100         if (v[i])
101             assert(s[N - 1 - i] == '1');
102         else
103             assert(s[N - 1 - i] == '0');
104     }
105     {
106     std::string s = v.to_string('0');
107     for (std::size_t i = 0; i < N; ++i)
108         if (v[i])
109             assert(s[N - 1 - i] == '1');
110         else
111             assert(s[N - 1 - i] == '0');
112     }
113 }
114 {
115     std::bitset<N> v = make_bitset<N>();
116     {
117     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0', '1');
118     for (std::size_t i = 0; i < N; ++i)
119         if (v[i])
120             assert(s[N - 1 - i] == '1');
121         else
122             assert(s[N - 1 - i] == '0');
123     }
124     {
125     std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0', '1');
126     for (std::size_t i = 0; i < N; ++i)
127         if (v[i])
128             assert(s[N - 1 - i] == '1');
129         else
130             assert(s[N - 1 - i] == '0');
131     }
132     {
133     std::string s = v.template to_string<char>('0', '1');
134     for (std::size_t i = 0; i < N; ++i)
135         if (v[i])
136             assert(s[N - 1 - i] == '1');
137         else
138             assert(s[N - 1 - i] == '0');
139     }
140     {
141     std::string s = v.to_string('0', '1');
142     for (std::size_t i = 0; i < N; ++i)
143         if (v[i])
144             assert(s[N - 1 - i] == '1');
145         else
146             assert(s[N - 1 - i] == '0');
147     }
148 }
149 }
150 
main()151 int main()
152 {
153     test_to_string<0>();
154     test_to_string<1>();
155     test_to_string<31>();
156     test_to_string<32>();
157     test_to_string<33>();
158     test_to_string<63>();
159     test_to_string<64>();
160     test_to_string<65>();
161     test_to_string<1000>();
162 }
163