|
17 | 17 | #include <__iterator/advance.h> |
18 | 18 | #include <__iterator/concepts.h> |
19 | 19 | #include <__iterator/iterator_traits.h> |
| 20 | +#include <__string/char_traits.h> |
20 | 21 | #include <__type_traits/enable_if.h> |
21 | 22 | #include <__type_traits/invoke.h> |
22 | 23 | #include <__type_traits/is_callable.h> |
| 24 | +#include <__type_traits/is_same.h> |
23 | 25 | #include <__utility/pair.h> |
24 | 26 |
|
25 | 27 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
@@ -159,6 +161,38 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_Iter1, _Iter1> __searc |
159 | 161 | return std::__search_forward_impl<_ClassicAlgPolicy>(__first1, __last1, __first2, __last2, __pred, __proj1, __proj2); |
160 | 162 | } |
161 | 163 |
|
| 164 | +template < |
| 165 | + class _Iter1, |
| 166 | + class _Sent1, |
| 167 | + class _Iter2, |
| 168 | + class _Sent2, |
| 169 | + __enable_if_t< |
| 170 | + __has_random_access_iterator_category<_Iter1>::value && __has_random_access_iterator_category<_Iter2>::value && |
| 171 | + is_same<typename iterator_traits<_Iter1>::value_type, char>::value && |
| 172 | + is_same<typename iterator_traits<_Iter2>::value_type, typename iterator_traits<_Iter2>::value_type>::value, |
| 173 | + int> = 0> |
| 174 | +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_Iter1, _Iter1> |
| 175 | +search(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2) { |
| 176 | + auto __size2 = __last2 - __first2; |
| 177 | + if (__size2 == 0) |
| 178 | + return __first1; |
| 179 | + |
| 180 | + auto __size1 = __last1 - __first1; |
| 181 | + if (__size1 < __size2) { |
| 182 | + return __last1; |
| 183 | + } |
| 184 | + using value_type = typename iterator_traits<_Iter1>::value_type; |
| 185 | + |
| 186 | + const value_type* __r = std::__search_substring(__first1, __last1, __first2, __last2); |
| 187 | + if (__r == __first1) |
| 188 | + return __first1; |
| 189 | + |
| 190 | + if (__r == __last1) |
| 191 | + return __last1; |
| 192 | + |
| 193 | + return __first1 + __r; |
| 194 | +} |
| 195 | + |
162 | 196 | template <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> |
163 | 197 | [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1 |
164 | 198 | search(_ForwardIterator1 __first1, |
|
0 commit comments