blob: 34ede107e5ed691215412e196df2dcfea886dc1f [file] [log] [blame]
# ===----------------------------------------------------------------------===##
#
# 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 <iterator> header,
# the function templates in [iterator.range] are available when any of the following
# headers are included: <array>, <deque>, <flat_map>, <flat_set>, <forward_list>,
# <list>, <map>, <regex>, <set>, <span>, <string>, <string_view>, <unordered_map>,
# <unordered_set>, <vector>.
# 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 <cassert>
#include <initializer_list>
#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<int*>(std::end(a)));
assert(std::rbegin(ca) == std::reverse_iterator<const int*>(std::end(ca)));
assert(std::rend(a) == std::reverse_iterator<int*>(std::begin(a)));
assert(std::rend(ca) == std::reverse_iterator<const int*>(std::begin(ca)));
assert(std::crbegin(a) == std::reverse_iterator<const int*>(std::end(a)));
assert(std::crbegin(ca) == std::reverse_iterator<const int*>(std::end(ca)));
assert(std::crend(a) == std::reverse_iterator<const int*>(std::begin(a)));
assert(std::crend(ca) == std::reverse_iterator<const int*>(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<const int*>(std::end(il)));
assert(std::rbegin(cil) == std::reverse_iterator<const int*>(std::end(il)));
assert(std::rend(il) == std::reverse_iterator<const int*>(std::begin(il)));
assert(std::rend(cil) == std::reverse_iterator<const int*>(std::begin(il)));
assert(std::crbegin(il) == std::reverse_iterator<const int*>(std::end(il)));
assert(std::crbegin(cil) == std::reverse_iterator<const int*>(std::end(il)));
assert(std::crend(il) == std::reverse_iterator<const int*>(std::begin(il)));
assert(std::crend(cil) == std::reverse_iterator<const int*>(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;
}}
"""
)