xref: /llvm-project/libcxx/test/std/containers/sequences/vector.bool/at.pass.cpp (revision 71e9a48227a0599130b2f9ed090366bb973c57e5)
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 // <vector>
10 
11 // reference at(size_type n); // constexpr since C++20
12 
13 #include <cassert>
14 #include <memory>
15 #include <vector>
16 
17 #include "min_allocator.h"
18 #include "test_allocator.h"
19 #include "test_macros.h"
20 
21 #ifndef TEST_HAS_NO_EXCEPTIONS
22 #  include <stdexcept>
23 #endif
24 
25 template <typename Allocator>
26 TEST_CONSTEXPR_CXX20 void test() {
27   using C         = std::vector<bool, Allocator>;
28   using reference = typename C::reference;
29   bool a[]        = {1, 0, 1, 0, 1};
30   C v(a, a + sizeof(a) / sizeof(a[0]));
31   ASSERT_SAME_TYPE(reference, decltype(v.at(0)));
32   assert(v.at(0) == true);
33   assert(v.at(1) == false);
34   assert(v.at(2) == true);
35   assert(v.at(3) == false);
36   assert(v.at(4) == true);
37   v.at(1) = 1;
38   assert(v.at(1) == true);
39   v.at(3) = 1;
40   assert(v.at(3) == true);
41 }
42 
43 template <typename Allocator>
44 void test_exception() {
45 #ifndef TEST_HAS_NO_EXCEPTIONS
46   {
47     bool a[] = {1, 0, 1, 1};
48     using C  = std::vector<bool, Allocator>;
49     C v(a, a + sizeof(a) / sizeof(a[0]));
50 
51     try {
52       TEST_IGNORE_NODISCARD v.at(4);
53       assert(false);
54     } catch (std::out_of_range const&) {
55       // pass
56     } catch (...) {
57       assert(false);
58     }
59 
60     try {
61       TEST_IGNORE_NODISCARD v.at(5);
62       assert(false);
63     } catch (std::out_of_range const&) {
64       // pass
65     } catch (...) {
66       assert(false);
67     }
68 
69     try {
70       TEST_IGNORE_NODISCARD v.at(6);
71       assert(false);
72     } catch (std::out_of_range const&) {
73       // pass
74     } catch (...) {
75       assert(false);
76     }
77 
78     try {
79       using size_type = typename C::size_type;
80       TEST_IGNORE_NODISCARD v.at(static_cast<size_type>(-1));
81       assert(false);
82     } catch (std::out_of_range const&) {
83       // pass
84     } catch (...) {
85       assert(false);
86     }
87   }
88 
89   {
90     std::vector<bool, Allocator> v;
91     try {
92       TEST_IGNORE_NODISCARD v.at(0);
93       assert(false);
94     } catch (std::out_of_range const&) {
95       // pass
96     } catch (...) {
97       assert(false);
98     }
99   }
100 #endif
101 }
102 
103 TEST_CONSTEXPR_CXX20 bool tests() {
104   test<std::allocator<bool> >();
105   test<min_allocator<bool> >();
106   test<test_allocator<bool> >();
107   return true;
108 }
109 
110 void test_exceptions() {
111   test_exception<std::allocator<bool> >();
112   test_exception<min_allocator<bool> >();
113   test_exception<test_allocator<bool> >();
114 }
115 
116 int main(int, char**) {
117   tests();
118   test_exceptions();
119 
120 #if TEST_STD_VER >= 20
121   static_assert(tests());
122 #endif
123 
124   return 0;
125 }
126