1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 
11 // <string_view>
12 
13 //   constexpr bool starts_with(string_view x) const noexcept;
14 
15 #include <string_view>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 #include "constexpr_char_traits.h"
20 
main(int,char **)21 int main(int, char**) {
22   {
23     typedef std::string_view SV;
24     const char* s = "abcde";
25     SV sv0{};
26     SV sv1{s, 1};
27     SV sv2{s, 2};
28     SV sv3{s, 3};
29     SV sv4{s, 4};
30     SV sv5{s, 5};
31     SV svNot{"def", 3};
32 
33     ASSERT_NOEXCEPT(sv0.starts_with(sv0));
34 
35     assert(sv0.starts_with(sv0));
36     assert(!sv0.starts_with(sv1));
37 
38     assert(sv1.starts_with(sv0));
39     assert(sv1.starts_with(sv1));
40     assert(!sv1.starts_with(sv2));
41     assert(!sv1.starts_with(sv3));
42     assert(!sv1.starts_with(sv4));
43     assert(!sv1.starts_with(sv5));
44     assert(!sv1.starts_with(svNot));
45 
46     assert(sv2.starts_with(sv0));
47     assert(sv2.starts_with(sv1));
48     assert(sv2.starts_with(sv2));
49     assert(!sv2.starts_with(sv3));
50     assert(!sv2.starts_with(sv4));
51     assert(!sv2.starts_with(sv5));
52     assert(!sv2.starts_with(svNot));
53 
54     assert(svNot.starts_with(sv0));
55     assert(!svNot.starts_with(sv1));
56     assert(!svNot.starts_with(sv2));
57     assert(!svNot.starts_with(sv3));
58     assert(!svNot.starts_with(sv4));
59     assert(!svNot.starts_with(sv5));
60     assert(svNot.starts_with(svNot));
61   }
62 
63 #if TEST_STD_VER > 11
64   {
65     typedef std::basic_string_view<char, constexpr_char_traits<char>> SV;
66     constexpr const char* s = "abcde";
67     constexpr SV sv0{};
68     constexpr SV sv1{s, 1};
69     constexpr SV sv2{s, 2};
70     constexpr SV sv3{s, 3};
71     constexpr SV sv4{s, 4};
72     constexpr SV sv5{s, 5};
73     constexpr SV svNot{"def", 3};
74 
75     static_assert(sv0.starts_with(sv0), "");
76     static_assert(!sv0.starts_with(sv1), "");
77 
78     static_assert(sv1.starts_with(sv0), "");
79     static_assert(sv1.starts_with(sv1), "");
80     static_assert(!sv1.starts_with(sv2), "");
81     static_assert(!sv1.starts_with(sv3), "");
82     static_assert(!sv1.starts_with(sv4), "");
83     static_assert(!sv1.starts_with(sv5), "");
84     static_assert(!sv1.starts_with(svNot), "");
85 
86     static_assert(sv2.starts_with(sv0), "");
87     static_assert(sv2.starts_with(sv1), "");
88     static_assert(sv2.starts_with(sv2), "");
89     static_assert(!sv2.starts_with(sv3), "");
90     static_assert(!sv2.starts_with(sv4), "");
91     static_assert(!sv2.starts_with(sv5), "");
92     static_assert(!sv2.starts_with(svNot), "");
93 
94     static_assert(svNot.starts_with(sv0), "");
95     static_assert(!svNot.starts_with(sv1), "");
96     static_assert(!svNot.starts_with(sv2), "");
97     static_assert(!svNot.starts_with(sv3), "");
98     static_assert(!svNot.starts_with(sv4), "");
99     static_assert(!svNot.starts_with(sv5), "");
100     static_assert(svNot.starts_with(svNot), "");
101   }
102 #endif
103 
104   return 0;
105 }
106