1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker //
16*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
17*9356374aSAndroid Build Coastguard Worker // File: match.h
18*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
19*9356374aSAndroid Build Coastguard Worker //
20*9356374aSAndroid Build Coastguard Worker // This file contains simple utilities for performing string matching checks.
21*9356374aSAndroid Build Coastguard Worker // All of these function parameters are specified as `absl::string_view`,
22*9356374aSAndroid Build Coastguard Worker // meaning that these functions can accept `std::string`, `absl::string_view` or
23*9356374aSAndroid Build Coastguard Worker // NUL-terminated C-style strings.
24*9356374aSAndroid Build Coastguard Worker //
25*9356374aSAndroid Build Coastguard Worker // Examples:
26*9356374aSAndroid Build Coastguard Worker // std::string s = "foo";
27*9356374aSAndroid Build Coastguard Worker // absl::string_view sv = "f";
28*9356374aSAndroid Build Coastguard Worker // assert(absl::StrContains(s, sv));
29*9356374aSAndroid Build Coastguard Worker //
30*9356374aSAndroid Build Coastguard Worker // Note: The order of parameters in these functions is designed to mimic the
31*9356374aSAndroid Build Coastguard Worker // order an equivalent member function would exhibit;
32*9356374aSAndroid Build Coastguard Worker // e.g. `s.Contains(x)` ==> `absl::StrContains(s, x).
33*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_STRINGS_MATCH_H_
34*9356374aSAndroid Build Coastguard Worker #define ABSL_STRINGS_MATCH_H_
35*9356374aSAndroid Build Coastguard Worker
36*9356374aSAndroid Build Coastguard Worker #include <cstring>
37*9356374aSAndroid Build Coastguard Worker
38*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
39*9356374aSAndroid Build Coastguard Worker
40*9356374aSAndroid Build Coastguard Worker namespace absl {
41*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
42*9356374aSAndroid Build Coastguard Worker
43*9356374aSAndroid Build Coastguard Worker // StrContains()
44*9356374aSAndroid Build Coastguard Worker //
45*9356374aSAndroid Build Coastguard Worker // Returns whether a given string `haystack` contains the substring `needle`.
StrContains(absl::string_view haystack,absl::string_view needle)46*9356374aSAndroid Build Coastguard Worker inline bool StrContains(absl::string_view haystack,
47*9356374aSAndroid Build Coastguard Worker absl::string_view needle) noexcept {
48*9356374aSAndroid Build Coastguard Worker return haystack.find(needle, 0) != haystack.npos;
49*9356374aSAndroid Build Coastguard Worker }
50*9356374aSAndroid Build Coastguard Worker
StrContains(absl::string_view haystack,char needle)51*9356374aSAndroid Build Coastguard Worker inline bool StrContains(absl::string_view haystack, char needle) noexcept {
52*9356374aSAndroid Build Coastguard Worker return haystack.find(needle) != haystack.npos;
53*9356374aSAndroid Build Coastguard Worker }
54*9356374aSAndroid Build Coastguard Worker
55*9356374aSAndroid Build Coastguard Worker // StartsWith()
56*9356374aSAndroid Build Coastguard Worker //
57*9356374aSAndroid Build Coastguard Worker // Returns whether a given string `text` begins with `prefix`.
StartsWith(absl::string_view text,absl::string_view prefix)58*9356374aSAndroid Build Coastguard Worker inline bool StartsWith(absl::string_view text,
59*9356374aSAndroid Build Coastguard Worker absl::string_view prefix) noexcept {
60*9356374aSAndroid Build Coastguard Worker return prefix.empty() ||
61*9356374aSAndroid Build Coastguard Worker (text.size() >= prefix.size() &&
62*9356374aSAndroid Build Coastguard Worker memcmp(text.data(), prefix.data(), prefix.size()) == 0);
63*9356374aSAndroid Build Coastguard Worker }
64*9356374aSAndroid Build Coastguard Worker
65*9356374aSAndroid Build Coastguard Worker // EndsWith()
66*9356374aSAndroid Build Coastguard Worker //
67*9356374aSAndroid Build Coastguard Worker // Returns whether a given string `text` ends with `suffix`.
EndsWith(absl::string_view text,absl::string_view suffix)68*9356374aSAndroid Build Coastguard Worker inline bool EndsWith(absl::string_view text,
69*9356374aSAndroid Build Coastguard Worker absl::string_view suffix) noexcept {
70*9356374aSAndroid Build Coastguard Worker return suffix.empty() ||
71*9356374aSAndroid Build Coastguard Worker (text.size() >= suffix.size() &&
72*9356374aSAndroid Build Coastguard Worker memcmp(text.data() + (text.size() - suffix.size()), suffix.data(),
73*9356374aSAndroid Build Coastguard Worker suffix.size()) == 0);
74*9356374aSAndroid Build Coastguard Worker }
75*9356374aSAndroid Build Coastguard Worker // StrContainsIgnoreCase()
76*9356374aSAndroid Build Coastguard Worker //
77*9356374aSAndroid Build Coastguard Worker // Returns whether a given ASCII string `haystack` contains the ASCII substring
78*9356374aSAndroid Build Coastguard Worker // `needle`, ignoring case in the comparison.
79*9356374aSAndroid Build Coastguard Worker bool StrContainsIgnoreCase(absl::string_view haystack,
80*9356374aSAndroid Build Coastguard Worker absl::string_view needle) noexcept;
81*9356374aSAndroid Build Coastguard Worker
82*9356374aSAndroid Build Coastguard Worker bool StrContainsIgnoreCase(absl::string_view haystack,
83*9356374aSAndroid Build Coastguard Worker char needle) noexcept;
84*9356374aSAndroid Build Coastguard Worker
85*9356374aSAndroid Build Coastguard Worker // EqualsIgnoreCase()
86*9356374aSAndroid Build Coastguard Worker //
87*9356374aSAndroid Build Coastguard Worker // Returns whether given ASCII strings `piece1` and `piece2` are equal, ignoring
88*9356374aSAndroid Build Coastguard Worker // case in the comparison.
89*9356374aSAndroid Build Coastguard Worker bool EqualsIgnoreCase(absl::string_view piece1,
90*9356374aSAndroid Build Coastguard Worker absl::string_view piece2) noexcept;
91*9356374aSAndroid Build Coastguard Worker
92*9356374aSAndroid Build Coastguard Worker // StartsWithIgnoreCase()
93*9356374aSAndroid Build Coastguard Worker //
94*9356374aSAndroid Build Coastguard Worker // Returns whether a given ASCII string `text` starts with `prefix`,
95*9356374aSAndroid Build Coastguard Worker // ignoring case in the comparison.
96*9356374aSAndroid Build Coastguard Worker bool StartsWithIgnoreCase(absl::string_view text,
97*9356374aSAndroid Build Coastguard Worker absl::string_view prefix) noexcept;
98*9356374aSAndroid Build Coastguard Worker
99*9356374aSAndroid Build Coastguard Worker // EndsWithIgnoreCase()
100*9356374aSAndroid Build Coastguard Worker //
101*9356374aSAndroid Build Coastguard Worker // Returns whether a given ASCII string `text` ends with `suffix`, ignoring
102*9356374aSAndroid Build Coastguard Worker // case in the comparison.
103*9356374aSAndroid Build Coastguard Worker bool EndsWithIgnoreCase(absl::string_view text,
104*9356374aSAndroid Build Coastguard Worker absl::string_view suffix) noexcept;
105*9356374aSAndroid Build Coastguard Worker
106*9356374aSAndroid Build Coastguard Worker // Yields the longest prefix in common between both input strings.
107*9356374aSAndroid Build Coastguard Worker // Pointer-wise, the returned result is a subset of input "a".
108*9356374aSAndroid Build Coastguard Worker absl::string_view FindLongestCommonPrefix(absl::string_view a,
109*9356374aSAndroid Build Coastguard Worker absl::string_view b);
110*9356374aSAndroid Build Coastguard Worker
111*9356374aSAndroid Build Coastguard Worker // Yields the longest suffix in common between both input strings.
112*9356374aSAndroid Build Coastguard Worker // Pointer-wise, the returned result is a subset of input "a".
113*9356374aSAndroid Build Coastguard Worker absl::string_view FindLongestCommonSuffix(absl::string_view a,
114*9356374aSAndroid Build Coastguard Worker absl::string_view b);
115*9356374aSAndroid Build Coastguard Worker
116*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
117*9356374aSAndroid Build Coastguard Worker } // namespace absl
118*9356374aSAndroid Build Coastguard Worker
119*9356374aSAndroid Build Coastguard Worker #endif // ABSL_STRINGS_MATCH_H_
120