match.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #include <cstring>
  36. #include "absl/strings/string_view.h"
  37. namespace absl {
  38. ABSL_NAMESPACE_BEGIN
  39. // StrContains()
  40. //
  41. // Returns whether a given string `haystack` contains the substring `needle`.
  42. inline bool StrContains(absl::string_view haystack, absl::string_view needle) {
  43. return haystack.find(needle, 0) != haystack.npos;
  44. }
  45. // StartsWith()
  46. //
  47. // Returns whether a given string `text` begins with `prefix`.
  48. inline bool StartsWith(absl::string_view text, absl::string_view prefix) {
  49. return prefix.empty() ||
  50. (text.size() >= prefix.size() &&
  51. memcmp(text.data(), prefix.data(), prefix.size()) == 0);
  52. }
  53. // EndsWith()
  54. //
  55. // Returns whether a given string `text` ends with `suffix`.
  56. inline bool EndsWith(absl::string_view text, absl::string_view suffix) {
  57. return suffix.empty() ||
  58. (text.size() >= suffix.size() &&
  59. memcmp(text.data() + (text.size() - suffix.size()), suffix.data(),
  60. suffix.size()) == 0);
  61. }
  62. // EqualsIgnoreCase()
  63. //
  64. // Returns whether given ASCII strings `piece1` and `piece2` are equal, ignoring
  65. // case in the comparison.
  66. bool EqualsIgnoreCase(absl::string_view piece1, absl::string_view piece2);
  67. // StartsWithIgnoreCase()
  68. //
  69. // Returns whether a given ASCII string `text` starts with `prefix`,
  70. // ignoring case in the comparison.
  71. bool StartsWithIgnoreCase(absl::string_view text, absl::string_view prefix);
  72. // EndsWithIgnoreCase()
  73. //
  74. // Returns whether a given ASCII string `text` ends with `suffix`, ignoring
  75. // case in the comparison.
  76. bool EndsWithIgnoreCase(absl::string_view text, absl::string_view suffix);
  77. ABSL_NAMESPACE_END
  78. } // namespace absl
  79. #endif // ABSL_STRINGS_MATCH_H_