1e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
2e53c461bSKonstantin Varlamov //
3e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
5e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e53c461bSKonstantin Varlamov //
7e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===//
8e53c461bSKonstantin Varlamov 
9e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17
10e53c461bSKonstantin Varlamov 
11e53c461bSKonstantin Varlamov // constexpr outer-iterator::value-type outer-iterator::operator*() const;
12e53c461bSKonstantin Varlamov 
13e53c461bSKonstantin Varlamov #include <ranges>
14e53c461bSKonstantin Varlamov 
15*ae2ae84fSJoe Loser #include <algorithm>
16e53c461bSKonstantin Varlamov #include <cassert>
17*ae2ae84fSJoe Loser #include <string>
18e53c461bSKonstantin Varlamov #include <string_view>
19e53c461bSKonstantin Varlamov #include <type_traits>
20e53c461bSKonstantin Varlamov #include "../types.h"
21e53c461bSKonstantin Varlamov 
22e53c461bSKonstantin Varlamov template <class View, class Separator>
test_one(Separator sep)23e53c461bSKonstantin Varlamov constexpr void test_one(Separator sep) {
24*ae2ae84fSJoe Loser   using namespace std::string_literals;
25e53c461bSKonstantin Varlamov   using namespace std::string_view_literals;
26e53c461bSKonstantin Varlamov 
27e53c461bSKonstantin Varlamov   View v("abc def ghi"sv, sep);
28e53c461bSKonstantin Varlamov 
29e53c461bSKonstantin Varlamov   // Non-const iterator.
30e53c461bSKonstantin Varlamov   {
31e53c461bSKonstantin Varlamov     auto i = v.begin();
32e53c461bSKonstantin Varlamov     static_assert(!std::is_reference_v<decltype(*i)>);
33*ae2ae84fSJoe Loser     assert(std::ranges::equal(*i, "abc"s));
34*ae2ae84fSJoe Loser     assert(std::ranges::equal(*(++i), "def"s));
35*ae2ae84fSJoe Loser     assert(std::ranges::equal(*(++i), "ghi"s));
36e53c461bSKonstantin Varlamov   }
37e53c461bSKonstantin Varlamov 
38e53c461bSKonstantin Varlamov   // Const iterator.
39e53c461bSKonstantin Varlamov   {
40e53c461bSKonstantin Varlamov     const auto ci = v.begin();
41e53c461bSKonstantin Varlamov     static_assert(!std::is_reference_v<decltype(*ci)>);
42*ae2ae84fSJoe Loser     assert(std::ranges::equal(*ci, "abc"s));
43e53c461bSKonstantin Varlamov   }
44e53c461bSKonstantin Varlamov }
45e53c461bSKonstantin Varlamov 
test()46e53c461bSKonstantin Varlamov constexpr bool test() {
47e53c461bSKonstantin Varlamov   // `View` is a forward range.
48e53c461bSKonstantin Varlamov   test_one<SplitViewDiff>(" ");
49e53c461bSKonstantin Varlamov   test_one<SplitViewInput>(' ');
50e53c461bSKonstantin Varlamov 
51e53c461bSKonstantin Varlamov   return true;
52e53c461bSKonstantin Varlamov }
53e53c461bSKonstantin Varlamov 
main(int,char **)54e53c461bSKonstantin Varlamov int main(int, char**) {
55e53c461bSKonstantin Varlamov   test();
56e53c461bSKonstantin Varlamov   static_assert(test());
57e53c461bSKonstantin Varlamov 
58e53c461bSKonstantin Varlamov   return 0;
59e53c461bSKonstantin Varlamov }
60