1e5d8b93eSzoecarver //===----------------------------------------------------------------------===//
2e5d8b93eSzoecarver //
3e5d8b93eSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5d8b93eSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5e5d8b93eSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5d8b93eSzoecarver //
7e5d8b93eSzoecarver //===----------------------------------------------------------------------===//
8e5d8b93eSzoecarver
9e5d8b93eSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
10e5d8b93eSzoecarver
11e5d8b93eSzoecarver // constexpr auto end();
12e5d8b93eSzoecarver // constexpr auto end() const requires range<const V>;
13e5d8b93eSzoecarver
14e5d8b93eSzoecarver #include <ranges>
1503fb6f04SLouis Dionne
16e5d8b93eSzoecarver #include <cassert>
1703fb6f04SLouis Dionne #include <concepts>
1803fb6f04SLouis Dionne #include <utility>
19e5d8b93eSzoecarver
20e5d8b93eSzoecarver #include "test_macros.h"
21e5d8b93eSzoecarver #include "test_iterators.h"
2203fb6f04SLouis Dionne #include "types.h"
23e5d8b93eSzoecarver
test()24e5d8b93eSzoecarver constexpr bool test() {
2503fb6f04SLouis Dionne int buf[8] = {1, 2, 3, 4, 5, 6, 7, 8};
26e5d8b93eSzoecarver
27e5d8b93eSzoecarver {
2803fb6f04SLouis Dionne SizedRandomAccessView view{buf, buf + 8};
2903fb6f04SLouis Dionne std::ranges::common_view<SizedRandomAccessView> common(view);
3003fb6f04SLouis Dionne std::same_as<RandomAccessIter> auto end = common.end(); // Note this should NOT be the sentinel type.
31*5f26d863SMark de Wever assert(base(end) == buf + 8);
32e5d8b93eSzoecarver }
33e5d8b93eSzoecarver
3403fb6f04SLouis Dionne // const version
35e5d8b93eSzoecarver {
3603fb6f04SLouis Dionne SizedRandomAccessView view{buf, buf + 8};
3703fb6f04SLouis Dionne std::ranges::common_view<SizedRandomAccessView> const common(view);
3803fb6f04SLouis Dionne std::same_as<RandomAccessIter> auto end = common.end(); // Note this should NOT be the sentinel type.
39*5f26d863SMark de Wever assert(base(end) == buf + 8);
40e5d8b93eSzoecarver }
41e5d8b93eSzoecarver
42e5d8b93eSzoecarver return true;
43e5d8b93eSzoecarver }
44e5d8b93eSzoecarver
main(int,char **)45e5d8b93eSzoecarver int main(int, char**) {
46e5d8b93eSzoecarver test();
47e5d8b93eSzoecarver static_assert(test());
48e5d8b93eSzoecarver
4903fb6f04SLouis Dionne {
5003fb6f04SLouis Dionne int buf[8] = {1, 2, 3, 4, 5, 6, 7, 8};
51e5d8b93eSzoecarver
522a04deccSArthur O'Dwyer using CommonForwardIter = std::common_iterator<ForwardIter, sized_sentinel<ForwardIter>>;
53e5d8b93eSzoecarver using CommonIntIter = std::common_iterator<int*, sentinel_wrapper<int*>>;
54e5d8b93eSzoecarver
55e5d8b93eSzoecarver {
5603fb6f04SLouis Dionne SizedForwardView view{buf, buf + 8};
5703fb6f04SLouis Dionne std::ranges::common_view<SizedForwardView> common(view);
5803fb6f04SLouis Dionne std::same_as<CommonForwardIter> auto end = common.end();
5903fb6f04SLouis Dionne assert(end == CommonForwardIter(std::ranges::end(view)));
6003fb6f04SLouis Dionne }
6103fb6f04SLouis Dionne {
6203fb6f04SLouis Dionne CopyableView view{buf, buf + 8};
6303fb6f04SLouis Dionne std::ranges::common_view<CopyableView> common(view);
6403fb6f04SLouis Dionne std::same_as<CommonIntIter> auto end = common.end();
6503fb6f04SLouis Dionne assert(end == CommonIntIter(std::ranges::end(view)));
66e5d8b93eSzoecarver }
67e5d8b93eSzoecarver
6803fb6f04SLouis Dionne // const versions
69e5d8b93eSzoecarver {
7003fb6f04SLouis Dionne SizedForwardView view{buf, buf + 8};
7103fb6f04SLouis Dionne std::ranges::common_view<SizedForwardView> const common(view);
7203fb6f04SLouis Dionne std::same_as<CommonForwardIter> auto end = common.end();
7303fb6f04SLouis Dionne assert(end == CommonForwardIter(std::ranges::end(view)));
74e5d8b93eSzoecarver }
75e5d8b93eSzoecarver {
7603fb6f04SLouis Dionne CopyableView view{buf, buf + 8};
7703fb6f04SLouis Dionne std::ranges::common_view<CopyableView> const common(view);
7803fb6f04SLouis Dionne std::same_as<CommonIntIter> auto end = common.end();
7903fb6f04SLouis Dionne assert(end == CommonIntIter(std::ranges::end(view)));
80e5d8b93eSzoecarver }
81e5d8b93eSzoecarver }
82e5d8b93eSzoecarver
83e5d8b93eSzoecarver return 0;
84e5d8b93eSzoecarver }
85