xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.common.view/end.pass.cpp (revision b8cb1dc9ea87faa8e8e9ab7a31710a8c0bb8b084)
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