bool ContainsHelper(const wchar_t *str, size_t len, bool ignorecase = false) const { if (len > m_length) return false; const wchar_t *s1, *s2, *ptr = m_ptr; if (!ignorecase) { return wcsstr(ptr, str) != NULL; } else { auto _tp_toswitch = [] (wchar_t ch) -> wchar_t { if ( ch <= L'z' ) { if ( ch <= L'Z' ) if ( ch >= L'A' ) return ch | 0x0020; if ( ch >= L'a' ) return ch ^ 0x0020; } return ch; }; auto _tp_towlower = [] (wchar_t ch) -> wchar_t { if ( ch <= L'Z' ) if ( ch >= L'A' ) return ch ^ 0x0020; return ch; }; size_t len_1 = len - 1; wchar_t *t1 = m_ptr; wchar_t *t2 = m_ptr; wchar_t *searchMax = m_last - len + 1; wchar_t strlast = _tp_towlower(str[len_1]); wchar_t w = _tp_toswitch(*str); t1 = wcschr(t1, *str); t2 = wcschr(t2, w); while ( true ) { if ( t1 && t2 ) { if ( t1 < t2 && t1 < searchMax ) { if ( _tp_towlower(t1[len_1]) == strlast ) { s1 = t1 + 1; s2 = str + 1; while (*s1 && *s2 && !(towlower(*s1) - towlower(*s2))) s1++, s2++; if ( *s2 == 0 ) return true; } t1 = wcschr(t1 + 1, *str); continue; } else if ( t2 < searchMax ) { if ( _tp_towlower(t2[len_1]) == strlast ) { s1 = t2 + 1; s2 = str + 1; while (*s1 && *s2 && !(towlower(*s1) - towlower(*s2))) s1++, s2++; if ( *s2 == 0 ) return true; } t2 = wcschr(t2 + 1, w); continue; } break; } else { if ( t1 ) { while ( t1 ) { if ( t1 > searchMax ) return false; if ( _tp_towlower(t1[len_1]) == strlast ) { s1 = t1 + 1; s2 = str + 1; while (*s1 && *s2 && !(towlower(*s1) - towlower(*s2))) s1++, s2++; if ( *s2 == 0 ) return true; } t1 = wcschr(t1 + 1, *str); } } else if ( t2 ) { while ( t2 ) { if ( t2 > searchMax ) return false; if ( _tp_towlower(t2[len_1]) == strlast ) { s1 = t2 + 1; s2 = str + 1; while (*s1 && *s2 && !(towlower(*s1) - towlower(*s2))) s1++, s2++; if ( *s2 == 0 ) return true; } t2 = wcschr(t2 + 1, w); } } break; } } return false; } return false; }
일단 생각나는데로 섞어서 구현했습니다.중복되는 부분은 최종적으로 처리할려고 다 풀어서 썼고요
이전 보단 빠르긴 한데 ...
댓글 0