xref: /aosp_15_r20/external/cronet/base/i18n/string_search.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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