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// <list>
10
11// iterator begin(); // constexpr since C++26
12// iterator end(); // constexpr since C++26
13// const_iterator begin() const; // constexpr since C++26
14// const_iterator end() const; // constexpr since C++26
15// const_iterator cbegin() const; // constexpr since C++26
16// const_iterator cend() const; // constexpr since C++26
17
18#include <list>
19#include <cassert>
20#include <iterator>
21
22#include "test_macros.h"
23#include "min_allocator.h"
24
25struct A {
26 int first;
27 int second;
28};
29
30TEST_CONSTEXPR_CXX26 bool test() {
31 {
32 typedef int T;
33 typedef std::list<T> C;
34 C c;
35 C::iterator i = c.begin();
36 C::iterator j = c.end();
37 assert(std::distance(i, j) == 0);
38 assert(i == j);
39 }
40 {
41 typedef int T;
42 typedef std::list<T> C;
43 const C c;
44 C::const_iterator i = c.begin();
45 C::const_iterator j = c.end();
46 assert(std::distance(i, j) == 0);
47 assert(i == j);
48 }
49 {
50 typedef int T;
51 typedef std::list<T> C;
52 C c;
53 C::const_iterator i = c.cbegin();
54 C::const_iterator j = c.cend();
55 assert(std::distance(i, j) == 0);
56 assert(i == j);
57 assert(i == c.end());
58 }
59 {
60 typedef int T;
61 typedef std::list<T> C;
62 const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
63 C c(std::begin(arr: t), std::end(arr: t));
64 C::iterator i = c.begin();
65 assert(*i == 0);
66 ++i;
67 assert(*i == 1);
68 *i = 10;
69 assert(*i == 10);
70 assert(std::distance(c.begin(), c.end()) == 10);
71 }
72 {
73 typedef int T;
74 typedef std::list<T> C;
75 C::iterator i;
76 C::const_iterator j;
77 (void)i;
78 (void)j;
79 }
80#if TEST_STD_VER >= 11
81 {
82 typedef int T;
83 typedef std::list<T, min_allocator<T>> C;
84 C c;
85 C::iterator i = c.begin();
86 C::iterator j = c.end();
87 assert(std::distance(i, j) == 0);
88 assert(i == j);
89 }
90 {
91 typedef int T;
92 typedef std::list<T, min_allocator<T>> C;
93 const C c;
94 C::const_iterator i = c.begin();
95 C::const_iterator j = c.end();
96 assert(std::distance(i, j) == 0);
97 assert(i == j);
98 }
99 {
100 typedef int T;
101 typedef std::list<T, min_allocator<T>> C;
102 C c;
103 C::const_iterator i = c.cbegin();
104 C::const_iterator j = c.cend();
105 assert(std::distance(i, j) == 0);
106 assert(i == j);
107 assert(i == c.end());
108 }
109 {
110 typedef int T;
111 typedef std::list<T, min_allocator<T>> C;
112 const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
113 C c(std::begin(t), std::end(t));
114 C::iterator i = c.begin();
115 assert(*i == 0);
116 ++i;
117 assert(*i == 1);
118 *i = 10;
119 assert(*i == 10);
120 assert(std::distance(c.begin(), c.end()) == 10);
121 }
122 {
123 typedef int T;
124 typedef std::list<T, min_allocator<T>> C;
125 C::iterator i;
126 C::const_iterator j;
127 (void)i;
128 (void)j;
129 }
130 {
131 typedef A T;
132 typedef std::list<T, min_allocator<T>> C;
133 C c = {A{1, 2}};
134 C::iterator i = c.begin();
135 i->first = 3;
136 C::const_iterator j = i;
137 assert(j->first == 3);
138 }
139#endif
140#if TEST_STD_VER > 11
141 {
142 std::list<int>::iterator ii1{}, ii2{};
143 std::list<int>::iterator ii4 = ii1;
144 std::list<int>::const_iterator cii{};
145 assert(ii1 == ii2);
146 assert(ii1 == ii4);
147
148 assert(!(ii1 != ii2));
149
150 assert((ii1 == cii));
151 assert((cii == ii1));
152 assert(!(ii1 != cii));
153 assert(!(cii != ii1));
154 }
155#endif
156
157 return true;
158}
159
160int main(int, char**) {
161 assert(test());
162#if TEST_STD_VER >= 26
163 static_assert(test());
164#endif
165
166 return 0;
167}
168

source code of libcxx/test/std/containers/sequences/list/iterators.pass.cpp