1560170faSzoecarver //===----------------------------------------------------------------------===//
2560170faSzoecarver //
3560170faSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4560170faSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5560170faSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6560170faSzoecarver //
7560170faSzoecarver //===----------------------------------------------------------------------===//
8560170faSzoecarver
9560170faSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11560170faSzoecarver
12560170faSzoecarver // Some basic examples of how drop_view might be used in the wild. This is a general
13560170faSzoecarver // collection of sample algorithms and functions that try to mock general usage of
14560170faSzoecarver // this view.
15560170faSzoecarver
16560170faSzoecarver #include <ranges>
17560170faSzoecarver
18560170faSzoecarver #include <vector>
19560170faSzoecarver #include <list>
20560170faSzoecarver #include <string>
21560170faSzoecarver
22560170faSzoecarver #include <cassert>
23560170faSzoecarver #include "test_macros.h"
24560170faSzoecarver #include "test_iterators.h"
25560170faSzoecarver #include "types.h"
26560170faSzoecarver
27560170faSzoecarver template<class T>
28560170faSzoecarver concept ValidDropView = requires { typename std::ranges::drop_view<T>; };
29560170faSzoecarver
30*610ac8dbSArthur O'Dwyer static_assert( ValidDropView<MoveOnlyView>);
31560170faSzoecarver static_assert(!ValidDropView<Range>);
32ba032a61Szoecarver
33*610ac8dbSArthur O'Dwyer static_assert(!std::ranges::enable_borrowed_range<std::ranges::drop_view<MoveOnlyView>>);
34ba032a61Szoecarver static_assert( std::ranges::enable_borrowed_range<std::ranges::drop_view<BorrowableView>>);
35560170faSzoecarver
36560170faSzoecarver template<std::ranges::view View>
orderedFibonacci(View v,int n=1)37560170faSzoecarver bool orderedFibonacci(View v, int n = 1) {
38560170faSzoecarver if (v.size() < 3)
39560170faSzoecarver return true;
40560170faSzoecarver
41560170faSzoecarver if (v[2] != v[0] + v[1])
42560170faSzoecarver return false;
43560170faSzoecarver
44560170faSzoecarver return orderedFibonacci(std::ranges::drop_view(v.base(), n), n + 1);
45560170faSzoecarver }
46560170faSzoecarver
47560170faSzoecarver template<std::ranges::view View>
makeEven(View v)48560170faSzoecarver std::ranges::view auto makeEven(View v) {
49560170faSzoecarver return std::ranges::drop_view(v, v.size() % 2);
50560170faSzoecarver }
51560170faSzoecarver
52560170faSzoecarver template<std::ranges::view View, class T>
indexOf(View v,T element)53560170faSzoecarver int indexOf(View v, T element) {
54560170faSzoecarver int index = 0;
55560170faSzoecarver for (auto e : v) {
56560170faSzoecarver if (e == element)
57560170faSzoecarver return index;
58560170faSzoecarver index++;
59560170faSzoecarver }
60560170faSzoecarver return -1;
61560170faSzoecarver }
62560170faSzoecarver
63560170faSzoecarver template<std::ranges::view View, class T>
removeBefore(View v,T element)64560170faSzoecarver std::ranges::view auto removeBefore(View v, T element) {
65560170faSzoecarver std::ranges::drop_view out(v, indexOf(v, element) + 1);
66560170faSzoecarver return View(out.begin(), out.end());
67560170faSzoecarver }
68560170faSzoecarver
69560170faSzoecarver template<>
70560170faSzoecarver constexpr bool std::ranges::enable_view<std::vector<int>> = true;
71560170faSzoecarver
72560170faSzoecarver template<>
73560170faSzoecarver constexpr bool std::ranges::enable_view<std::list<int>> = true;
74560170faSzoecarver
75560170faSzoecarver template<>
76560170faSzoecarver constexpr bool std::ranges::enable_view<std::string> = true;
77560170faSzoecarver
main(int,char **)78560170faSzoecarver int main(int, char**) {
79560170faSzoecarver const std::vector vec = {1,1,2,3,5,8,13};
80560170faSzoecarver assert(orderedFibonacci(std::ranges::drop_view(vec, 0)));
81560170faSzoecarver const std::vector vec2 = {1,1,2,3,5,8,14};
82560170faSzoecarver assert(!orderedFibonacci(std::ranges::drop_view(vec2, 0)));
83560170faSzoecarver
84560170faSzoecarver const std::list l = {1, 2, 3};
85560170faSzoecarver auto el = makeEven(l);
86560170faSzoecarver assert(el.size() == 2);
87560170faSzoecarver assert(*el.begin() == 2);
88560170faSzoecarver
89560170faSzoecarver const std::string s = "Hello, World";
90560170faSzoecarver assert(removeBefore(s, ' ') == "World");
91560170faSzoecarver
92560170faSzoecarver return 0;
93560170faSzoecarver }
94