168 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// <list>10 11// iterator begin(); // constexpr since C++2612// iterator end(); // constexpr since C++2613// const_iterator begin() const; // constexpr since C++2614// const_iterator end() const; // constexpr since C++2615// const_iterator cbegin() const; // constexpr since C++2616// const_iterator cend() const; // constexpr since C++2617 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(t), std::end(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 >= 1181 {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#endif140#if TEST_STD_VER > 11141 {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#endif156 157 return true;158}159 160int main(int, char**) {161 assert(test());162#if TEST_STD_VER >= 26163 static_assert(test());164#endif165 166 return 0;167}168