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 bitset(string, pos, n, zero, one);
11 
12 #include <bitset>
13 #include <cassert>
14 
15 #pragma clang diagnostic ignored "-Wtautological-compare"
16 
17 template <std::size_t N>
18 void test_string_ctor()
19 {
20     {
21     try
22     {
23         std::string str("xxx1010101010xxxx");
24         std::bitset<N> v(str, str.size()+1, 10);
25         assert(false);
26     }
27     catch (std::out_of_range&)
28     {
29     }
30     }
31 
32     {
33     try
34     {
35         std::string str("xxx1010101010xxxx");
36         std::bitset<N> v(str, 2, 10);
37         assert(false);
38     }
39     catch (std::invalid_argument&)
40     {
41     }
42     }
43 
44     {
45     std::string str("xxx1010101010xxxx");
46     std::bitset<N> v(str, 3, 10);
47     std::size_t M = std::min<std::size_t>(N, 10);
48     for (std::size_t i = 0; i < M; ++i)
49         assert(v[i] == (str[3 + M - 1 - i] == '1'));
50     for (std::size_t i = 10; i < N; ++i)
51         assert(v[i] == false);
52     }
53 
54     {
55     try
56     {
57         std::string str("xxxbababababaxxxx");
58         std::bitset<N> v(str, 2, 10, 'a', 'b');
59         assert(false);
60     }
61     catch (std::invalid_argument&)
62     {
63     }
64     }
65 
66     {
67     std::string str("xxxbababababaxxxx");
68     std::bitset<N> v(str, 3, 10, 'a', 'b');
69     std::size_t M = std::min<std::size_t>(N, 10);
70     for (std::size_t i = 0; i < M; ++i)
71         assert(v[i] == (str[3 + M - 1 - i] == 'b'));
72     for (std::size_t i = 10; i < N; ++i)
73         assert(v[i] == false);
74     }
75 }
76 
77 int main()
78 {
79     test_string_ctor<0>();
80     test_string_ctor<1>();
81     test_string_ctor<31>();
82     test_string_ctor<32>();
83     test_string_ctor<33>();
84     test_string_ctor<63>();
85     test_string_ctor<64>();
86     test_string_ctor<65>();
87     test_string_ctor<1000>();
88 }
89