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 #include <algorithm> // for 'min' and 'max'
15 #include <stdexcept> // for 'invalid_argument'
16 
17 #include "test_macros.h"
18 
19 template <std::size_t N>
test_string_ctor()20 void test_string_ctor()
21 {
22 #ifndef TEST_HAS_NO_EXCEPTIONS
23     {
24         try {
25             std::string str("xxx1010101010xxxx");
26             std::bitset<N> v(str, str.size()+1, 10);
27             assert(false);
28         }
29         catch (std::out_of_range&)
30         {
31         }
32     }
33     {
34         try {
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         try {
45             std::string str("xxxbababababaxxxx");
46             std::bitset<N> v(str, 2, 10, 'a', 'b');
47             assert(false);
48         }
49         catch (std::invalid_argument&)
50         {
51         }
52     }
53 #endif // TEST_HAS_NO_EXCEPTIONS
54     {
55         std::string str("xxx1010101010xxxx");
56         std::bitset<N> v(str, 3, 10);
57         std::size_t M = std::min<std::size_t>(N, 10);
58         for (std::size_t i = 0; i < M; ++i)
59             assert(v[i] == (str[3 + M - 1 - i] == '1'));
60         for (std::size_t i = 10; i < N; ++i)
61             assert(v[i] == false);
62     }
63     {
64         std::string str("xxxbababababaxxxx");
65         std::bitset<N> v(str, 3, 10, 'a', 'b');
66         std::size_t M = std::min<std::size_t>(N, 10);
67         for (std::size_t i = 0; i < M; ++i)
68             assert(v[i] == (str[3 + M - 1 - i] == 'b'));
69         for (std::size_t i = 10; i < N; ++i)
70             assert(v[i] == false);
71     }
72 }
73 
main()74 int main()
75 {
76     test_string_ctor<0>();
77     test_string_ctor<1>();
78     test_string_ctor<31>();
79     test_string_ctor<32>();
80     test_string_ctor<33>();
81     test_string_ctor<63>();
82     test_string_ctor<64>();
83     test_string_ctor<65>();
84     test_string_ctor<1000>();
85 }
86