1717#include < __iterator/advance.h>
1818#include < __iterator/concepts.h>
1919#include < __iterator/iterator_traits.h>
20+ #include < __string/char_traits.h>
2021#include < __type_traits/enable_if.h>
2122#include < __type_traits/invoke.h>
2223#include < __type_traits/is_callable.h>
24+ #include < __type_traits/is_same.h>
2325#include < __utility/pair.h>
2426
2527#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -159,6 +161,29 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_Iter1, _Iter1> __searc
159161 return std::__search_forward_impl<_ClassicAlgPolicy>(__first1, __last1, __first2, __last2, __pred, __proj1, __proj2);
160162}
161163
164+ template <class _ForwardIterator1 , class _ForwardIterator2 , class _CharT , class _Traits >
165+ [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator1 search_str (
166+ _ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) {
167+ auto __size2 = __last2 - __first2;
168+ if (__size2 == 0 )
169+ return __first1;
170+
171+ auto __size1 = __last1 - __first1;
172+ if (__size1 < __size2) {
173+ return __last1;
174+ }
175+ using value_type = remove_const_t <typename iterator_traits<_ForwardIterator1>::value_type>;
176+
177+ const value_type* __r = std::__search_substring<_CharT, _Traits>(__first1, __last1, __first2, __last2);
178+ if (__r == __first1)
179+ return __first1;
180+
181+ if (__r == __last1)
182+ return __last1;
183+
184+ return __r;
185+ }
186+
162187template <class _ForwardIterator1 , class _ForwardIterator2 , class _BinaryPredicate >
163188[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1
164189search (_ForwardIterator1 __first1,
@@ -175,7 +200,15 @@ search(_ForwardIterator1 __first1,
175200template <class _ForwardIterator1 , class _ForwardIterator2 >
176201[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator1
177202search (_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2, _ForwardIterator2 __last2) {
178- return std::search (__first1, __last1, __first2, __last2, __equal_to ());
203+ using value_type = __remove_const_t <typename iterator_traits<_ForwardIterator1>::value_type>;
204+ if constexpr (is_same<value_type, char >::value || is_same<value_type, wchar_t >::value ||
205+ is_same<value_type, char8_t >::value || is_same<value_type, char16_t >::value ||
206+ is_same<value_type, char32_t >::value) {
207+ using _CharT = value_type;
208+ using _Traits = char_traits<_CharT>;
209+ return std::search_str<_ForwardIterator1, _ForwardIterator2, _CharT, _Traits>(__first1, __last1, __first2, __last2);
210+ } else
211+ return std::search (__first1, __last1, __first2, __last2, __equal_to ());
179212}
180213
181214#if _LIBCPP_STD_VER >= 17
0 commit comments