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