15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier
95a83710eSEric Fiselier // test bitset(string, pos, n, zero, one);
105a83710eSEric Fiselier
115a83710eSEric Fiselier #include <bitset>
129c9b0ec5SMarshall Clow #include <algorithm> // for 'min' and 'max'
13*bffdc241SLouis Dionne #include <cassert>
149c9b0ec5SMarshall Clow #include <stdexcept> // for 'invalid_argument'
15*bffdc241SLouis Dionne #include <string>
165a83710eSEric Fiselier
174efa1ad5SEric Fiselier #include "test_macros.h"
185a83710eSEric Fiselier
195a83710eSEric Fiselier template <std::size_t N>
test_string_ctor()20*bffdc241SLouis Dionne void test_string_ctor() {
214efa1ad5SEric Fiselier #ifndef TEST_HAS_NO_EXCEPTIONS
225a83710eSEric Fiselier {
234efa1ad5SEric Fiselier try {
24*bffdc241SLouis Dionne std::string s("xxx1010101010xxxx");
25*bffdc241SLouis Dionne std::bitset<N> v(s, s.size()+1, 10);
265a83710eSEric Fiselier assert(false);
275a83710eSEric Fiselier }
285a83710eSEric Fiselier catch (std::out_of_range&)
295a83710eSEric Fiselier {
305a83710eSEric Fiselier }
315a83710eSEric Fiselier }
325a83710eSEric Fiselier {
334efa1ad5SEric Fiselier try {
34*bffdc241SLouis Dionne std::string s("xxx1010101010xxxx");
35*bffdc241SLouis Dionne std::bitset<N> v(s, 2, 10);
365a83710eSEric Fiselier assert(false);
375a83710eSEric Fiselier }
385a83710eSEric Fiselier catch (std::invalid_argument&)
395a83710eSEric Fiselier {
405a83710eSEric Fiselier }
415a83710eSEric Fiselier }
424efa1ad5SEric Fiselier {
434efa1ad5SEric Fiselier try {
44*bffdc241SLouis Dionne std::string s("xxxbababababaxxxx");
45*bffdc241SLouis Dionne std::bitset<N> v(s, 2, 10, 'a', 'b');
464efa1ad5SEric Fiselier assert(false);
474efa1ad5SEric Fiselier }
484efa1ad5SEric Fiselier catch (std::invalid_argument&)
494efa1ad5SEric Fiselier {
504efa1ad5SEric Fiselier }
514efa1ad5SEric Fiselier }
524efa1ad5SEric Fiselier #endif // TEST_HAS_NO_EXCEPTIONS
535a83710eSEric Fiselier {
54*bffdc241SLouis Dionne std::string s("xxx1010101010xxxx");
55*bffdc241SLouis Dionne std::bitset<N> v(s, 3, 10);
56*bffdc241SLouis Dionne std::size_t M = std::min<std::size_t>(v.size(), 10);
575a83710eSEric Fiselier for (std::size_t i = 0; i < M; ++i)
58*bffdc241SLouis Dionne assert(v[i] == (s[3 + M - 1 - i] == '1'));
59*bffdc241SLouis Dionne for (std::size_t i = 10; i < v.size(); ++i)
605a83710eSEric Fiselier assert(v[i] == false);
615a83710eSEric Fiselier }
625a83710eSEric Fiselier {
63*bffdc241SLouis Dionne std::string s("xxxbababababaxxxx");
64*bffdc241SLouis Dionne std::bitset<N> v(s, 3, 10, 'a', 'b');
65*bffdc241SLouis Dionne std::size_t M = std::min<std::size_t>(v.size(), 10);
665a83710eSEric Fiselier for (std::size_t i = 0; i < M; ++i)
67*bffdc241SLouis Dionne assert(v[i] == (s[3 + M - 1 - i] == 'b'));
68*bffdc241SLouis Dionne for (std::size_t i = 10; i < v.size(); ++i)
695a83710eSEric Fiselier assert(v[i] == false);
705a83710eSEric Fiselier }
715a83710eSEric Fiselier }
725a83710eSEric Fiselier
73d1523f7aSEric Fiselier struct Nonsense {
~NonsenseNonsense74d1523f7aSEric Fiselier virtual ~Nonsense() {}
75d1523f7aSEric Fiselier };
76d1523f7aSEric Fiselier
test_for_non_eager_instantiation()77d1523f7aSEric Fiselier void test_for_non_eager_instantiation() {
78d1523f7aSEric Fiselier // Ensure we don't accidentally instantiate `std::basic_string<Nonsense>`
79d1523f7aSEric Fiselier // since it may not be well formed and can cause an error in the
80d1523f7aSEric Fiselier // non-immediate context.
81d1523f7aSEric Fiselier static_assert(!std::is_constructible<std::bitset<3>, Nonsense*>::value, "");
82d1523f7aSEric Fiselier static_assert(!std::is_constructible<std::bitset<3>, Nonsense*, size_t, Nonsense&, Nonsense&>::value, "");
83d1523f7aSEric Fiselier }
84d1523f7aSEric Fiselier
main(int,char **)85*bffdc241SLouis Dionne int main(int, char**) {
865a83710eSEric Fiselier test_string_ctor<0>();
875a83710eSEric Fiselier test_string_ctor<1>();
885a83710eSEric Fiselier test_string_ctor<31>();
895a83710eSEric Fiselier test_string_ctor<32>();
905a83710eSEric Fiselier test_string_ctor<33>();
915a83710eSEric Fiselier test_string_ctor<63>();
925a83710eSEric Fiselier test_string_ctor<64>();
935a83710eSEric Fiselier test_string_ctor<65>();
945a83710eSEric Fiselier test_string_ctor<1000>();
95d1523f7aSEric Fiselier test_for_non_eager_instantiation();
962df59c50SJF Bastien
972df59c50SJF Bastien return 0;
985a83710eSEric Fiselier }
99