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