xref: /llvm-project/libcxx/test/std/strings/basic.string/string.ops/string_find/pointer_size.pass.cpp (revision 6e1dcc9335116f650d68cdbed12bbb34a99b2d9b)
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 // <string>
10 
11 // size_type find(const charT* s, size_type pos = 0) const; // constexpr since C++20
12 
13 #include <string>
14 #include <cassert>
15 
16 #include "test_macros.h"
17 #include "min_allocator.h"
18 
19 template <class S>
20 TEST_CONSTEXPR_CXX20 void
test(const S & s,const typename S::value_type * str,typename S::size_type pos,typename S::size_type x)21 test(const S& s, const typename S::value_type* str, typename S::size_type pos, typename S::size_type x) {
22   LIBCPP_ASSERT_NOEXCEPT(s.find(str, pos));
23   assert(s.find(str, pos) == x);
24   if (x != S::npos) {
25     typename S::size_type n = S::traits_type::length(str);
26     assert(pos <= x && x + n <= s.size());
27   }
28 }
29 
30 template <class S>
test(const S & s,const typename S::value_type * str,typename S::size_type x)31 TEST_CONSTEXPR_CXX20 void test(const S& s, const typename S::value_type* str, typename S::size_type x) {
32   LIBCPP_ASSERT_NOEXCEPT(s.find(str));
33   assert(s.find(str) == x);
34   if (x != S::npos) {
35     typename S::size_type n = S::traits_type::length(str);
36     assert(0 <= x && x + n <= s.size());
37   }
38 }
39 
40 template <class S>
test0()41 TEST_CONSTEXPR_CXX20 void test0() {
42   test(S(""), "", 0, 0);
43   test(S(""), "abcde", 0, S::npos);
44   test(S(""), "abcdeabcde", 0, S::npos);
45   test(S(""), "abcdeabcdeabcdeabcde", 0, S::npos);
46   test(S(""), "", 1, S::npos);
47   test(S(""), "abcde", 1, S::npos);
48   test(S(""), "abcdeabcde", 1, S::npos);
49   test(S(""), "abcdeabcdeabcdeabcde", 1, S::npos);
50   test(S("abcde"), "", 0, 0);
51   test(S("abcde"), "abcde", 0, 0);
52   test(S("abcde"), "abcdeabcde", 0, S::npos);
53   test(S("abcde"), "abcdeabcdeabcdeabcde", 0, S::npos);
54   test(S("abcde"), "", 1, 1);
55   test(S("abcde"), "abcde", 1, S::npos);
56   test(S("abcde"), "abcdeabcde", 1, S::npos);
57   test(S("abcde"), "abcdeabcdeabcdeabcde", 1, S::npos);
58   test(S("abcde"), "", 2, 2);
59   test(S("abcde"), "abcde", 2, S::npos);
60   test(S("abcde"), "abcdeabcde", 2, S::npos);
61   test(S("abcde"), "abcdeabcdeabcdeabcde", 2, S::npos);
62   test(S("abcde"), "", 4, 4);
63   test(S("abcde"), "abcde", 4, S::npos);
64   test(S("abcde"), "abcdeabcde", 4, S::npos);
65   test(S("abcde"), "abcdeabcdeabcdeabcde", 4, S::npos);
66   test(S("abcde"), "", 5, 5);
67   test(S("abcde"), "abcde", 5, S::npos);
68   test(S("abcde"), "abcdeabcde", 5, S::npos);
69   test(S("abcde"), "abcdeabcdeabcdeabcde", 5, S::npos);
70   test(S("abcde"), "", 6, S::npos);
71   test(S("abcde"), "abcde", 6, S::npos);
72   test(S("abcde"), "abcdeabcde", 6, S::npos);
73   test(S("abcde"), "abcdeabcdeabcdeabcde", 6, S::npos);
74   test(S("abcdeabcde"), "", 0, 0);
75   test(S("abcdeabcde"), "abcde", 0, 0);
76   test(S("abcdeabcde"), "abcdeabcde", 0, 0);
77   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 0, S::npos);
78   test(S("abcdeabcde"), "", 1, 1);
79   test(S("abcdeabcde"), "abcde", 1, 5);
80   test(S("abcdeabcde"), "abcdeabcde", 1, S::npos);
81   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 1, S::npos);
82   test(S("abcdeabcde"), "", 5, 5);
83   test(S("abcdeabcde"), "abcde", 5, 5);
84   test(S("abcdeabcde"), "abcdeabcde", 5, S::npos);
85   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 5, S::npos);
86   test(S("abcdeabcde"), "", 9, 9);
87   test(S("abcdeabcde"), "abcde", 9, S::npos);
88   test(S("abcdeabcde"), "abcdeabcde", 9, S::npos);
89   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 9, S::npos);
90   test(S("abcdeabcde"), "", 10, 10);
91   test(S("abcdeabcde"), "abcde", 10, S::npos);
92   test(S("abcdeabcde"), "abcdeabcde", 10, S::npos);
93   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 10, S::npos);
94   test(S("abcdeabcde"), "", 11, S::npos);
95   test(S("abcdeabcde"), "abcde", 11, S::npos);
96   test(S("abcdeabcde"), "abcdeabcde", 11, S::npos);
97   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", 11, S::npos);
98   test(S("abcdeabcdeabcdeabcde"), "", 0, 0);
99   test(S("abcdeabcdeabcdeabcde"), "abcde", 0, 0);
100   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0, 0);
101   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0, 0);
102   test(S("abcdeabcdeabcdeabcde"), "", 1, 1);
103   test(S("abcdeabcdeabcdeabcde"), "abcde", 1, 5);
104   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 1, 5);
105   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 1, S::npos);
106   test(S("abcdeabcdeabcdeabcde"), "", 10, 10);
107   test(S("abcdeabcdeabcdeabcde"), "abcde", 10, 10);
108   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 10, 10);
109   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 10, S::npos);
110   test(S("abcdeabcdeabcdeabcde"), "", 19, 19);
111   test(S("abcdeabcdeabcdeabcde"), "abcde", 19, S::npos);
112   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 19, S::npos);
113   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 19, S::npos);
114   test(S("abcdeabcdeabcdeabcde"), "", 20, 20);
115   test(S("abcdeabcdeabcdeabcde"), "abcde", 20, S::npos);
116   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 20, S::npos);
117   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 20, S::npos);
118   test(S("abcdeabcdeabcdeabcde"), "", 21, S::npos);
119   test(S("abcdeabcdeabcdeabcde"), "abcde", 21, S::npos);
120   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 21, S::npos);
121   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 21, S::npos);
122 }
123 
124 template <class S>
test1()125 TEST_CONSTEXPR_CXX20 void test1() {
126   test(S(""), "", 0);
127   test(S(""), "abcde", S::npos);
128   test(S(""), "abcdeabcde", S::npos);
129   test(S(""), "abcdeabcdeabcdeabcde", S::npos);
130   test(S("abcde"), "", 0);
131   test(S("abcde"), "abcde", 0);
132   test(S("abcde"), "abcdeabcde", S::npos);
133   test(S("abcde"), "abcdeabcdeabcdeabcde", S::npos);
134   test(S("abcdeabcde"), "", 0);
135   test(S("abcdeabcde"), "abcde", 0);
136   test(S("abcdeabcde"), "abcdeabcde", 0);
137   test(S("abcdeabcde"), "abcdeabcdeabcdeabcde", S::npos);
138   test(S("abcdeabcdeabcdeabcde"), "", 0);
139   test(S("abcdeabcdeabcdeabcde"), "abcde", 0);
140   test(S("abcdeabcdeabcdeabcde"), "abcdeabcde", 0);
141   test(S("abcdeabcdeabcdeabcde"), "abcdeabcdeabcdeabcde", 0);
142 }
143 
144 template <class S>
test_string()145 TEST_CONSTEXPR_CXX20 void test_string() {
146   test0<S>();
147   test1<S>();
148 }
149 
test()150 TEST_CONSTEXPR_CXX20 bool test() {
151   test_string<std::string>();
152 #if TEST_STD_VER >= 11
153   test_string<std::basic_string<char, std::char_traits<char>, min_allocator<char> > >();
154 #endif
155 
156   return true;
157 }
158 
main(int,char **)159 int main(int, char**) {
160   test();
161 #if TEST_STD_VER > 17
162   static_assert(test());
163 #endif
164 
165   return 0;
166 }
167