rfind_string_view_size.pass.cpp (6440B)
1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <string_view> 11 12 // constexpr size_type rfind(const basic_string& str, size_type pos = npos) const; 13 14 #include <string_view> 15 #include <cassert> 16 17 #include "test_macros.h" 18 #include "constexpr_char_traits.hpp" 19 20 template <class S> 21 void 22 test(const S& s, const S& str, typename S::size_type pos, typename S::size_type x) 23 { 24 assert(s.rfind(str, pos) == x); 25 if (x != S::npos) 26 assert(x <= pos && x + str.size() <= s.size()); 27 } 28 29 template <class S> 30 void 31 test(const S& s, const S& str, typename S::size_type x) 32 { 33 assert(s.rfind(str) == x); 34 if (x != S::npos) 35 assert(0 <= x && x + str.size() <= s.size()); 36 } 37 38 template <class S> 39 void test0() 40 { 41 test(S(""), S(""), 0, 0); 42 test(S(""), S("abcde"), 0, S::npos); 43 test(S(""), S("abcdeabcde"), 0, S::npos); 44 test(S(""), S("abcdeabcdeabcdeabcde"), 0, S::npos); 45 test(S(""), S(""), 1, 0); 46 test(S(""), S("abcde"), 1, S::npos); 47 test(S(""), S("abcdeabcde"), 1, S::npos); 48 test(S(""), S("abcdeabcdeabcdeabcde"), 1, S::npos); 49 test(S("abcde"), S(""), 0, 0); 50 test(S("abcde"), S("abcde"), 0, 0); 51 test(S("abcde"), S("abcdeabcde"), 0, S::npos); 52 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 0, S::npos); 53 test(S("abcde"), S(""), 1, 1); 54 test(S("abcde"), S("abcde"), 1, 0); 55 test(S("abcde"), S("abcdeabcde"), 1, S::npos); 56 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 1, S::npos); 57 test(S("abcde"), S(""), 2, 2); 58 test(S("abcde"), S("abcde"), 2, 0); 59 test(S("abcde"), S("abcdeabcde"), 2, S::npos); 60 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 2, S::npos); 61 test(S("abcde"), S(""), 4, 4); 62 test(S("abcde"), S("abcde"), 4, 0); 63 test(S("abcde"), S("abcdeabcde"), 4, S::npos); 64 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 4, S::npos); 65 test(S("abcde"), S(""), 5, 5); 66 test(S("abcde"), S("abcde"), 5, 0); 67 test(S("abcde"), S("abcdeabcde"), 5, S::npos); 68 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 5, S::npos); 69 test(S("abcde"), S(""), 6, 5); 70 test(S("abcde"), S("abcde"), 6, 0); 71 test(S("abcde"), S("abcdeabcde"), 6, S::npos); 72 test(S("abcde"), S("abcdeabcdeabcdeabcde"), 6, S::npos); 73 test(S("abcdeabcde"), S(""), 0, 0); 74 test(S("abcdeabcde"), S("abcde"), 0, 0); 75 test(S("abcdeabcde"), S("abcdeabcde"), 0, 0); 76 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 0, S::npos); 77 test(S("abcdeabcde"), S(""), 1, 1); 78 test(S("abcdeabcde"), S("abcde"), 1, 0); 79 test(S("abcdeabcde"), S("abcdeabcde"), 1, 0); 80 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 1, S::npos); 81 test(S("abcdeabcde"), S(""), 5, 5); 82 test(S("abcdeabcde"), S("abcde"), 5, 5); 83 test(S("abcdeabcde"), S("abcdeabcde"), 5, 0); 84 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 5, S::npos); 85 test(S("abcdeabcde"), S(""), 9, 9); 86 test(S("abcdeabcde"), S("abcde"), 9, 5); 87 test(S("abcdeabcde"), S("abcdeabcde"), 9, 0); 88 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 9, S::npos); 89 test(S("abcdeabcde"), S(""), 10, 10); 90 test(S("abcdeabcde"), S("abcde"), 10, 5); 91 test(S("abcdeabcde"), S("abcdeabcde"), 10, 0); 92 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 10, S::npos); 93 test(S("abcdeabcde"), S(""), 11, 10); 94 test(S("abcdeabcde"), S("abcde"), 11, 5); 95 test(S("abcdeabcde"), S("abcdeabcde"), 11, 0); 96 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), 11, S::npos); 97 test(S("abcdeabcdeabcdeabcde"), S(""), 0, 0); 98 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 0, 0); 99 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 0, 0); 100 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 0, 0); 101 test(S("abcdeabcdeabcdeabcde"), S(""), 1, 1); 102 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 1, 0); 103 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 1, 0); 104 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 1, 0); 105 test(S("abcdeabcdeabcdeabcde"), S(""), 10, 10); 106 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 10, 10); 107 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 10, 10); 108 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 10, 0); 109 test(S("abcdeabcdeabcdeabcde"), S(""), 19, 19); 110 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 19, 15); 111 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 19, 10); 112 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 19, 0); 113 test(S("abcdeabcdeabcdeabcde"), S(""), 20, 20); 114 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 20, 15); 115 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 20, 10); 116 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 20, 0); 117 test(S("abcdeabcdeabcdeabcde"), S(""), 21, 20); 118 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 21, 15); 119 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 21, 10); 120 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 21, 0); 121 } 122 123 template <class S> 124 void test1() 125 { 126 test(S(""), S(""), 0); 127 test(S(""), S("abcde"), S::npos); 128 test(S(""), S("abcdeabcde"), S::npos); 129 test(S(""), S("abcdeabcdeabcdeabcde"), S::npos); 130 test(S("abcde"), S(""), 5); 131 test(S("abcde"), S("abcde"), 0); 132 test(S("abcde"), S("abcdeabcde"), S::npos); 133 test(S("abcde"), S("abcdeabcdeabcdeabcde"), S::npos); 134 test(S("abcdeabcde"), S(""), 10); 135 test(S("abcdeabcde"), S("abcde"), 5); 136 test(S("abcdeabcde"), S("abcdeabcde"), 0); 137 test(S("abcdeabcde"), S("abcdeabcdeabcdeabcde"), S::npos); 138 test(S("abcdeabcdeabcdeabcde"), S(""), 20); 139 test(S("abcdeabcdeabcdeabcde"), S("abcde"), 15); 140 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcde"), 10); 141 test(S("abcdeabcdeabcdeabcde"), S("abcdeabcdeabcdeabcde"), 0); 142 } 143 144 int main() 145 { 146 { 147 typedef std::string_view S; 148 test0<S>(); 149 test1<S>(); 150 } 151 152 #if TEST_STD_VER > 11 153 { 154 typedef std::basic_string_view<char, constexpr_char_traits<char>> SV; 155 constexpr SV sv1; 156 constexpr SV sv2 { "abcde", 5 }; 157 158 static_assert (sv1.rfind(sv1) == 0, "" ); 159 static_assert (sv1.rfind(sv2) == SV::npos, "" ); 160 static_assert (sv2.rfind(sv1) == 5, "" ); 161 static_assert (sv2.rfind(sv2) == 0, "" ); 162 static_assert (sv2.rfind(sv2, 1) == 0, "" ); 163 } 164 #endif 165 }