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