| // Copyright 2021 Google LLC |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google LLC nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #ifndef COMMON_STRING_VIEW_H__ |
| #define COMMON_STRING_VIEW_H__ |
| |
| #include <cassert> |
| #include <cstring> |
| #include <ostream> |
| #include "common/using_std_string.h" |
| |
| namespace google_breakpad { |
| |
| // A StringView is a string reference to a string object, but not own the |
| // string object. It's a compatibile layer until we can use std::string_view in |
| // C++17. |
| class StringView { |
| private: |
| // The start of the string, in an external buffer. It doesn't have to be |
| // null-terminated. |
| const char* data_ = ""; |
| |
| size_t length_ = 0; |
| |
| public: |
| // Construct an empty StringView. |
| StringView() = default; |
| |
| // Disallow construct StringView from nullptr. |
| StringView(std::nullptr_t) = delete; |
| |
| // Construct a StringView from a cstring. |
| StringView(const char* str) : data_(str) { |
| assert(str); |
| length_ = strlen(str); |
| } |
| |
| // Construct a StringView from a cstring with fixed length. |
| StringView(const char* str, size_t length) : data_(str), length_(length) { |
| assert(str); |
| } |
| |
| // Construct a StringView from an std::string. |
| StringView(const string& str) : data_(str.data()), length_(str.length()) {} |
| |
| string str() const { return string(data_, length_); } |
| |
| const char* data() const { return data_; } |
| |
| bool empty() const { return length_ == 0; } |
| |
| size_t size() const { return length_; } |
| |
| int compare(StringView rhs) const { |
| size_t min_len = std::min(size(), rhs.size()); |
| int res = memcmp(data_, rhs.data(), min_len); |
| if (res != 0) |
| return res; |
| if (size() == rhs.size()) |
| return 0; |
| return size() < rhs.size() ? -1 : 1; |
| } |
| }; |
| |
| inline bool operator==(StringView lhs, StringView rhs) { |
| return lhs.compare(rhs) == 0; |
| } |
| |
| inline bool operator!=(StringView lhs, StringView rhs) { |
| return lhs.compare(rhs) != 0; |
| } |
| |
| inline bool operator<(StringView lhs, StringView rhs) { |
| return lhs.compare(rhs) < 0; |
| } |
| |
| inline bool operator>(StringView lhs, StringView rhs) { |
| return lhs.compare(rhs) > 0; |
| } |
| |
| inline std::ostream& operator<<(std::ostream& os, StringView s) { |
| os << s.str(); |
| return os; |
| } |
| |
| } // namespace google_breakpad |
| |
| #endif // COMMON_STRING_VIEW_H__ |