117bbb224Svarconst //===----------------------------------------------------------------------===// 217bbb224Svarconst // 317bbb224Svarconst // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 417bbb224Svarconst // See https://llvm.org/LICENSE.txt for license information. 517bbb224Svarconst // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 617bbb224Svarconst // 717bbb224Svarconst //===----------------------------------------------------------------------===// 817bbb224Svarconst 917bbb224Svarconst // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 1017bbb224Svarconst 11*733a98dbSA. Jiang #include <sstream> 1217bbb224Svarconst #include <vector> 1317bbb224Svarconst 1417bbb224Svarconst #include "../from_range_sequence_containers.h" 1517bbb224Svarconst #include "test_macros.h" 1617bbb224Svarconst 1717bbb224Svarconst // template<container-compatible-range<T> R> 1817bbb224Svarconst // vector(from_range_t, R&& rg, const Allocator& = Allocator()); // C++23 1917bbb224Svarconst 2017bbb224Svarconst constexpr bool test() { 2117bbb224Svarconst for_all_iterators_and_allocators<bool>([]<class Iter, class Sent, class Alloc>() { 22346a2990SStephan T. Lavavej test_vector_bool<Iter, Sent, Alloc>([]([[maybe_unused]] const auto& c) { 2317bbb224Svarconst LIBCPP_ASSERT(c.__invariants()); 2417bbb224Svarconst // `is_contiguous_container_asan_correct` doesn't work on `vector<bool>`. 2517bbb224Svarconst }); 2617bbb224Svarconst }); 2717bbb224Svarconst 28*733a98dbSA. Jiang { // Ensure input-only sized ranges are accepted. 29*733a98dbSA. Jiang using input_iter = cpp20_input_iterator<const bool*>; 30*733a98dbSA. Jiang const bool in[]{true, true, false, true}; 31*733a98dbSA. Jiang std::vector v(std::from_range, std::views::counted(input_iter{std::ranges::begin(in)}, std::ranges::ssize(in))); 32*733a98dbSA. Jiang assert(std::ranges::equal(v, std::vector<bool>{true, true, false, true})); 33*733a98dbSA. Jiang } 34*733a98dbSA. Jiang 3517bbb224Svarconst return true; 3617bbb224Svarconst } 3717bbb224Svarconst 38*733a98dbSA. Jiang #ifndef TEST_HAS_NO_LOCALIZATION 39*733a98dbSA. Jiang void test_counted_istream_view() { 40*733a98dbSA. Jiang std::istringstream is{"1 1 0 1"}; 41*733a98dbSA. Jiang auto vals = std::views::istream<bool>(is); 42*733a98dbSA. Jiang std::vector v(std::from_range, std::views::counted(vals.begin(), 3)); 43*733a98dbSA. Jiang assert(v == (std::vector{true, true, false})); 44*733a98dbSA. Jiang } 45*733a98dbSA. Jiang #endif 46*733a98dbSA. Jiang 4717bbb224Svarconst int main(int, char**) { 4817bbb224Svarconst test(); 4917bbb224Svarconst static_assert(test()); 5017bbb224Svarconst 5117bbb224Svarconst static_assert(test_constraints<std::vector, bool, char>()); 5217bbb224Svarconst 5317bbb224Svarconst // Note: test_exception_safety_throwing_copy doesn't apply because copying a boolean cannot throw. 5417bbb224Svarconst test_exception_safety_throwing_allocator<std::vector, bool>(); 5517bbb224Svarconst 56*733a98dbSA. Jiang #ifndef TEST_HAS_NO_LOCALIZATION 57*733a98dbSA. Jiang test_counted_istream_view(); 58*733a98dbSA. Jiang #endif 59*733a98dbSA. Jiang 6017bbb224Svarconst return 0; 6117bbb224Svarconst } 62