xref: /llvm-project/libcxx/test/std/utilities/template.bitset/bitset.cons/string_view_ctor.pass.cpp (revision ea82a822d990824c58c6fa4b503ca84c4870c940)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10 
11 //    template<class charT, class traits>
12 //        explicit bitset(
13 //            const basic_string_view<charT,traits>& str,
14 //            typename basic_string_view<charT,traits>::size_type pos = 0,
15 //            typename basic_string_view<charT,traits>::size_type n = basic_string_view<charT,traits>::npos,
16 //            charT zero = charT('0'), charT one = charT('1'));
17 
18 #include <algorithm> // for 'min' and 'max'
19 #include <bitset>
20 #include <cassert>
21 #include <stdexcept> // for 'invalid_argument'
22 #include <string_view>
23 #include <type_traits>
24 
25 #include "test_macros.h"
26 
27 template <std::size_t N>
test_string_ctor()28 constexpr void test_string_ctor() {
29 #ifndef TEST_HAS_NO_EXCEPTIONS
30   if (!TEST_IS_CONSTANT_EVALUATED) {
31     try {
32       std::string_view s("xxx1010101010xxxx");
33       std::bitset<N> v(s, s.size() + 1);
34       assert(false);
35     } catch (std::out_of_range&) {
36     }
37     try {
38       std::string_view s("xxx1010101010xxxx");
39       std::bitset<N> v(s, s.size() + 1, 10);
40       assert(false);
41     } catch (std::out_of_range&) {
42     }
43     try {
44       std::string_view s("xxx1010101010xxxx");
45       std::bitset<N> v(s);
46       assert(false);
47     } catch (std::invalid_argument&) {
48     }
49     try {
50       std::string_view s("xxx1010101010xxxx");
51       std::bitset<N> v(s, 2);
52       assert(false);
53     } catch (std::invalid_argument&) {
54     }
55     try {
56       std::string_view s("xxx1010101010xxxx");
57       std::bitset<N> v(s, 2, 10);
58       assert(false);
59     } catch (std::invalid_argument&) {
60     }
61     try {
62       std::string_view s("xxxbababababaxxxx");
63       std::bitset<N> v(s, 2, 10, 'a', 'b');
64       assert(false);
65     } catch (std::invalid_argument&) {
66     }
67   }
68 #endif // TEST_HAS_NO_EXCEPTIONS
69 
70   static_assert(!std::is_convertible_v<std::string_view, std::bitset<N>>);
71   static_assert(std::is_constructible_v<std::bitset<N>, std::string_view>);
72   {
73     std::string_view s("1010101010");
74     std::bitset<N> v(s);
75     std::size_t M = std::min<std::size_t>(v.size(), 10);
76     for (std::size_t i = 0; i < M; ++i)
77       assert(v[i] == (s[M - 1 - i] == '1'));
78     for (std::size_t i = 10; i < v.size(); ++i)
79       assert(v[i] == false);
80   }
81   {
82     std::string_view s("xxx1010101010");
83     std::bitset<N> v(s, 3);
84     std::size_t M = std::min<std::size_t>(v.size(), 10);
85     for (std::size_t i = 0; i < M; ++i)
86       assert(v[i] == (s[3 + M - 1 - i] == '1'));
87     for (std::size_t i = 10; i < v.size(); ++i)
88       assert(v[i] == false);
89   }
90   {
91     std::string_view s("xxx1010101010xxxx");
92     std::bitset<N> v(s, 3, 10);
93     std::size_t M = std::min<std::size_t>(v.size(), 10);
94     for (std::size_t i = 0; i < M; ++i)
95       assert(v[i] == (s[3 + M - 1 - i] == '1'));
96     for (std::size_t i = 10; i < v.size(); ++i)
97       assert(v[i] == false);
98   }
99   {
100     std::string_view s("xxx1a1a1a1a1axxxx");
101     std::bitset<N> v(s, 3, 10, 'a');
102     std::size_t M = std::min<std::size_t>(v.size(), 10);
103     for (std::size_t i = 0; i < M; ++i)
104       assert(v[i] == (s[3 + M - 1 - i] == '1'));
105     for (std::size_t i = 10; i < v.size(); ++i)
106       assert(v[i] == false);
107   }
108   {
109     std::string_view s("xxxbababababaxxxx");
110     std::bitset<N> v(s, 3, 10, 'a', 'b');
111     std::size_t M = std::min<std::size_t>(v.size(), 10);
112     for (std::size_t i = 0; i < M; ++i)
113       assert(v[i] == (s[3 + M - 1 - i] == 'b'));
114     for (std::size_t i = 10; i < v.size(); ++i)
115       assert(v[i] == false);
116   }
117 }
118 
119 struct Nonsense {
~NonsenseNonsense120   virtual ~Nonsense() {}
121 };
122 
test_for_non_eager_instantiation()123 constexpr void test_for_non_eager_instantiation() {
124   // Ensure we don't accidentally instantiate `std::basic_string_view<Nonsense>`
125   // since it may not be well formed and can cause an error in the
126   // non-immediate context.
127   static_assert(!std::is_constructible<std::bitset<3>, Nonsense*>::value, "");
128   static_assert(!std::is_constructible<std::bitset<3>, Nonsense*, std::size_t, Nonsense&, Nonsense&>::value, "");
129 }
130 
test()131 constexpr bool test() {
132   test_string_ctor<0>();
133   test_string_ctor<1>();
134   test_string_ctor<31>();
135   test_string_ctor<32>();
136   test_string_ctor<33>();
137   test_string_ctor<63>();
138   test_string_ctor<64>();
139   test_string_ctor<65>();
140   test_string_ctor<1000>();
141   test_for_non_eager_instantiation();
142 
143   return true;
144 }
145 
main(int,char **)146 int main(int, char**) {
147   test();
148   static_assert(test());
149 
150   return 0;
151 }
152