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<N>::reference operator[](size_t pos); 105a83710eSEric Fiselier 115a83710eSEric Fiselier #include <bitset> 125a83710eSEric Fiselier #include <cassert> 1363aeadb4SLouis Dionne #include <cstddef> 1463aeadb4SLouis Dionne #include <vector> 155a83710eSEric Fiselier 16bd8884f0SLouis Dionne #include "../bitset_test_cases.h" 17e803cc52SStephan T. Lavavej #include "test_macros.h" 18e803cc52SStephan T. Lavavej 195a83710eSEric Fiselier template <std::size_t N> test_index()2063aeadb4SLouis Dionnevoid test_index() { 2163aeadb4SLouis Dionne std::vector<std::bitset<N> > const cases = get_test_cases<N>(); 2263aeadb4SLouis Dionne for (std::size_t c = 0; c != cases.size(); ++c) { 2363aeadb4SLouis Dionne std::bitset<N> v1 = cases[c]; 2463aeadb4SLouis Dionne if (v1.size() > 0) { 255a83710eSEric Fiselier assert(v1[N/2] == v1.test(N/2)); 265a83710eSEric Fiselier typename std::bitset<N>::reference r = v1[N/2]; 275a83710eSEric Fiselier assert(r == v1.test(N/2)); 285a83710eSEric Fiselier typename std::bitset<N>::reference r2 = v1[N/2]; 295a83710eSEric Fiselier r = r2; 305a83710eSEric Fiselier assert(r == v1.test(N/2)); 315a83710eSEric Fiselier r = false; 325a83710eSEric Fiselier assert(r == false); 335a83710eSEric Fiselier assert(v1.test(N/2) == false); 345a83710eSEric Fiselier r = true; 355a83710eSEric Fiselier assert(r == true); 365a83710eSEric Fiselier assert(v1.test(N/2) == true); 375a83710eSEric Fiselier bool b = ~r; 385a83710eSEric Fiselier assert(r == true); 395a83710eSEric Fiselier assert(v1.test(N/2) == true); 405a83710eSEric Fiselier assert(b == false); 415a83710eSEric Fiselier r.flip(); 425a83710eSEric Fiselier assert(r == false); 435a83710eSEric Fiselier assert(v1.test(N/2) == false); 445a83710eSEric Fiselier } 45*667925d4SNikolas Klauser ASSERT_SAME_TYPE(decltype(v1[0]), typename std::bitset<N>::reference); 465a83710eSEric Fiselier } 4763aeadb4SLouis Dionne } 485a83710eSEric Fiselier main(int,char **)4963aeadb4SLouis Dionneint main(int, char**) { 5063aeadb4SLouis Dionne test_index<0>(); 5163aeadb4SLouis Dionne test_index<1>(); 5263aeadb4SLouis Dionne test_index<31>(); 5363aeadb4SLouis Dionne test_index<32>(); 5463aeadb4SLouis Dionne test_index<33>(); 5563aeadb4SLouis Dionne test_index<63>(); 5663aeadb4SLouis Dionne test_index<64>(); 5763aeadb4SLouis Dionne test_index<65>(); 5863aeadb4SLouis Dionne test_index<1000>(); 592df59c50SJF Bastien 60*667925d4SNikolas Klauser std::bitset<1> set; 61*667925d4SNikolas Klauser set[0] = false; 62*667925d4SNikolas Klauser auto b = set[0]; 63*667925d4SNikolas Klauser set[0] = true; 64*667925d4SNikolas Klauser assert(b); 65*667925d4SNikolas Klauser 662df59c50SJF Bastien return 0; 675a83710eSEric Fiselier } 68