# ===----------------------------------------------------------------------===## # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # # ===----------------------------------------------------------------------===## # In addition to being available via inclusion of the header, # the function templates in [iterator.range] are available when any of the following # headers are included: , , , , , # , , , , , , , , # , . # UNSUPPORTED: c++03 # RUN: %{python} %s %{libcxx-dir}/utils # END. import sys sys.path.append(sys.argv[1]) from libcxx.header_information import ( lit_header_restrictions, lit_header_undeprecations, Header, ) headers = list( map( Header, [ "array", "deque", "flat_map", "flat_set", "forward_list", "list", "map", "regex", "set", "span", "string", "string_view", "unordered_map", "unordered_set", "vector", ], ) ) for header in headers: print( f"""\ //--- {header}.pass.cpp {lit_header_restrictions.get(header, '')} {lit_header_undeprecations.get(header, '')} #include <{header}> #include #include #include "test_macros.h" struct Container {{ int a[3] = {{1, 2, 3}}; int* begin() {{ return &a[0]; }} const int* begin() const {{ return &a[0]; }} int* rbegin() {{ return &a[2]; }} const int* rbegin() const {{ return &a[2]; }} int* end() {{ return &a[3]; }} const int* end() const {{ return &a[3]; }} int* rend() {{ return (&a[0]) - 1; }} const int* rend() const {{ return (&a[0]) - 1; }} std::size_t size() const {{ return 3; }} bool empty() const {{ return false; }} int* data() {{return &a[0]; }} const int* data() const {{ return &a[0]; }} }}; int main(int, char**) {{ {{ Container c; const auto& cc = c; assert(std::begin(c) == c.begin()); assert(std::begin(cc) == cc.begin()); assert(std::end(c) == c.end()); assert(std::end(cc) == cc.end()); #if TEST_STD_VER >= 14 assert(std::cbegin(c) == cc.begin()); assert(std::cbegin(cc) == cc.begin()); assert(std::cend(c) == cc.end()); assert(std::cend(cc) == cc.end()); assert(std::rbegin(c) == c.rbegin()); assert(std::rbegin(cc) == cc.rbegin()); assert(std::rend(c) == cc.rend()); assert(std::rend(cc) == cc.rend()); assert(std::crbegin(c) == cc.rbegin()); assert(std::crbegin(cc) == cc.rbegin()); assert(std::crend(c) == cc.rend()); assert(std::crend(cc) == cc.rend()); #endif #if TEST_STD_VER >= 17 assert(std::data(c) == c.data()); assert(std::data(cc) == cc.data()); assert(std::size(cc) == cc.size()); assert(std::empty(cc) == cc.empty()); #endif #if TEST_STD_VER >= 20 assert(std::ssize(cc) == 3); #endif }} {{ int a[] = {{1, 2, 3}}; const auto& ca = a; assert(std::begin(a) == &a[0]); assert(std::begin(ca) == &ca[0]); assert(std::end(a) == &a[3]); assert(std::end(ca) == &ca[3]); #if TEST_STD_VER >= 14 assert(std::cbegin(a) == &a[0]); assert(std::cbegin(ca) == &ca[0]); assert(std::cend(a) == &a[3]); assert(std::cend(ca) == &ca[3]); assert(std::rbegin(a) == std::reverse_iterator(std::end(a))); assert(std::rbegin(ca) == std::reverse_iterator(std::end(ca))); assert(std::rend(a) == std::reverse_iterator(std::begin(a))); assert(std::rend(ca) == std::reverse_iterator(std::begin(ca))); assert(std::crbegin(a) == std::reverse_iterator(std::end(a))); assert(std::crbegin(ca) == std::reverse_iterator(std::end(ca))); assert(std::crend(a) == std::reverse_iterator(std::begin(a))); assert(std::crend(ca) == std::reverse_iterator(std::begin(ca))); #endif #if TEST_STD_VER >= 17 assert(std::size(ca) == 3); assert(!std::empty(ca)); assert(std::data(a) == &a[0]); assert(std::data(ca) == &ca[0]); #endif #if TEST_STD_VER >= 20 assert(std::ssize(ca) == 3); #endif }} {{ auto il = {{1, 2, 3}}; const auto& cil = il; assert(std::begin(il) == il.begin()); assert(std::begin(cil) == cil.begin()); assert(std::end(il) == il.end()); assert(std::end(cil) == cil.end()); #if TEST_STD_VER >= 14 assert(std::cbegin(il) == cil.begin()); assert(std::cbegin(cil) == cil.begin()); assert(std::cend(il) == cil.end()); assert(std::cend(cil) == cil.end()); assert(std::rbegin(il) == std::reverse_iterator(std::end(il))); assert(std::rbegin(cil) == std::reverse_iterator(std::end(il))); assert(std::rend(il) == std::reverse_iterator(std::begin(il))); assert(std::rend(cil) == std::reverse_iterator(std::begin(il))); assert(std::crbegin(il) == std::reverse_iterator(std::end(il))); assert(std::crbegin(cil) == std::reverse_iterator(std::end(il))); assert(std::crend(il) == std::reverse_iterator(std::begin(il))); assert(std::crend(cil) == std::reverse_iterator(std::begin(il))); #endif #if TEST_STD_VER >= 17 assert(std::size(cil) == 3); assert(!std::empty(cil)); assert(std::data(il) == &*std::begin(il)); assert(std::data(cil) == &*std::begin(il)); #endif #if TEST_STD_VER >= 20 assert(std::ssize(cil) == 3); #endif }} return 0; }} """ )