1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_I18N_STRING_SEARCH_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_I18N_STRING_SEARCH_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/i18n/base_i18n_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker struct UStringSearch; 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace base { 18*6777b538SAndroid Build Coastguard Worker namespace i18n { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // Returns true if |in_this| contains |find_this|. If |match_index| or 21*6777b538SAndroid Build Coastguard Worker // |match_length| are non-NULL, they are assigned the start position and total 22*6777b538SAndroid Build Coastguard Worker // length of the match. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // Only differences between base letters are taken into consideration. Case and 25*6777b538SAndroid Build Coastguard Worker // accent differences are ignored. Please refer to 'primary level' in 26*6777b538SAndroid Build Coastguard Worker // http://userguide.icu-project.org/collation/concepts for additional details. 27*6777b538SAndroid Build Coastguard Worker BASE_I18N_EXPORT 28*6777b538SAndroid Build Coastguard Worker bool StringSearchIgnoringCaseAndAccents(const std::u16string& find_this, 29*6777b538SAndroid Build Coastguard Worker const std::u16string& in_this, 30*6777b538SAndroid Build Coastguard Worker size_t* match_index, 31*6777b538SAndroid Build Coastguard Worker size_t* match_length); 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker // Returns true if |in_this| contains |find_this|. If |match_index| or 34*6777b538SAndroid Build Coastguard Worker // |match_length| are non-NULL, they are assigned the start position and total 35*6777b538SAndroid Build Coastguard Worker // length of the match. 36*6777b538SAndroid Build Coastguard Worker // 37*6777b538SAndroid Build Coastguard Worker // When |case_sensitive| is false, only differences between base letters are 38*6777b538SAndroid Build Coastguard Worker // taken into consideration. Case and accent differences are ignored. 39*6777b538SAndroid Build Coastguard Worker // Please refer to 'primary level' in 40*6777b538SAndroid Build Coastguard Worker // http://userguide.icu-project.org/collation/concepts for additional details. 41*6777b538SAndroid Build Coastguard Worker // When |forward_search| is true, finds the first instance of |find_this|, 42*6777b538SAndroid Build Coastguard Worker // otherwise finds the last instance 43*6777b538SAndroid Build Coastguard Worker BASE_I18N_EXPORT 44*6777b538SAndroid Build Coastguard Worker bool StringSearch(const std::u16string& find_this, 45*6777b538SAndroid Build Coastguard Worker const std::u16string& in_this, 46*6777b538SAndroid Build Coastguard Worker size_t* match_index, 47*6777b538SAndroid Build Coastguard Worker size_t* match_length, 48*6777b538SAndroid Build Coastguard Worker bool case_sensitive, 49*6777b538SAndroid Build Coastguard Worker bool forward_search); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // This class is for speeding up multiple StringSearch() 52*6777b538SAndroid Build Coastguard Worker // with the same |find_this| argument. |find_this| is passed as the constructor 53*6777b538SAndroid Build Coastguard Worker // argument, and precomputation for searching is done only at that time. 54*6777b538SAndroid Build Coastguard Worker class BASE_I18N_EXPORT FixedPatternStringSearch { 55*6777b538SAndroid Build Coastguard Worker public: 56*6777b538SAndroid Build Coastguard Worker explicit FixedPatternStringSearch(const std::u16string& find_this, 57*6777b538SAndroid Build Coastguard Worker bool case_sensitive); 58*6777b538SAndroid Build Coastguard Worker ~FixedPatternStringSearch(); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Returns true if |in_this| contains |find_this|. If |match_index| or 61*6777b538SAndroid Build Coastguard Worker // |match_length| are non-NULL, they are assigned the start position and total 62*6777b538SAndroid Build Coastguard Worker // length of the match. 63*6777b538SAndroid Build Coastguard Worker bool Search(const std::u16string& in_this, 64*6777b538SAndroid Build Coastguard Worker size_t* match_index, 65*6777b538SAndroid Build Coastguard Worker size_t* match_length, 66*6777b538SAndroid Build Coastguard Worker bool forward_search); 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker private: 69*6777b538SAndroid Build Coastguard Worker std::u16string find_this_; 70*6777b538SAndroid Build Coastguard Worker raw_ptr<UStringSearch> search_; 71*6777b538SAndroid Build Coastguard Worker }; 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker // This class is for speeding up multiple StringSearchIgnoringCaseAndAccents() 74*6777b538SAndroid Build Coastguard Worker // with the same |find_this| argument. |find_this| is passed as the constructor 75*6777b538SAndroid Build Coastguard Worker // argument, and precomputation for searching is done only at that time. 76*6777b538SAndroid Build Coastguard Worker class BASE_I18N_EXPORT FixedPatternStringSearchIgnoringCaseAndAccents { 77*6777b538SAndroid Build Coastguard Worker public: 78*6777b538SAndroid Build Coastguard Worker explicit FixedPatternStringSearchIgnoringCaseAndAccents( 79*6777b538SAndroid Build Coastguard Worker const std::u16string& find_this); 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker // Returns true if |in_this| contains |find_this|. If |match_index| or 82*6777b538SAndroid Build Coastguard Worker // |match_length| are non-NULL, they are assigned the start position and total 83*6777b538SAndroid Build Coastguard Worker // length of the match. 84*6777b538SAndroid Build Coastguard Worker bool Search(const std::u16string& in_this, 85*6777b538SAndroid Build Coastguard Worker size_t* match_index, 86*6777b538SAndroid Build Coastguard Worker size_t* match_length); 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker private: 89*6777b538SAndroid Build Coastguard Worker FixedPatternStringSearch base_search_; 90*6777b538SAndroid Build Coastguard Worker }; 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker // This class is for performing all matches of `find_this` in `in_this`. 93*6777b538SAndroid Build Coastguard Worker // `find_this` and `in_this` are passed as arguments in constructor. 94*6777b538SAndroid Build Coastguard Worker class BASE_I18N_EXPORT RepeatingStringSearch { 95*6777b538SAndroid Build Coastguard Worker public: 96*6777b538SAndroid Build Coastguard Worker RepeatingStringSearch(const std::u16string& find_this, 97*6777b538SAndroid Build Coastguard Worker const std::u16string& in_this, 98*6777b538SAndroid Build Coastguard Worker bool case_sensitive); 99*6777b538SAndroid Build Coastguard Worker ~RepeatingStringSearch(); 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker // Returns true if the next match exists. `match_index` and `match_length` are 102*6777b538SAndroid Build Coastguard Worker // assigned the start position and total length of the match. 103*6777b538SAndroid Build Coastguard Worker bool NextMatchResult(int& match_index, int& match_length); 104*6777b538SAndroid Build Coastguard Worker 105*6777b538SAndroid Build Coastguard Worker private: 106*6777b538SAndroid Build Coastguard Worker std::u16string find_this_; 107*6777b538SAndroid Build Coastguard Worker std::u16string in_this_; 108*6777b538SAndroid Build Coastguard Worker raw_ptr<UStringSearch> search_; 109*6777b538SAndroid Build Coastguard Worker }; 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker } // namespace i18n 112*6777b538SAndroid Build Coastguard Worker } // namespace base 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker #endif // BASE_I18N_STRING_SEARCH_H_ 115