| /* |
| * Copyright 2021 Google LLC. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkStringView_DEFINED |
| #define SkStringView_DEFINED |
| |
| #include <cstring> |
| #include <string_view> |
| |
| namespace skstd { |
| |
| // C++20 additions |
| inline constexpr bool starts_with(std::string_view str, std::string_view prefix) { |
| if (prefix.length() > str.length()) { |
| return false; |
| } |
| return prefix.length() == 0 || !memcmp(str.data(), prefix.data(), prefix.length()); |
| } |
| |
| inline constexpr bool starts_with(std::string_view str, std::string_view::value_type c) { |
| return !str.empty() && str.front() == c; |
| } |
| |
| inline constexpr bool ends_with(std::string_view str, std::string_view suffix) { |
| if (suffix.length() > str.length()) { |
| return false; |
| } |
| return suffix.length() == 0 || !memcmp(str.data() + str.length() - suffix.length(), |
| suffix.data(), suffix.length()); |
| } |
| |
| inline constexpr bool ends_with(std::string_view str, std::string_view::value_type c) { |
| return !str.empty() && str.back() == c; |
| } |
| |
| // C++23 additions |
| inline constexpr bool contains(std::string_view str, std::string_view needle) { |
| return str.find(needle) != std::string_view::npos; |
| } |
| |
| inline constexpr bool contains(std::string_view str, std::string_view::value_type c) { |
| return str.find(c) != std::string_view::npos; |
| } |
| |
| } // namespace skstd |
| |
| #endif |