match.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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,
  43. absl::string_view needle) noexcept {
  44. return haystack.find(needle, 0) != haystack.npos;
  45. }
  46. inline bool StrContains(absl::string_view haystack, char needle) noexcept {
  47. return haystack.find(needle) != haystack.npos;
  48. }
  49. // StartsWith()
  50. //
  51. // Returns whether a given string `text` begins with `prefix`.
  52. inline constexpr bool StartsWith(absl::string_view text,
  53. absl::string_view prefix) noexcept {
  54. if (prefix.empty()) {
  55. return true;
  56. }
  57. if (text.size() < prefix.size()) {
  58. return false;
  59. }
  60. absl::string_view possible_match = text.substr(0, prefix.size());
  61. return possible_match == prefix;
  62. }
  63. // EndsWith()
  64. //
  65. // Returns whether a given string `text` ends with `suffix`.
  66. inline constexpr bool EndsWith(absl::string_view text,
  67. absl::string_view suffix) noexcept {
  68. if (suffix.empty()) {
  69. return true;
  70. }
  71. if (text.size() < suffix.size()) {
  72. return false;
  73. }
  74. absl::string_view possible_match = text.substr(text.size() - suffix.size());
  75. return possible_match == suffix;
  76. }
  77. // StrContainsIgnoreCase()
  78. //
  79. // Returns whether a given ASCII string `haystack` contains the ASCII substring
  80. // `needle`, ignoring case in the comparison.
  81. bool StrContainsIgnoreCase(absl::string_view haystack,
  82. absl::string_view needle) noexcept;
  83. bool StrContainsIgnoreCase(absl::string_view haystack,
  84. char needle) noexcept;
  85. // EqualsIgnoreCase()
  86. //
  87. // Returns whether given ASCII strings `piece1` and `piece2` are equal, ignoring
  88. // case in the comparison.
  89. bool EqualsIgnoreCase(absl::string_view piece1,
  90. absl::string_view piece2) noexcept;
  91. // StartsWithIgnoreCase()
  92. //
  93. // Returns whether a given ASCII string `text` starts with `prefix`,
  94. // ignoring case in the comparison.
  95. bool StartsWithIgnoreCase(absl::string_view text,
  96. absl::string_view prefix) noexcept;
  97. // EndsWithIgnoreCase()
  98. //
  99. // Returns whether a given ASCII string `text` ends with `suffix`, ignoring
  100. // case in the comparison.
  101. bool EndsWithIgnoreCase(absl::string_view text,
  102. absl::string_view suffix) noexcept;
  103. // Yields the longest prefix in common between both input strings.
  104. // Pointer-wise, the returned result is a subset of input "a".
  105. absl::string_view FindLongestCommonPrefix(absl::string_view a,
  106. absl::string_view b);
  107. // Yields the longest suffix in common between both input strings.
  108. // Pointer-wise, the returned result is a subset of input "a".
  109. absl::string_view FindLongestCommonSuffix(absl::string_view a,
  110. absl::string_view b);
  111. ABSL_NAMESPACE_END
  112. } // namespace absl
  113. #endif // ABSL_STRINGS_MATCH_H_