182 lines · python
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# In addition to being available via inclusion of the <iterator> header,10# the function templates in [iterator.range] are available when any of the following11# headers are included: <array>, <deque>, <flat_map>, <flat_set>, <forward_list>,12# <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>,13# <unordered_set>, <vector>.14 15# UNSUPPORTED: c++0316 17# RUN: %{python} %s %{libcxx-dir}/utils18# END.19 20import sys21 22sys.path.append(sys.argv[1])23from libcxx.header_information import (24 lit_header_restrictions,25 lit_header_undeprecations,26 Header,27)28 29headers = list(30 map(31 Header,32 [33 "array",34 "deque",35 "flat_map",36 "flat_set",37 "forward_list",38 "list",39 "map",40 "regex",41 "set",42 "span",43 "string",44 "string_view",45 "unordered_map",46 "unordered_set",47 "vector",48 ],49 )50)51 52for header in headers:53 print(54 f"""\55//--- {header}.pass.cpp56{lit_header_restrictions.get(header, '')}57{lit_header_undeprecations.get(header, '')}58 59#include <{header}>60#include <cassert>61#include <initializer_list>62 63#include "test_macros.h"64 65struct Container {{66 int a[3] = {{1, 2, 3}};67 68 int* begin() {{ return &a[0]; }}69 const int* begin() const {{ return &a[0]; }}70 int* rbegin() {{ return &a[2]; }}71 const int* rbegin() const {{ return &a[2]; }}72 int* end() {{ return &a[3]; }}73 const int* end() const {{ return &a[3]; }}74 int* rend() {{ return (&a[0]) - 1; }}75 const int* rend() const {{ return (&a[0]) - 1; }}76 std::size_t size() const {{ return 3; }}77 bool empty() const {{ return false; }}78 int* data() {{return &a[0]; }}79 const int* data() const {{ return &a[0]; }}80}};81 82int main(int, char**) {{83 {{84 Container c;85 const auto& cc = c;86 assert(std::begin(c) == c.begin());87 assert(std::begin(cc) == cc.begin());88 assert(std::end(c) == c.end());89 assert(std::end(cc) == cc.end());90#if TEST_STD_VER >= 1491 assert(std::cbegin(c) == cc.begin());92 assert(std::cbegin(cc) == cc.begin());93 assert(std::cend(c) == cc.end());94 assert(std::cend(cc) == cc.end());95 assert(std::rbegin(c) == c.rbegin());96 assert(std::rbegin(cc) == cc.rbegin());97 assert(std::rend(c) == cc.rend());98 assert(std::rend(cc) == cc.rend());99 assert(std::crbegin(c) == cc.rbegin());100 assert(std::crbegin(cc) == cc.rbegin());101 assert(std::crend(c) == cc.rend());102 assert(std::crend(cc) == cc.rend());103#endif104#if TEST_STD_VER >= 17105 assert(std::data(c) == c.data());106 assert(std::data(cc) == cc.data());107 assert(std::size(cc) == cc.size());108 assert(std::empty(cc) == cc.empty());109#endif110#if TEST_STD_VER >= 20111 assert(std::ssize(cc) == 3);112#endif113 }}114 {{115 int a[] = {{1, 2, 3}};116 const auto& ca = a;117 assert(std::begin(a) == &a[0]);118 assert(std::begin(ca) == &ca[0]);119 assert(std::end(a) == &a[3]);120 assert(std::end(ca) == &ca[3]);121#if TEST_STD_VER >= 14122 assert(std::cbegin(a) == &a[0]);123 assert(std::cbegin(ca) == &ca[0]);124 assert(std::cend(a) == &a[3]);125 assert(std::cend(ca) == &ca[3]);126 assert(std::rbegin(a) == std::reverse_iterator<int*>(std::end(a)));127 assert(std::rbegin(ca) == std::reverse_iterator<const int*>(std::end(ca)));128 assert(std::rend(a) == std::reverse_iterator<int*>(std::begin(a)));129 assert(std::rend(ca) == std::reverse_iterator<const int*>(std::begin(ca)));130 assert(std::crbegin(a) == std::reverse_iterator<const int*>(std::end(a)));131 assert(std::crbegin(ca) == std::reverse_iterator<const int*>(std::end(ca)));132 assert(std::crend(a) == std::reverse_iterator<const int*>(std::begin(a)));133 assert(std::crend(ca) == std::reverse_iterator<const int*>(std::begin(ca)));134#endif135#if TEST_STD_VER >= 17136 assert(std::size(ca) == 3);137 assert(!std::empty(ca));138 assert(std::data(a) == &a[0]);139 assert(std::data(ca) == &ca[0]);140#endif141#if TEST_STD_VER >= 20142 assert(std::ssize(ca) == 3);143#endif144 }}145 {{146 auto il = {{1, 2, 3}};147 const auto& cil = il;148 assert(std::begin(il) == il.begin());149 assert(std::begin(cil) == cil.begin());150 assert(std::end(il) == il.end());151 assert(std::end(cil) == cil.end());152#if TEST_STD_VER >= 14153 assert(std::cbegin(il) == cil.begin());154 assert(std::cbegin(cil) == cil.begin());155 assert(std::cend(il) == cil.end());156 assert(std::cend(cil) == cil.end());157 assert(std::rbegin(il) == std::reverse_iterator<const int*>(std::end(il)));158 assert(std::rbegin(cil) == std::reverse_iterator<const int*>(std::end(il)));159 assert(std::rend(il) == std::reverse_iterator<const int*>(std::begin(il)));160 assert(std::rend(cil) == std::reverse_iterator<const int*>(std::begin(il)));161 assert(std::crbegin(il) == std::reverse_iterator<const int*>(std::end(il)));162 assert(std::crbegin(cil) == std::reverse_iterator<const int*>(std::end(il)));163 assert(std::crend(il) == std::reverse_iterator<const int*>(std::begin(il)));164 assert(std::crend(cil) == std::reverse_iterator<const int*>(std::begin(il)));165#endif166#if TEST_STD_VER >= 17167 assert(std::size(cil) == 3);168 assert(!std::empty(cil));169 assert(std::data(il) == &*std::begin(il));170 assert(std::data(cil) == &*std::begin(il));171#endif172#if TEST_STD_VER >= 20173 assert(std::ssize(cil) == 3);174#endif175 }}176 177 return 0;178}}179 180"""181 )182